Работа с ЖКИ на контроллере HD44780 и его аналогах
- nictrace
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вс янв 11, 2009 09:29:08
- Откуда: Ярославль
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
код со cxem.net попробовать можно, он под мегу8 с частотой 1 МГц, только нужно соблюдать указанную в листинге распиновку. И там безо всяких регистров. Компилятор - CodeVisionAVR C, в другом не будет компилироваться.
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева!
LM317 - атцтой, LM2576ADJ - форева!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
а можно это как-то с этой схемой увязать? http://p-45.narod.ru/files/sch_v3.pdf собрана в железе, и к сожалению очень проблематично будет из неё что-то выковырять (блок индикатора имею в виду)... как бы программно сделать так, что на ножку атмеги сигнал завёл и в виде циферок получил...наверное всё-таки делить приедятся, это проще чем с неудобным кварцем работать... интересно к561ИЕ16 на 4Мгц потянет?
- nictrace
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вс янв 11, 2009 09:29:08
- Откуда: Ярославль
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
что-то я не понял... схема собрана? Значит, индикатор есть, и он подключен к процессору? Значит, единственное, чего нет - это входа счетчика?
Частота должна приходить на 11 ногу. А она в схеме используется как выход для управления индикатором... А на порту С есть свободные ноги. Придется переназначить линию cs_lcd другой ноге и перекомпилировать весь код. Тогда можно будет добавить в код процедуры подсчета импульсов.
Частота должна приходить на 11 ногу. А она в схеме используется как выход для управления индикатором... А на порту С есть свободные ноги. Придется переназначить линию cs_lcd другой ноге и перекомпилировать весь код. Тогда можно будет добавить в код процедуры подсчета импульсов.
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева!
LM317 - атцтой, LM2576ADJ - форева!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
да, все собрано, нужен только вход и программа которая будет всем этим управлять.
CodeVisionAVR скачал себе, осталось понять, как там чего переназначить.
CodeVisionAVR скачал себе, осталось понять, как там чего переназначить.
- nictrace
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вс янв 11, 2009 09:29:08
- Откуда: Ярославль
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
я так понимаю, у тебя уже есть прошивка, раз он работает.
Надо смотреть ее исходники, на чем они написаны, и плясать от этого. А процедура вывода на дисплей в прошивке есть точно.
Надо смотреть ее исходники, на чем они написаны, и плясать от этого. А процедура вывода на дисплей в прошивке есть точно.
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева!
LM317 - атцтой, LM2576ADJ - форева!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Ситуацию с инициализацией HD44780 можно охарактеризовать словами: «Всем хорош LCD c HD44780, но только чуть-чуть не инициализируется» (напоминает «Всем хороша невеста, но вот чуть-чуть беременна от неизвестного»). Я был в тоске: имею 3 (три) даташита с тремя типами инициализации, несколько скачанных вариантов программ инициализации с программами в Протеус и ничего не идет у меня в компе, ничего не могу приспособить.
Сейчас вот нашел, что не одинок.
ibiza11 на стр.11 этого форума
« Цитата дословно и побуквенно:\Думал на подпрограммы вывода, но как бы я их не упрощал, как бы не увеличивал задержки, результата это не принесло. Следование в точности даташиту тоже результатов не принесло (даташит в моем посте выше). В итоге нашел на давно забытой флешке свою (!!! охренеть) старую программу с инициализацией ЖКИ. Подставил команды оттуда и О, ЧУДО! Свершилось! тут же начало все работать!!! даже с моими подпрограммами вывода (в которых вы не разобрались).
вот собственно команды:
Код:
;7-отключен
;6-выбор регистра
;5-чтение/запись
;4-строб
;3-DB7
;2-DB6
;1-DB5
;0-DB4
.db 0b00000011,0b00000011
.db 0b00000011,0b00000010
.db 0b00000010,0b00001000
.db 0b00000000,0b00001000
.db 0b00000000,0b00000110
.db 0b00000000,0b00001100
.db 0b00000000,0b00001100
.db 0b00000000,0b00000001 »
Замучился проверять. Может кто и подскажет : «А стоит ли проверять?»
Сейчас вот нашел, что не одинок.
ibiza11 на стр.11 этого форума
« Цитата дословно и побуквенно:\Думал на подпрограммы вывода, но как бы я их не упрощал, как бы не увеличивал задержки, результата это не принесло. Следование в точности даташиту тоже результатов не принесло (даташит в моем посте выше). В итоге нашел на давно забытой флешке свою (!!! охренеть) старую программу с инициализацией ЖКИ. Подставил команды оттуда и О, ЧУДО! Свершилось! тут же начало все работать!!! даже с моими подпрограммами вывода (в которых вы не разобрались).
вот собственно команды:
Код:
;7-отключен
;6-выбор регистра
;5-чтение/запись
;4-строб
;3-DB7
;2-DB6
;1-DB5
;0-DB4
.db 0b00000011,0b00000011
.db 0b00000011,0b00000010
.db 0b00000010,0b00001000
.db 0b00000000,0b00001000
.db 0b00000000,0b00000110
.db 0b00000000,0b00001100
.db 0b00000000,0b00001100
.db 0b00000000,0b00000001 »
Замучился проверять. Может кто и подскажет : «А стоит ли проверять?»
- nictrace
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вс янв 11, 2009 09:29:08
- Откуда: Ярославль
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
не идет в симуляторе или в железе?
да, я на той же страничке упоминал одну деталь в даташите на дисплейчег, из-за которой он не запускается...
да, я на той же страничке упоминал одну деталь в даташите на дисплейчег, из-за которой он не запускается...
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева!
LM317 - атцтой, LM2576ADJ - форева!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Да ничего не получается, ни в натуре, ни в протеусе. Слепил несколько своих вариантов, впустую. Подумал, решил, что если в Протеус пройдет, то в натуре будет полегче.
Нахожу
http://radioelektr.ru/podklyutchenie-lc ... omment-255
в нем есть работающая исходники и модель протеуса. Воспроизвел. Пробую – не работает. Отправил знакомому, тот ответил, что очень просто, мол нужно переместить немного землю. Пробую – бесполезно. Наверное он пошутил.
Нахожу другой проект. Вычленяю из него только МК и ЛСД. В Протеусе работает –инициализирует. Можете проверить.
В прикреплении-это проект model_ds18b20 (+исходник и файл HEX).
ПЕРЕРАБАТЫВАЮ его на Atmega48 -в прикреплении-это проект model_48-1 (+исходник и файл HEX). Проект работает в протеусе. Можете проверить.
Но у меня готова печатная плата, где линии данных и линии управления на разных портах, в прикреплении – это проект model_48-1 (+исходник и файл HEX). Проект не работает в протеусе. Всего-навсего переключил только две линии управления на другой порт.
И НЕ РАБОТАЕТ. В LCD-48-2.asm можно увидеть следы моей деятельности и отличия от LCD-DS48.asm. Много NOP в двух местах (оставил)-попытка ввести задержки.
Помогите, пожалуйста, если сможете.
Нахожу
http://radioelektr.ru/podklyutchenie-lc ... omment-255
в нем есть работающая исходники и модель протеуса. Воспроизвел. Пробую – не работает. Отправил знакомому, тот ответил, что очень просто, мол нужно переместить немного землю. Пробую – бесполезно. Наверное он пошутил.
Нахожу другой проект. Вычленяю из него только МК и ЛСД. В Протеусе работает –инициализирует. Можете проверить.
В прикреплении-это проект model_ds18b20 (+исходник и файл HEX).
ПЕРЕРАБАТЫВАЮ его на Atmega48 -в прикреплении-это проект model_48-1 (+исходник и файл HEX). Проект работает в протеусе. Можете проверить.
Но у меня готова печатная плата, где линии данных и линии управления на разных портах, в прикреплении – это проект model_48-1 (+исходник и файл HEX). Проект не работает в протеусе. Всего-навсего переключил только две линии управления на другой порт.
И НЕ РАБОТАЕТ. В LCD-48-2.asm можно увидеть следы моей деятельности и отличия от LCD-DS48.asm. Много NOP в двух местах (оставил)-попытка ввести задержки.
Помогите, пожалуйста, если сможете.
- Вложения
-
- 1111.rar
- прикреплено 3 проект в протеусе и исходники
- (44.85 КБ) 248 скачиваний
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Вот пример, который работает с как угодно разбросанными по любым портам линиями LCD:
Код: Выделить всё
//----------
//модуль поддержки LCD 2x16
//----------
#include <Main.h>
#include <Lcd.h>
//---------- Используемые модулем аппаратные ресурсы: ----------
//Модуль LCD используется в 4-битном режиме.
//Чтение данных из модля не используется, сигнал W заземлен.
//Управляющие сигналы: LCD_E, LCD_RS, LCD_D4, LCD_D5, LCD_D6, LCD_D7.
//Для включения подсветки используется порт BKL, активный уровень - высокий.
//Используется функция Delay_ms и макрос Delay_us.
//---------- Таблица пользовательских символов LCD: ----------
__flash char UsrChr[]= { 0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00, //° (0x00)
0x04,0x04,0x1F,0x04,0x04,0x00,0x1F,0x00, //± (0x01)
0x10,0x10,0x10,0x1E,0x11,0x11,0x1E,0x00, //Ь (0x02)
0x15,0x11,0x13,0x15,0x19,0x11,0x11,0x00, //Й (0x03)
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // (0x04)
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // (0x05)
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // (0x06)
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; // (0x07)
//---------- Таблица перекодировки русских букв: ----------
__flash char CharsR[]= { 0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,
0xA5,0x03,0x4B,0xA7,0x4D,0x48,0x4F,0xA8,
0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB,
0xAC,0xE2,0xAD,0xAE,0x02,0xAF,0xB0,0xB1,
0x61,0xB2,0xB3,0xB4,0xE3,0x65,0xB6,0xB7,
0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0x6F,0xBE,
0x70,0x63,0xBF,0x79,0xE4,0x78,0xE5,0xC0,
0xC1,0xE6,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7 };
//----------
void LCD_Wr(char d); //запись байта в LCD
void LCD_Wr4(char d); //запись ниббла в LCD
void LCD_WrCmd(char d); //запись команды в LCD
void LCD_WrData(char d); //запись данных LCD
void LCD_UsrChr(void); //загрузка символов пользователя
//---------- Инициализация LCD: ----------
void LCD_Init(void)
{
Delay_ms(15);
LCD_WrCmd(0x30);
Delay_ms(5); //delay >4.1 mS
LCD_WrCmd(0x30);
Delay_us(100); //delay >100 uS
LCD_WrCmd(0x30);
Delay_ms(5); //delay >4.1 mS
LCD_WrCmd(0x20); //FUNCTION SET (8 bit)
Delay_ms(15);
LCD_WrCmd(0x28); //FUNCTION SET (4 bit)
Delay_ms(15);
LCD_WrCmd(0x0C); //DISPLAY ON
Delay_ms(15);
LCD_WrCmd(0x06); //ENTRY MODE SET
Delay_ms(15);
LCD_Clear(); //CLEAR
Delay_ms(15);
LCD_UsrChr(); //загрузка символов пользователя
}
//---------- Загрузка LCD CGRAM: ----------
//UsrChr - таблица символов: 8 байт на символ x 8 символов
//Матрица точек 5x8: BYTE1 D4 D3 D2 D1 D0
// BYTE2 D4 D3 D2 D1 D0
// ...
// BYTE8 D4 D3 D2 D1 D0
void LCD_UsrChr(void)
{
LCD_WrCmd(0x40); //установка нулевого адреса CGRAM
for(char i = 0; i < 64; i++)
LCD_WrData(UsrChr[i]); //загрузка CGRAM
}
//---------- Очистка LCD: ----------
void LCD_Clear(void)
{
LCD_WrCmd(0x01); //DISPLAY CLEAR
Delay_ms(5); //delay >1.64mS
}
//---------- Включение/выключение подсветки LCD: ----------
void LCD_Backlight(bool on)
{
if(on) Port_BKL_1;
else Port_BKL_0;
}
//---------- Запись команды в LCD: ----------
void LCD_WrCmd(char d)
{
Port_LCD_RS_0; //RS <- 0
LCD_Wr(d); //write byte to LCD
}
//---------- Запись данных в LCD: ----------
void LCD_WrData(char d)
{
Port_LCD_RS_1; //RS <- 1
LCD_Wr(d); //write byte to LCD
}
//---------- Запись байта в LCD: ----------
void LCD_Wr(char d)
{
LCD_Wr4(d);
Delay_us(10);
LCD_Wr4(__swap_nibbles(d));
Delay_us(50);
}
//---------- Запись ниббла в LCD: ----------
void LCD_Wr4(char d)
{
(d & 0x10)? Port_LCD_D4_1 : Port_LCD_D4_0;
(d & 0x20)? Port_LCD_D5_1 : Port_LCD_D5_0;
(d & 0x40)? Port_LCD_D6_1 : Port_LCD_D6_0;
(d & 0x80)? Port_LCD_D7_1 : Port_LCD_D7_0;
Port_LCD_E_1; //E <- 1
Delay_us(2); //delay 2 uS
Port_LCD_E_0; //E <- 0
}
//---------- Установка позиции на LCD: ----------
//line = 1..2
//pos = 1..16
void LCD_Pos(char line, char pos)
{
pos = pos - 1;
pos = pos | 0x80;
if(line > 1)
pos = pos | 0x40;
LCD_WrCmd(pos);
}
//----------
void LCD_CurOff(void)
{
LCD_WrCmd(0x0C);
}
//----------
void LCD_CurOn(void)
{
LCD_WrCmd(0x0E); //0x01 - мигание знакоместа, 0x02 - курсор on
}
//---------- Cдвиг курсора влево: ----------
void LCD_CurLeft(void)
{
LCD_WrCmd(0x10);
}
//---------- Вывод символа на LCD: ----------
void LCD_Char(char ch)
{
if(ch == 0x10) { LCD_Clear(); return; } //ch = 0x10 - LCD clear
if(ch == 0x0D) { LCD_Pos(2, 1); return; } //ch = 0x0D - перевод строки
if(ch == '°') {LCD_WrData(0x00); return; } //ch = '°'
else if(ch < 0xC0) LCD_WrData(ch); //ch < 0xC0 - english
else { ch -= 0xC0; LCD_WrData(CharsR[ch]); } //ch >= 0xC0 - russian
}
//---------- Вывод null-terminated string на LCD: ----------
void LCD_Str(char __flash *s)
{
char __flash *i;
for(i = s; *i; i++)
LCD_Char(*i);
}
//---------- Вывод текста меню на LCD: ----------
void LCD_Menu(char __flash *s)
{
char __flash *i;
LCD_Clear(); //очистка дисплея
LCD_Pos(1, 1); //установка позиции
for(i = s; *i; i++)
{
if(i == s + 16)
LCD_Pos(2, 1);
LCD_Char(*i); //вывод 16-ти символов
}
}
//---------- Вывод беззнакового числа 0..9999 на LCD: ----------
void LCD_UInt9999(int n)
{
char d, ch = ' ';
d = n / 1000;
if(d)
ch = d + 0x30;
LCD_Char(ch);
n = n % 1000;
d = n / 100;
if(ch != ' ' || d)
ch = d + 0x30;
LCD_Char(ch);
n = n % 100;
d = n / 10;
if(ch != ' ' || d)
ch = d + 0x30;
LCD_Char(ch);
n = n % 10;
LCD_Char(n + 0x30);
}
//----------
main.h:
#define LCD_D5 (1 << PC2) //OX - линия данных LCD D5
#define LCD_D4 (1 << PC3) //OX - линия данных LCD D4
#define LCD_D7 (1 << PC4) //OX - линия данных LCD D7
#define LCD_D6 (1 << PC5) //OX - линия данных LCD D6
#define Port_LCD_D7_0 (PORTC &= ~LCD_D7)
#define Port_LCD_D7_1 (PORTC |= LCD_D7)
#define Port_LCD_D6_0 (PORTC &= ~LCD_D6)
#define Port_LCD_D6_1 (PORTC |= LCD_D6)
#define Port_LCD_D5_0 (PORTC &= ~LCD_D5)
#define Port_LCD_D5_1 (PORTC |= LCD_D5)
#define Port_LCD_D4_0 (PORTC &= ~LCD_D4)
#define Port_LCD_D4_1 (PORTC |= LCD_D4)
#define LCD_E (1 << PD0) //OL - линия E LCD
#define LCD_RS (1 << PD1) //OL - линия RS LCD
#define Port_LCD_E_0 (PORTD &= ~LCD_E)
#define Port_LCD_E_1 (PORTD |= LCD_E)
#define Port_LCD_RS_0 (PORTD &= ~LCD_RS)
#define Port_LCD_RS_1 (PORTD |= LCD_RS)
- nictrace
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вс янв 11, 2009 09:29:08
- Откуда: Ярославль
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
sedoi писал(а):Да ничего не получается, ни в натуре, ни в протеусе. Слепил несколько своих вариантов, впустую.
Помогите, пожалуйста, если сможете.
Проверил ваши проекты (у меня протеус 7.7 sp2). Оба работают. На экранчик выдается "Temp=pp , 'C"
В железе не проверял
Да, и пришлось поменять компилятор. Source->Add/Remove source files->Code generation tool, стояло "none", поставил "AVRASM2".
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева!
LM317 - атцтой, LM2576ADJ - форева!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
ааа не бейте меня сильно
.Где первый вывод у WH1602A-NGG-CT ?
что-то я в этом даташите нечего понять не могу столько тут накрутили размеров
слева направо ?

что-то я в этом даташите нечего понять не могу столько тут накрутили размеров
слева направо ?

- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Дык левее вывода 16. С выводами 1 и 2 у ЖКИ извечная проблема. GND и VCC могут располагаться с точностью до наоборот.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Всем привет!
Уже несколько дней тчетно мучаю свой Winstar WH2002L на базе ks0066u.
Запитываю свой девайс и питание заходит в экран, соответственно загорается подсветка и хорошо контрастно первая строчка дисплея. Сразу скажу все ножки шлейфов обзванивал, всё подключено верно без разрывов в том числе и к девайсу. При попытке так называемой инициализации, либо ничего не происходит, либо контраст тускнеет и загоряются чёрным все знакоместа.
Вот код собственноручно писанный:
И собственно следом вопрос, имеет ли принципеальное значение на какой порт посажен экран и на какие ножки. К примеру у меня экран посажен на порт Б следующим образом:
PB0 - RS
PB1 - E
PB2 - E2 (Для больших дисплеев типа Winstar WH4004, в данный момент не используется)
PB3 - Линия № 4 Дисплея
PB4 - Линия № 5 Дисплея
PB5 - Линия № 6 Дисплея
PB6 - Линия № 7 Дисплея
PB7 - Здесь висит звуковая пищалка которая в проге пикает при нажатии клавиш.
Может на этом порте нужно чтото отключить (какойто режим, чтото наподобие JTAG для порта С), который мешает работать ножкам?
Вот фотка как загорается экран целиком:

Это она же только в полном размере 14Мегапикселей: http://dc132.file.qip.ru/download/-v4CRCEi/P1010437.JPG?tsid=20110903-051643-92c455ef
Уже несколько дней тчетно мучаю свой Winstar WH2002L на базе ks0066u.
Запитываю свой девайс и питание заходит в экран, соответственно загорается подсветка и хорошо контрастно первая строчка дисплея. Сразу скажу все ножки шлейфов обзванивал, всё подключено верно без разрывов в том числе и к девайсу. При попытке так называемой инициализации, либо ничего не происходит, либо контраст тускнеет и загоряются чёрным все знакоместа.
Вот код собственноручно писанный:
Код: Выделить всё
/* * * * * * * * * * * * *
* ДИРЕКТИВЫ ПРОЦЕССОРА *
* * * * * * * * * * * * */
#define F_CPU 8000000UL /*Частота процессора*/
#include <avr/io.h> /*Библиотека ввода-вывода*/
/* * * * * * * * * * * * * * * * *
* ИНИЦИАЛИЗАЦИЯ ПОРТОВ ATMega16 *
* * * * * * * * * * * * * * * * */
void IO_Init (void)
{
MCUCSR |= 0b10000000; /*Отключение интерфейса отладки JTAG*/
MCUCSR |= 0b10000000; /*на линиях С2-С5 порта С*/
DDRA = 0b11111111; /*Порт A*/
PORTA = 0b00000000;
DDRB = 0b11111111; /*Порт B*/
PORTB = 0b00000000;
DDRC = 0b00000011; /*Порт C*/
PORTC = 0b11111100;
DDRD = 0b00000000; /*Порт D*/
PORTD = 0b11111111;
}
/* * * * * * * * * * *
* ИНИЦИАЛИЗАЦИЯ LCD *
* * * * * * * * * * */
void LCD_Init (void)
{
Pause(100);
LCD_Command(0b00100000); /*Число строк и включение дисплея*/
LCD_Command(0b00100000);
LCD_Command(0b11000000);
Pause(50);
LCD_Command(0b00000000); /*Включение и курсоры*/
LCD_Command(0b11000000);
Pause(50);
LCD_Command(0b00000000); /*Очистка дисплея*/
LCD_Command(0b00010000);
Pause(50);
LCD_Command(0b00000000); /*Смещение курсора и экрана*/
LCD_Command(0b01100000);
}
/* * * * * * * * * * * * *
* ПЕРЕДАЧА КОМАНД В LCD *
* * * * * * * * * * * * */
void LCD_Command (unsigned char Command)
{
asm("cli");
PORTB &= 0b11111110; /*Установка RS=0 (Команда)*/
PORTB &= 0b10000111; /*Очистка линий данных*/
PORTB |= (Command >> 1) & 0b01111000; /*Передача старшей тетрады данных*/
PORTB |= 0b00000010; /*Установка взводящего сигнала E=1*/
asm("nop"); /*Пауза в один цикл процессора для стабилизации*/
PORTB &= 0b11111101; /*Установка исполняющего сигнала E=0*/
asm("nop"); /*Пауза в один цикл процессора для стабилизации*/
PORTB &= 0b10000111; /*Очистка линий данных*/
PORTB |= (Command << 3) & 0b01111000; /*Передача младшей тетрады данных*/
PORTB |= 0b00000010; /*Установка взводящего сигнала E=1*/
asm("nop"); /*Пауза в один цикл процессора для стабилизации*/
PORTB &= 0b11111101; /*Установка исполняющего сигнала E=0*/
PORTB |= 0b01111000; /*Возврат линии данных в высокий уровень (1)*/
asm("sei");
}
/* * * * * * * * * * * * *
* ПЕРЕДАЧА ДАННЫХ В LCD *
* * * * * * * * * * * * */
void LCD_Data (unsigned char Command)
{
asm("cli");
PORTB |= 0b00000001; /*Установка RS=0 (Команда)*/
PORTB &= 0b10000111; /*Очистка линий данных*/
PORTB |= (Command >> 1) & 0b01111000; /*Передача старшей тетрады данных*/
PORTB |= 0b00000010; /*Установка взводящего сигнала E=1*/
asm("nop"); /*Пауза в один цикл процессора для стабилизации*/
PORTB &= 0b11111101; /*Установка исполняющего сигнала E=0*/
asm("nop"); /*Пауза в один цикл процессора для стабилизации*/
PORTB &= 0b10000111; /*Очистка линий данных*/
PORTB |= (Command << 3) & 0b01111000; /*Передача младшей тетрады данных*/
PORTB |= 0b00000010; /*Установка взводящего сигнала E=1*/
asm("nop"); /*Пауза в один цикл процессора для стабилизации*/
PORTB &= 0b11111101; /*Установка исполняющего сигнала E=0*/
PORTB |= 0b01111000; /*Возврат линии данных в высокий уровень (1)*/
asm("sei");
}
/* * * * * * * * * * * *
* СТАРТОВАЯ ПРОГРАММА *
* * * * * * * * * * * */
int main (void)
{
IO_Init(); /*Инициализация портов*/
LCD_Init(); /*Инициализация LCD*/
while(1) /*Бесконечный цикл-обработчик*/
{
Pause(10);
if( PORTC & 0b00000001 ){PORTC &= 0b11111110;}else{PORTC |= 0b00000001;}
LCD_Command(0b00000001); //Команда очистки ЖКИ
}
return 1;
}
/*Программа задержки*/
void Pause (unsigned int Interval)
{ /*Множитель +26* на каждый мегагерц процессора*/
unsigned int i; //декларация переменной для программы задержки
for (i=0;i<(Interval*208+1);i++){asm("nop");}; //Основной цикл программы задержки
}
/* * * * * * * * * * * * *
* ПЕРЕОТРИСОВКА НА LCD *
* * * * * * * * * * * * */
void LCD_Draw()
{
if( PIND & 0b01111111 )
{
/*Показываем на экране текст страницы выбранной*/
}else{
LCD_Command(0b00000001); //Команда очистки ЖКИ
LCD_Data('O');
LCD_Data('S');
LCD_Data('T');
LCD_Data('R');
LCD_Data('O');
}
}
И собственно следом вопрос, имеет ли принципеальное значение на какой порт посажен экран и на какие ножки. К примеру у меня экран посажен на порт Б следующим образом:
PB0 - RS
PB1 - E
PB2 - E2 (Для больших дисплеев типа Winstar WH4004, в данный момент не используется)
PB3 - Линия № 4 Дисплея
PB4 - Линия № 5 Дисплея
PB5 - Линия № 6 Дисплея
PB6 - Линия № 7 Дисплея
PB7 - Здесь висит звуковая пищалка которая в проге пикает при нажатии клавиш.
Может на этом порте нужно чтото отключить (какойто режим, чтото наподобие JTAG для порта С), который мешает работать ножкам?
Вот фотка как загорается экран целиком:
Это она же только в полном размере 14Мегапикселей: http://dc132.file.qip.ru/download/-v4CRCEi/P1010437.JPG?tsid=20110903-051643-92c455ef
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Меня очень насторожила вот эта запись:
Обычно для контроллеров 44780 требуется задержка как минимум 1 мкс, а у вас же тактовая частота 8МГц.
upd: И посмотрите в ассемблерном листинге что генерируется в задержке. Некоторые компиляторы могут выбрасывать некчемные с их точки зрения циклы. Вобще для этой цели лучше использовать таймеры.
Код: Выделить всё
asm("nop"); /*Пауза в один цикл процессора для стабилизации*/Обычно для контроллеров 44780 требуется задержка как минимум 1 мкс, а у вас же тактовая частота 8МГц.
upd: И посмотрите в ассемблерном листинге что генерируется в задержке. Некоторые компиляторы могут выбрасывать некчемные с их точки зрения циклы. Вобще для этой цели лучше использовать таймеры.
- Cricket2107
- Встал на лапы
- Сообщения: 86
- Зарегистрирован: Вт авг 19, 2008 14:48:19
- Откуда: Харьков
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
У меня сегодня с таким индикатором(16X2) прикол был. У меня их 2шт 1 точно работает второй тоже должен. Подключаю к меге 8 , включаю вижу что-то типа *==^_//Д\\";%<>? долго мучился, 100 раз проверял правильность подключения проводов и наличие контакта, отсутствие КЗ бред выводит и хоть убейся. Подключил второй , включаю вижу "Hello world!" как и было задумано. Кто подскажет в чем может быть причина? Может потому что я + и - первый раз перепутал и чот в первом индикаторе подгорело?
Муррр.
-
pcb
- Опытный кот
- Сообщения: 833
- Зарегистрирован: Пт авг 12, 2011 09:14:27
- Откуда: Млечный путь/Земля/РФ/Екатеринбург
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Cricket2107 писал(а):У меня сегодня с таким индикатором(16X2) прикол был. У меня их 2шт 1 точно работает второй тоже должен. Подключаю к меге 8 , включаю вижу что-то типа *==^_//Д\\";%<>? долго мучился, 100 раз проверял правильность подключения проводов и наличие контакта, отсутствие КЗ бред выводит и хоть убейся. Подключил второй , включаю вижу "Hello world!" как и было задумано. Кто подскажет в чем может быть причина? Может потому что я + и - первый раз перепутал и чот в первом индикаторе подгорело?
Тайминги выдерживаешь?
У меня на двух индентичных заработало когда тайминги снизил(увеличил задержки).
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
-
pcb
- Опытный кот
- Сообщения: 833
- Зарегистрирован: Пт авг 12, 2011 09:14:27
- Откуда: Млечный путь/Земля/РФ/Екатеринбург
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Franz писал(а):
Может на этом порте нужно чтото отключить (какойто режим, чтото наподобие JTAG для порта С), который мешает работать ножкам?
Вот фотка как загорается экран целиком:
Это она же только в полном размере 14Мегапикселей: http://dc132.file.qip.ru/download/-v4CRCEi/P1010437.JPG?tsid=20110903-051643-92c455ef
Яркость покрути, при неинициализированном жки должна только верхняя строчка светится(еле еле).
При инициализации на две строки - еле еле две строчки
Код: Выделить всё
// DDRX_SIG |= (1<<RW)|(1<<RS)|(1<<EN);
PORT_SIG->ODR |= (1<<RW_LCD)|(1<<RS_LCD)|(1<<EN_LCD);
ClearBit(PORT_SIG, RW_LCD);
delay_ms(40);
#ifdef HD44780
LCD_WriteComInit(0x30);
delay_ms(10);
LCD_WriteComInit(0x30);
delay_ms(2);
LCD_WriteComInit(0x30);
#endif
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
- Cricket2107
- Встал на лапы
- Сообщения: 86
- Зарегистрирован: Вт авг 19, 2008 14:48:19
- Откуда: Харьков
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
pcb писал(а):Cricket2107 писал(а):У меня сегодня с таким индикатором(16X2) прикол был. У меня их 2шт 1 точно работает второй тоже должен. Подключаю к меге 8 , включаю вижу что-то типа *==^_//Д\\";%<>? долго мучился, 100 раз проверял правильность подключения проводов и наличие контакта, отсутствие КЗ бред выводит и хоть убейся. Подключил второй , включаю вижу "Hello world!" как и было задумано. Кто подскажет в чем может быть причина? Может потому что я + и - первый раз перепутал и чот в первом индикаторе подгорело?
Тайминги выдерживаешь?
У меня на двух индентичных заработало когда тайминги снизил(увеличил задержки).
Все разобрался! Этому индикатору нужно минимум 1,5 сек задержки иначе выводит бред.
Муррр.
- nictrace
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вс янв 11, 2009 09:29:08
- Откуда: Ярославль
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
полторы секунды??
Фигасе тормоз! 
Мои верные друзья - АМD и AVR
LM317 - атцтой, LM2576ADJ - форева!
LM317 - атцтой, LM2576ADJ - форева!
- Cricket2107
- Встал на лапы
- Сообщения: 86
- Зарегистрирован: Вт авг 19, 2008 14:48:19
- Откуда: Харьков
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
nictrace писал(а):полторы секунды??Фигасе тормоз!
пробовал 1 сек но тогда выводит 1 раз норм второй раз бред вообщем это он какой-то реально дурканутый. Нормальному ведь и 0,5 сек хватит вполне верно?
Муррр.