|
|
  |
инициализация графического LCD |
|
|
|
Mar 11 2010, 12:55
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 21-12-09
Пользователь №: 54 383

|
Привет! Не проходит инициализация ЖКИ, подскажите, в чем ошибка, или посоветуйте пример, т.к. перепробовал уже несколько различных вариантов, но кроме мусора на экране ничего не получается мк 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);
}
|
|
|
|
|
Mar 11 2010, 23:10
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 18-02-09
Пользователь №: 45 052

|
Не понятно зачем несколько прототипов функциий, и что то запутанная процедура инициализации. Временные интервалы для каждой команды инициализации выдержены?
Сообщение отредактировал rezident - Mar 12 2010, 03:58
Причина редактирования: Дурацкое цитирование.
|
|
|
|
|
Mar 12 2010, 07:25
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 21-12-09
Пользователь №: 54 383

|
Цитата(rezident @ Mar 11 2010, 22:21)  Запись типа sbit WR=P2^0; из какого языка/компилятора? Описание sbit
Сообщение отредактировал zltigo - Mar 12 2010, 13:56
Причина редактирования: Убрано повторное!!! самоцитирование мутного исзодника
|
|
|
|
|
Mar 12 2010, 10:56
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 21-12-09
Пользователь №: 54 383

|
Извиняюсь, в предыдущем коде я неверно указал опрос флагов готовности, и как я догадываюсь, в них вся проблема, правильно так Код 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);
} почему-то программа зависает на первой же проверке статуса, с чем это может быть связано??
|
|
|
|
|
Mar 15 2010, 15:03
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 7-05-07
Из: Болгария
Пользователь №: 27 577

|
2 goodking В вашем коде не видна продедура инициализации МК. Правильно ли настроены порты MK? Crossbar включен? Раз пишете, потом читаете с порт P4 (DATA) надо менять настройки порта, на вход(выход). Чтоб легхче сделать инициализацию МК лучше использовать Config Wizard с сайта производителя. В проект правильно ли указана частота на кот. работает МК?
|
|
|
|
|
Mar 15 2010, 15:29
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 21-12-09
Пользователь №: 54 383

|
Цитата(-JonnS- @ Mar 15 2010, 18:03)  2 goodking В вашем коде не видна продедура инициализации МК. Правильно ли настроены порты MK? Crossbar включен? Раз пишете, потом читаете с порт P4 (DATA) надо менять настройки порта, на вход(выход). Чтоб легхче сделать инициализацию МК лучше использовать Config Wizard с сайта производителя. В проект правильно ли указана частота на кот. работает МК? Показана в самом начале темы! Порты настроены (push-pull) Код P2MDOUT = 0xFF; P4MDOUT = 0xFF; , crossbar включен Код XBR2 = 0x40; ! С флагами разобрался, не проходит инициализация, во всех примерах указано почему-то по разному.
Сообщение отредактировал goodking - Mar 15 2010, 15:56
|
|
|
|
|
Mar 16 2010, 16:34
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(goodking @ Mar 15 2010, 20:29)  во всех примерах указано почему-то по разному. Поэтому нужно писать работу с периферией самому, своими ручками, осмысленно и на основе чтения оригинальной документации, а не пользуясь визардами или какими-то "левоватыми" примерами.
|
|
|
|
|
Mar 26 2010, 11:04
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 21-12-09
Пользователь №: 54 383

|
Спасибо, с инициализацией разобрался! Но такой вопрос: какой командой отключается реверс отображения. Перепробовал все режимы (OR, EXOR, AND), никакого результата- все буквы на черном фоне.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|