Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: инициализация графического LCD
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
goodking
Привет! Не проходит инициализация ЖКИ, подскажите, в чем ошибка, или посоветуйте пример, т.к. перепробовал уже несколько различных вариантов, но кроме мусора на экране ничего не получается
мк SiLabs c8051F120
LCD t6963c

CODE
#include "c8051F120.h"

#define DATA P4

#define BUSY P4&0x03

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;

void 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) {};
}


void GetStatusLCD(void)
{


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

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


while(BUSY != 0x03);

CE = 1;
CD = 1;
WR = 1;
RD = 1;
delay(50);
}


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;
GetStatusLCD();
RST=1;

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

GetStatusLCD();
Send8LCD(0,0x24);
GetStatusLCD();
Send8LCD(1,0xc0);
GetStatusLCD();
Send8LCD(0,0x25);
GetStatusLCD();
Send8LCD(1,0xc0);
GetStatusLCD();
Send8LCD(0,0x2e);
GetStatusLCD();
Send8LCD(1,0xc0);
GetStatusLCD();
Send8LCD(1,0x9c);

}
rezident
Запись типа sbit WR=P2^0; из какого языка/компилятора?
zltigo
Цитата(rezident @ Mar 11 2010, 21:21) *
Запись типа sbit WR=P2^0; из какого языка/компилятора?

А какая разница? Кто-то будет вычитывать весе это обильное нагромождение букв, цифр и символов в котором сам Автор и не собирается разбираться?
Sensar
Не понятно зачем несколько прототипов функциий, и что то запутанная процедура инициализации.
Временные интервалы для каждой команды инициализации выдержены?
goodking
Цитата(rezident @ Mar 11 2010, 22:21) *
Запись типа sbit WR=P2^0; из какого языка/компилятора?

Описание sbit
goodking
Извиняюсь, в предыдущем коде я неверно указал опрос флагов готовности, и как я догадываюсь, в них вся проблема,

правильно так
Код
char GetStatusLCD(void)
{


char i;
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;


}


тогда инициализация будет выглядеть так:
Код
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);

}
почему-то программа зависает на первой же проверке статуса, с чем это может быть связано??
-JonnS-
2 goodking
В вашем коде не видна продедура инициализации МК. Правильно ли настроены порты MK? Crossbar включен? Раз пишете, потом читаете с порт P4 (DATA) надо менять настройки порта, на вход(выход).
Чтоб легхче сделать инициализацию МК лучше использовать Config Wizard с сайта производителя.
В проект правильно ли указана частота на кот. работает МК?
zltigo
Цитата(-JonnS- @ Mar 15 2010, 18:03) *
Чтоб легхче сделать инициализацию МК лучше использовать Config Wizard с сайта производителя.

Упаси бог, еще добавить к имеющемуся еще и мусор от волшебника sad.gif
-JonnS-
Тоже его ловил в ошибках. Ползовался в самом начале проекта, как бы сгенерировать "рыбу", потом перепроверял ВСЕ что сгенерил волшебник. Помощ в основном, чтоб не забыть проинициализировать что небуть. laughing.gif
goodking
Цитата(-JonnS- @ Mar 15 2010, 18:03) *
2 goodking
В вашем коде не видна продедура инициализации МК. Правильно ли настроены порты MK? Crossbar включен? Раз пишете, потом читаете с порт P4 (DATA) надо менять настройки порта, на вход(выход).
Чтоб легхче сделать инициализацию МК лучше использовать Config Wizard с сайта производителя.
В проект правильно ли указана частота на кот. работает МК?

Показана в самом начале темы! Порты настроены (push-pull)
Код
    P2MDOUT   = 0xFF;
    P4MDOUT   = 0xFF;
, crossbar включен
Код
XBR2 = 0x40;
! С флагами разобрался, не проходит инициализация, во всех примерах указано почему-то по разному.
rezident
Цитата(goodking @ Mar 15 2010, 20:29) *
во всех примерах указано почему-то по разному.
Поэтому нужно писать работу с периферией самому, своими ручками, осмысленно и на основе чтения оригинальной документации, а не пользуясь визардами или какими-то "левоватыми" примерами.
goodking
Спасибо, с инициализацией разобрался! Но такой вопрос: какой командой отключается реверс отображения. Перепробовал все режимы (OR, EXOR, AND), никакого результата- все буквы на черном фоне.
rezident
Если уж кросспостите по разным форумам, то делайте это одновременно.
Цитата
я забыл про существование ножки RV =) - silver(Вчера, 18:50)

http://caxapa.ru/186969.html
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.