falanga
Гость
|
|
« : 16-11-2009 10:50 » |
|
Привет! Я недавно начал изучать микроконтроллеры, почему-то не получается разобратся с LCD вот код, если в нем есть ошибка- укажите, буду благодарен #include "c8051F120.h"
sbit LCD_rs=P2^2; sbit LCD_rw=P2^1; sbit LCD_en=P2^0; #define LCD_data P4
void Port_IO_Init(void); void LCD_init(void); void LCD_command(unsigned char var); void LCD_busy(void); void LCD_senddata(unsigned char var); void LCD_sendstring(unsigned char *var); void LCD_build();
void main (void) { WDTCN = 0xDE; WDTCN = 0xAD; Port_IO_Init(); LCD_init (); LCD_command (); LCD_sendstring (); LCD_build(); LCD_busy();
} void Port_IO_Init(void) { SFRPAGE = CONFIG_PAGE; P2MDOUT = 0xFF; P4MDOUT = 0xFF; XBR2 = 0x40;
}
void LCD_init(void) {LCD_data = 0x0E;// 2 линии 8 бит 5х8 точек LCD_rs = 0;// обработка данных как инструкций LCD_rw = 0; // запись данных в ЖКИ LCD_en = 1; LCD_en = 0; LCD_busy(); //пауза для обработки команд LCD_data = 0x01;//включить дисплей, курсор LCD_rs = 0; LCD_rw = 0; LCD_en = 1; LCD_en = 0; LCD_busy(); LCD_data = 0x01; LCD_rs = 0; LCD_rw = 0; LCD_en = 1; LCD_en = 0; LCD_busy(); LCD_data = 0x06;//режим введения авто увиличение без сдвига LCD_rs = 0; LCD_rw = 0; LCD_en = 1; LCD_busy(); LCD_data = 0; }
void LCD_busy() {unsigned char i,j; for(i=0;i<50;i++) //A simple for loop for delay for(j=0;j<255;j++); } void LCD_command(unsigned char var) { LCD_data = var; LCD_rs = 0; LCD_rw = 0; LCD_en = 1; LCD_en = 0; LCD_busy(); } void LCD_sendstring(unsigned char *var) { while(*var) //till string ends LCD_senddata(*var++); //send characters one by one }
void LCD_build() { LCD_command(0x48); //Load the location where we want to store LCD_senddata(0x04); //Load row 1 data LCD_senddata(0x0E); //Load row 2 data LCD_senddata(0x0E); //Load row 3 data LCD_senddata(0x0E); //Load row 4 data LCD_senddata(0x1F); //Load row 5 data LCD_senddata(0x00); //Load row 6 data LCD_senddata(0x04); //Load row 7 data LCD_senddata(0x00); //Load row }
void LCD_senddata(unsigned char var) { LCD_data = var; LCD_rs = 1; LCD_rw = 0; LCD_en = 1; LCD_en = 0; LCD_busy(); }
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #1 : 16-11-2009 10:59 » |
|
я так понимаю, что код откуда-то взят. 1. Где основной цикл? void main (void) { WDTCN = 0xDE; WDTCN = 0xAD; Port_IO_Init(); LCD_init (); LCD_command (); LCD_sendstring (); LCD_build(); LCD_busy();
}
получается что, инициализация портов, LCD, передача данных, наверное попытка "зажечь". Бац. Конец. Возможно, watchdog должен сбросить контроллер. но не сбрасывает. почитай внимательно доку на LCD. В те ли порты контроллера пишешь?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
falanga
Гость
|
|
« Ответ #2 : 16-11-2009 11:11 » |
|
забыл void main (void) { WDTCN = 0xDE; WDTCN = 0xAD; Port_IO_Init(); LCD_init (); LCD_command (); LCD_sendstring (); LCD_build(); LCD_busy();
while (1){};
} но все-равно, горит только верхняя строка экрана, которая потухает при запуске программы! А даташит я читал, вроде все правильно!
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #3 : 16-11-2009 11:19 » |
|
а так
while (1){ LCD_command (); LCD_sendstring (); LCD_build(); LCD_busy();
};
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
falanga
Гость
|
|
« Ответ #4 : 16-11-2009 11:39 » |
|
Да, так наверное правильно, но все-равно не работает , и еще при компилляции пишет, что в main, в подпрограмме sendstring не указаны данные, не подскажешь, с чем это связано?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #5 : 16-11-2009 11:57 » |
|
у тебя как объявлена функция? void LCD_sendstring(unsigned char *var);
а как ты ее вызываешь?
LCD_sendstring ();
И потом... откуда LCD будет знать что ему выводить?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
falanga
Гость
|
|
« Ответ #6 : 16-11-2009 12:20 » |
|
что выводить, указано в LCD_build, а в LSD_string на протяжении программы заносятся различные данные (var), что -же туда записать?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #7 : 16-11-2009 14:22 » |
|
falanga, расскажи алгоритм работы с LCD, чувствую, что ты до конца не проникся.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
falanga
Гость
|
|
« Ответ #8 : 16-11-2009 14:58 » |
|
sbit LCD_rs=P2^2; sbit LCD_rw=P2^1; sbit LCD_en=P2^0; #define LCD_data P4//назначаю соответствующие выводы портов-линиям ЖКИ
void Port_IO_Init(void); void LCD_init(void); void LCD_command(unsigned char var); void LCD_busy(void); void LCD_senddata(unsigned char var); void LCD_sendstring(unsigned char *var); void LCD_build();
void main (void) { WDTCN = 0xDE; WDTCN = 0xAD; Port_IO_Init(); LCD_init (); LCD_command (); LCD_sendstring (); LCD_build(); LCD_busy();
} void Port_IO_Init(void) { SFRPAGE = CONFIG_PAGE; P2MDOUT = 0xFF; P4MDOUT = 0xFF; XBR2 = 0x40;
}//инициализация портов
void LCD_init(void) {LCD_data = 0x0E;// 2 линии 8 бит 5х8 точек LCD_rs = 0;// обработка данных как инструкций LCD_rw = 0; // запись данных в ЖКИ LCD_en = 1; LCD_en = 0; LCD_busy(); //пауза для обработки команд LCD_data = 0x01;//включить дисплей, курсор LCD_rs = 0; LCD_rw = 0; LCD_en = 1; LCD_en = 0; LCD_busy(); LCD_data = 0x01; LCD_rs = 0; LCD_rw = 0; LCD_en = 1; LCD_en = 0; LCD_busy(); LCD_data = 0x06;//режим введения авто увиличение без сдвига LCD_rs = 0; LCD_rw = 0; LCD_en = 1; LCD_busy(); LCD_data = 0; }//инициализация ЖКИ (LCD_rs-регистр LCD, если1-данные (которые подаются в LCD_data) воспринимаются как собственно данные, если 0-как инструкции; LCD_rw,0-запись данных, 1-чтение; LCD_en - если 0-то данные можно записывать в ЖКИ, если 1- нет )
void LCD_busy() {unsigned char i,j; for(i=0;i<50;i++) //A simple for loop for delay for(j=0;j<255;j++); }//задержка void LCD_command(unsigned char var) { LCD_data = var; LCD_rs = 0; LCD_rw = 0; LCD_en = 1; LCD_en = 0; LCD_busy(); }// подпрограмма обработки инструкций для ЖКИ void LCD_sendstring(unsigned char *var) { while(*var) //till string ends LCD_senddata(*var++); //send characters one by one }//подпрогр. вывода строки
void LCD_build() { LCD_command(0x48); //Load the location where we want to store LCD_senddata(0x04); //Load row 1 data LCD_senddata(0x0E); //Load row 2 data LCD_senddata(0x0E); //Load row 3 data LCD_senddata(0x0E); //Load row 4 data LCD_senddata(0x1F); //Load row 5 data LCD_senddata(0x00); //Load row 6 data LCD_senddata(0x04); //Load row 7 data LCD_senddata(0x00); //Load row }//подпр. построения данных, выводимых на экран
void LCD_senddata(unsigned char var) { LCD_data = var; LCD_rs = 1; LCD_rw = 0; LCD_en = 1; LCD_en = 0; LCD_busy(); }//вывод данных на экран
|
|
« Последнее редактирование: 16-11-2009 15:46 от Sla »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #9 : 16-11-2009 15:21 » |
|
falanga, это не алгоритм, это программа. Ты русским языком объясни.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Sla
|
|
« Ответ #10 : 16-11-2009 15:49 » |
|
Опиши словами как надо работать с LCD например 1. инициализация портов контроллера 2. инициализация порnов LCD 3. подготовка строки вывода и т.д.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
falanga
Гость
|
|
« Ответ #11 : 17-11-2009 08:19 » |
|
Ясно: Инициализировать порты МК, инициализировать LCD, задать параметры пересылки комманд в LCD (LCD_command), параметры пересылки данных в LCD (LCD_sendstring; LCD_senddata) , переслать данные (LCD_build) ну в принципе все
|
|
« Последнее редактирование: 17-11-2009 08:25 от falanga »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #12 : 17-11-2009 10:41 » |
|
я думаю, что у тебя проблема с пониманием работы LCD Как это, наверное, должно работать? 1. Инит портов МК и LCD 2. Подготовка данных для вывода на LCD 3. Вывод на LCD 4. Переход на 2. 2. Подготовка данных как я понимаю дисплей многострочный подготовить первую строку подготовить вторую строку ... 3. Команда запись Задержка LCDBusy - для каждого дисплея индивидуальна Команды записи/чтения для каждого дисплея индивидуальны. А теперь показывай свой код в принципе void LCD_senddata(unsigned char var) { LCD_data = var; LCD_rs = 1; LCD_rw = 0; LCD_en = 1; LCD_en = 0; LCD_busy();
Это и есть код вывода Но! Ведь это у тебя библиотечные функции, возможно, что ты не совсем понимаешь их назначения.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #13 : 17-11-2009 10:55 » |
|
покажи ассемблерный код библиотек, приложи его к ответу
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
falanga
Гость
|
|
« Ответ #14 : 17-11-2009 11:05 » |
|
Нет, функции я взял из найденного примера, в принципе назначение регистров LCD, как я понял не отличается для разных моделей.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #15 : 17-11-2009 11:24 » |
|
вот гляди void wrt_string(bit_8 *string) { busy(); while(*string) wrt_data(*string++); }
Что происходит? Задержка побайтная выгрузка данных Крутим дальше void wrt_data(bit_8 ch) { busy(); LCD_PORT = ch; rs=1; rw=0; en=1; en=0; }
Задержка Запихнули байт в порт Выдали команду записи в порт LCD
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
falanga
Гость
|
|
« Ответ #16 : 17-11-2009 13:04 » |
|
вот гляди void wrt_string(bit_8 *string) { busy(); while(*string) wrt_data(*string++); }
Что происходит? Задержка побайтная выгрузка данных Крутим дальше void wrt_data(bit_8 ch) { busy(); LCD_PORT = ch; rs=1; rw=0; en=1; en=0; }
Задержка Запихнули байт в порт Выдали команду записи в порт LCD Понятно, а какое значение заносить в wrt_string (в моеи случае LCD_sendstring) в главной функции?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #17 : 17-11-2009 13:18 » |
|
falanga, заноси строку, которую нужно вывести на экран, например "Привет мир"
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
falanga
Гость
|
|
« Ответ #18 : 18-11-2009 08:26 » |
|
Да, получилось, спасибо большое !!
|
|
|
Записан
|
|
|
|
|