Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > инициализация граф ЖКИ


Автор: goodking 12.3.2010, 14:01
Привет! Пробую инициализировать графический ЖКИ (t6963c), микроконтроллер silabs c8051F120, делаю все как указано в примере

Код


#include "c8051F120.h"

#define DATA P4

sbit WR=P2^0;

sbit RD=P2^1;

sbit CE=P2^2;

sbit CD=P2^3;

sbit RST=P2^4;

sbit FS=P2^5;

sbit RV=P2^6;

char GetStatusLCD(void);
void LcdInit (void);
void Send8LCD(unsigned char cmd, unsigned char bt);
void LcdInit(void);
void delay(unsigned int i);
int a;

void main (void)

{   WDTCN     = 0xDE;
    WDTCN     = 0xAD;
    SFRPAGE   = CONFIG_PAGE;

    P2MDOUT   = 0xFF;
    P4MDOUT   = 0xFF;
    XBR2      = 0x40;

    LcdInit();
    
   



while (1) {};
}


char GetStatusLCD(void)
{

 
char i;
P4MDOUT   = 0x00;
i=0;
CD=1;
WR=1;
CE=0;
RD=0;

for (a=0;a<2;a++);//Задержка

i=DATA;

WR=1;
RD=1;
CE=1;
CD=1;

for (a=0;a<2;a++);//Задержка
return i;
 P4MDOUT   = 0xFF;
}


void delay(unsigned int i)
     {
       while ( i--!=0);
     }



void Send8LCD(unsigned char cmd, unsigned char bt)
{
char i;

if (cmd)
CD=1;
else
CD=0; 

for (i=0;i<2;i++);

CE=0;
WR=0;
DATA=bt;

for (i=0;i<2;i++);

CE=1;
WR=1;
CD=1;
}



void LcdInit()
{
delay(1000);
RST=0;
delay(100);
RST=1;

Send8LCD(1,0x80);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);//graphic home
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0x42);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x28);//graphic ar
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0x43);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);//text home
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x17);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0x40);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x28);//text ar
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0x41);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x17);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0x24);

while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x24);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0xc0);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x25);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0xc0);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x2e);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0xc0);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0x9c);

}  

 почему -то не опрашиваются флаги готовности (GetStatusLCD()) , программа зависает уже на первом. Посоветуйте, в чем может быть проблема?? 

Автор: xvr 12.3.2010, 15:00
Для начала - строки
Код

return i;
 P4MDOUT   = 0xFF;
в GetStatusLCD переставь местами

Автор: goodking 12.3.2010, 15:07
Цитата(xvr @ 12.3.2010,  15:00)
Для начала - строки
Код

return i;
 P4MDOUT   = 0xFF;
в GetStatusLCD переставь местами

Переставил, ничего не изменилось! Почему -то эти два бита вообще никогда не устанавливаются  smile 

Автор: xvr 12.3.2010, 19:13
Переставь местами 
Код

CE=0;
RD=0;
там же.

Добавь явную настройку уровней управляющих сигналов LCD в начало Init

Не уверен, что твои задержки (на циклах) будут что то задерживать - компилятор их может выкинуть

В Send8LCD последовательность
Код

CE=0;
WR=0;
DATA=bt;
поменяй на
Код

DATA=bt;
WR=0;
CE=0;


Посмотри осцилографом, что вообще читается с LCD

Автор: goodking 13.3.2010, 10:43
сделал все, как ты советовал, и еще, как увидел одном примере, перед опросом флагов на шину данных выставил сигнал 0xFF
Код

char GetStatusLCD(void)
{
char i;


DATA=0xff;
CD=1;
WR=1;
RD=0;
CE=0;




for (a=0;a<2;a++);//Задержка


i=DATA;

WR=1;
RD=1;
CE=1;
CD=1;

for (a=0;a<2;a++);//Задержка

return i;

}



теперь после инициализации на экране появляются всякие разные узоры   smile , линии и т.д. правильно ли это? 

Код

void LcdInit()
{
CE=1;
RST=1;
CD=1;
RD=1;
WR=1;
RST=0;
delay(10000);
RST=1;
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);
while ((GetStatusLCD()&0x03)!=0x03);//Text Home Address
Send8LCD(1,0x40);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x40);
while ((GetStatusLCD()&0x03)!=0x03);//Graphic Home Address
Send8LCD(1,0x42);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x40);
while ((GetStatusLCD()&0x03)!=0x03);//Text Area
Send8LCD(1,0x41);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x40);
while ((GetStatusLCD()&0x03)!=0x03);//Graphic Area
Send8LCD(1,0x43);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0x83);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0x9f);
}  


Автор: xvr 13.3.2010, 16:37
Цитата

теперь после инициализации на экране появляются всякие разные узоры , линии и т.д. правильно ли это? 
Наверное правильно  smile 

Автор: goodking 15.3.2010, 12:15
Но почему-то, когда пытаюсь вывести на экран какую-то надпись, экран снова полностью закрашивается smile   

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)