t6963 GLCD sehr geringer Kontrast

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:

  1. GLCD scheint Codes (Befehle und Daten) korrekt zu empfangen, weil ein blinkender Cursor zu sehen ist, aber der Kontrast ist sehr, sehr gering, so dass er nur in einem dunklen Raum gesehen werden kann. Ich habe VOUT (den -15 Volt erzeugenden Pin: 18) mit einem Potentiometer verbunden und die andere Seite des Potis mit Masse verbunden, den Wischer mit VO (Pin: 4) und den Pot auf maximalen Kontrast gestellt. Ich habe es sogar versucht, indem ich VOUT direkt mit VO verbunden habe, aber der gleiche Kontrast!
  2. Der Cursor scheint an einer falschen Position zu blinken und ändert seine Position jedes Mal, wenn ich das Modul einschalte, und mit unterschiedlichen Höhen!

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

Antworten (1)

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.

Und was ist mit der Cursorposition?
Ich habe es geschafft, es zu beheben, aber es gibt ein anderes Problem: Ich kann den Bildschirm nicht löschen!