Ich versuche, eine 240x128 GLCD mit t6963c-Treiber ( Datenblatt ) einzurichten. Ich bin mit ks0108-Treibern vertraut, aber Neuling in t6963. Ich habe einen einfachen Code mit nur lcd-init() geschrieben, von dem ich erwarte, dass der Cursor blinkt. Hier sind die Probleme:
Was vermisse ich? ist es ein Problem in meinem Setup?
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);
}
und die Werte sind:
#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
Ich habe das Problem gefunden. Die Verlustleistung des Moduls war höher als im Datenblatt angegeben und verursachte einen Spannungsabfall. Durch die Verwendung eines stärkeren Netzteils (LM7805 + TIP2955) ist der Kontrast jetzt ok.
Benutzer17592
Aug