Estoy intentando configurar un GLCD 240x128 con el controlador t6963c ( hoja de datos ). Estoy familiarizado con los controladores ks0108 pero novato en t6963. He escrito un código simple con solo lcd-init () que espero ver parpadeando el cursor. Aquí están los problemas:
- Parece que GLCD recibe códigos (comandos y datos) correctamente porque se puede ver un cursor parpadeante, pero el contraste es muy bajo, por lo que solo se puede ver en una habitación oscura. He conectado VOUT (el pin de producción de -15 voltios: 18) a un potenciómetro y el otro lado de la olla está conectado al suelo, el limpiaparabrisas a VO (pin: 4) y configura la olla al máximo contraste. ¡Incluso lo probé conectando VOUT directamente a VO pero con el mismo contraste!
- el cursor parece parpadear en una posición incorrecta y cambia su posición cada vez que enciendo el módulo y con diferentes alturas.
¿Qué me estoy perdiendo? ¿Es un problema en mi configuración?
void lcd_init(void)
{
GLCD_CTRL_PORT=0xFF;
SET_FONT8x8; // all ctrl bit =1 except FS. FS=0 means font size=8x8 FS=1 fontsize=6x8
GLCD_CTRL_DDR=0xFF;
GLCD_DATA_PORT=0x00;
GLCD_DATA_DDR=0xFF;
//all contorl lines high:
SET_WR;
SET_RD;
SET_CE;
SET_CD;
CLEAR_RESET;
_delay_ms(DELAY);
SET_RESET;
SET_FONT8x8;
fontSize=8;
charsPerRow=NUMBER_OF_COLUMNS/fontSize;
GLCD_WriteCommand(GRAPHICS_OFF | TEXT_OFF | CURSOR_OFF); //reset settings
GLCD_GraphicsSetup(); //set home address and area
GLCD_TextSetup(); //set home address and area
GLCD_WriteCommand(TEXT_ONLY_MODE | CGROM_MODE); //mode
GLCD_WriteCommand(GRAPHICS_ON | TEXT_ON | CURSOR_ON | CURSOR_BLINK_ON); //turn on settings
GLCD_CursorSetup();
GLCD_cursorSetXY(0,0);
}
void GLCD_TextSetup(){
GLCD_WriteDataW(TEXT_HOME);
GLCD_WriteCommand(TEXT_HOME_SET_COMMAND);
GLCD_WriteDataW(charsPerRow);
GLCD_WriteCommand(TEXT_AREA_SET_COMMAND);
}
void GLCD_GraphicsSetup(){
GLCD_WriteDataW(GRAPHICS_HOME);
GLCD_WriteCommand(GRAPHICS_HOME_SET_COMMAND);
GLCD_WriteDataW(charsPerRow);
GLCD_WriteCommand(GRAPHICS_AREA_SET_COMMAND);
}
void GLCD_CursorSetup(){
GLCD_WriteCommand(CURSOR_PATTERN | CURSOR_HEIGHT); // cursor height
GLCD_WriteDataW(CURSOR_HOME); //set cursor pointer to memory
GLCD_WriteCommand(CURSOR_HOME_SET_COMMAND);
}
void GLCD_cursorSetXY(char X,char Y){
GLCD_WriteData(X);
GLCD_WriteData(Y);
GLCD_WriteCommand(CURSOR_POSITION_SET_COMMAND);
}
unsigned char GLCD_ChceckStatus(void)
{
unsigned char lcdStatus;
GLCD_DATA_DDR = 0x00; //make it ready to accept status
SET_CD; //command
SET_WR; //no write
CLEAR_RD; //read
CLEAR_CE; //pulse on chip enable and read status
_delay_ms(DELAY);
lcdStatus = GLCD_DATA_PIN;
SET_CE; //no CE anymore
SET_RD; //no read anymore
GLCD_DATA_DDR = 0xFF;
return lcdStatus;
}
void GLCD_WriteCommand( char command)
{
while(!(GLCD_ChceckStatus()&0x03));
GLCD_DATA_PORT = command;
SET_CD;
SET_RD; // no read
CLEAR_WR; //write
PULSE_CE;
SET_WR; //no write anymore
}
void GLCD_WriteData( char data)
{
while(!(GLCD_ChceckStatus()&0x03));
CLEAR_CD; //data
GLCD_DATA_PORT = data;
SET_RD; //no read
CLEAR_WR; //write
PULSE_CE;
SET_WR; //no write anymore
SET_CD; //no data anymore
}
void GLCD_WriteDataW(int data)
{
GLCD_WriteData(data & 0XFF);
GLCD_WriteData(data>>8);
}
y los valores son:
#define GRAPHICS_OFF 0x90
#define GRAPHICS_ON 0x98
#define TEXT_OFF 0x90
#define TEXT_ON 0x94
#define CURSOR_OFF 0x90
#define CURSOR_ON 0x92
#define CURSOR_BLINK_OFF 0x90
#define CURSOR_BLINK_ON 0x91
#define CURSOR_PATTERN 0xA0
#define TEXT_HOME_SET_COMMAND 0x40
#define TEXT_AREA_SET_COMMAND 0x41
#define GRAPHICS_HOME_SET_COMMAND 0x42
#define GRAPHICS_AREA_SET_COMMAND 0x43
#define CURSOR_HOME_SET_COMMAND 0x24
#define CURSOR_POSITION_SET_COMMAND 0x21
#define CGROM_MODE 0x80
#define CGRAM_MODE 0x88
#define EXOR_MODE 0x81
#define OR_MODE 0x80
#define AND_MODE 0x83
#define TEXT_ONLY_MODE 0x84