t6963 GLCD очень низкая контрастность

Я пытаюсь настроить GLCD 240x128 с драйвером t6963c ( техническое описание ). Я знаком с драйверами ks0108, но новичок в t6963. Я написал простой код только с lcd-init(), который, как я ожидаю, увидит мигание курсора. Вот проблемы:

  1. GLCD, кажется, правильно принимает коды (команды и данные), потому что мигающий курсор можно увидеть, но контрастность очень низкая, так что его можно увидеть только в темной комнате. Я подключил VOUT (производящий -15 вольт контакт: 18) к потенциометру, а другая сторона горшка подключена к земле, стеклоочиститель к VO (контакт: 4) и установил потенциометр на максимальную контрастность. Я даже пробовал, подключив VOUT напрямую к VO но тот же контраст!
  2. курсор как бы мигает в неправильном положении и меняет свое положение каждый раз при включении модуля и с разной высотой!

Что мне не хватает? это проблема в моей настройке?

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);

}

и значения:

#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

Ответы (1)

Я нашел проблему. Рассеиваемая мощность модуля была выше, чем указано в техпаспорте, что приводило к падению напряжения. При использовании более мощного источника питания (LM7805 + TIP2955) контраст теперь в порядке.

А что с положением курсора?
Мне удалось это исправить, но есть другая проблема: я не могу очистить экран!