Estoy intentando escribir un controlador para conducir GLCD 128x64. Pero todo lo que hice, no funciona. Pongo el código de abajo. ¿Qué está mal?.
editar Puedo escribir algunos caracteres, pero aparecieron píxeles aleatorios en la pantalla LCD. Estos píxeles vienen con el comando DISPLAY ON.
Archivo.h siguiente ( editado )
#define RS_DI GPIO_Pin_0
#define RW GPIO_Pin_1
#define En GPIO_Pin_2
#define DB0 GPIO_Pin_3
#define DB1 GPIO_Pin_4
#define DB2 GPIO_Pin_5
#define DB3 GPIO_Pin_6
#define DB4 GPIO_Pin_7
#define DB5 GPIO_Pin_8
#define DB6 GPIO_Pin_9
#define DB7 GPIO_Pin_10
#define CS1 GPIO_Pin_11
#define CS2 GPIO_Pin_12
#define RST GPIO_Pin_13
#define DB_ALL_MASK (uint16_t)0x07F8
#define GLCD_DISPLAY_ON (uint8_t)0x3F
#define GLCD_DISPLAY_OFF(uint8_t) 0x3E
#define GLCD_SET_LINE_1 (uint8_t)0xB8
#define GLCD_SET_LINE_2 (uint8_t)0xB9
#define GLCD_SET_LINE_3 (uint8_t)0xBA
#define GLCD_SET_LINE_4 (uint8_t)0xBB
#define GLCD_SET_LINE_5 (uint8_t)0xBC
#define GLCD_SET_LINE_6 (uint8_t)0xBD
#define GLCD_SET_LINE_7 (uint8_t)0xBE
#define GLCD_SET_LINE_8 (uint8_t)0xBF
#define GLCD_SET_CURS_POS_0 (uint8_t)0x40
#define GLCD_SET_START_POS_0 (uint8_t)0xC0
typedef enum
{
Page1 = 0x00 ,
Page2 ,
PageBothSelect ,
PageBothUnselect
}PageSelect;
void InitGLCDPort(GPIOSelect GS);
void WriteCmdGLCD(uint8_t cmd);
void WriteDataGLCD(uint8_t Data);
void WriteCharGLCD(char *chr);
void WriteStringGLCD(char *str);
void WriteImageGLCD(char *pxl);
void PageSelectGLCD(PageSelect PS);
void SetCursorGLCD(uint8_t x,uint8_t y);
.c archivo siguiente ( editado )
#include "_MyGraphLCD.h"
static GPIO_TypeDef* GPIOx;
// Private function declaretion
extern void delay_clk_cycle(unsigned int delay);
extern void SendByte(uint8_t Byte);
void InitGLCDPort(GPIOSelect GS)
{
InitGPIO( GS,
GPIO_Mode_OUT,
GPIO_OType_PP,
GPIO_Speed_2MHz,
GPIO_PuPd_NOPULL,
GPIO_Pin_All);
switch(GS){
case sGPIOA: GPIOx = GPIOA; break;
case sGPIOB: GPIOx = GPIOB; break;
case sGPIOC: GPIOx = GPIOC; break;
case sGPIOD: GPIOx = GPIOD; break;
case sGPIOE: GPIOx = GPIOE; break;
case sGPIOF: GPIOx = GPIOF; break;
case sGPIOG: GPIOx = GPIOG; break;
case sGPIOH: GPIOx = GPIOH; break;
case sGPIOI: GPIOx = GPIOI; break;
case sGPIOJ: GPIOx = GPIOJ; break;
case sGPIOK: GPIOx = GPIOK; break;}
GPIO_ResetBits(GPIOx,RST);
delay_clk_cycle(1798562);
GPIO_SetBits(GPIOx,RST);
delay_clk_cycle(179857);
PageSelectGLCD(PageBothSelect);
delay_clk_cycle(179857);
WriteCmdGLCD(GLCD_DISPLAY_ON);
WriteCmdGLCD(GLCD_SET_START_POS_0);
delay_clk_cycle(179857);
PageSelectGLCD(PageBothUnselect);
delay_clk_cycle(179857);
}
void WriteCmdGLCD(uint8_t cmd)
{
SendByte(cmd);
GPIOx->ODR &= ~(RS_DI);
GPIOx->ODR &= ~(RW);
GPIOx->ODR |= En;
delay_clk_cycle(179857);
GPIOx->ODR &= ~(En);
delay_clk_cycle(20);
}
void WriteDataGLCD(uint8_t Data)
{
SendByte(Data);
GPIOx->ODR |= RS_DI;
GPIOx->ODR &= ~(RW);
GPIOx->ODR |= En;
delay_clk_cycle(179857);
GPIOx->ODR &= ~(En);
delay_clk_cycle(20);
}
void PageSelectGLCD(PageSelect PS)
{
switch(PS)
{
case Page1:
GPIOx->ODR |= (CS1);
GPIOx->ODR &= ~(CS2);
break;
case Page2:
GPIOx->ODR &= ~(CS1);
GPIOx->ODR |= (CS2);
break;
case PageBothSelect:
GPIOx->ODR |= (CS1);
GPIOx->ODR |= (CS2);
break;
case PageBothUnselect:
GPIOx->ODR &= ~(CS1);
GPIOx->ODR &= ~(CS2);
break;
}
}
void WriteCharGLCD(char *chr)
{
volatile register uint8_t i;
SetCursorGLCD(0,0);
for(i=0;i<5;i++)
{
WriteDataGLCD(*(chr+i));
}
}
void WriteStringGLCD(char *str)
{
}
void WriteImageGLCD(char *pxl)
{
}
void SetCursorGLCD(uint8_t x,uint8_t y)
{
WriteCmdGLCD(GLCD_SET_LINE_1+x);
WriteCmdGLCD(GLCD_SET_CURS_POS_0+y);
}
// Private function
void delay_clk_cycle(unsigned int delay)
{
volatile register int i;
for(i=0;i<delay;i++)
{
__NOP();
}
}
void SendByte(uint8_t Data)
{
GPIOx->ODR &= ~(0x00FF<<3);
GPIOx->ODR |= Data<<3;
}