Схема подключения к микроконтроллеру AVR




Внутренняя структура HD44780


В основе ЖКИ лежит матрица из жидких кристаллов, подавая напряжение на элемент которой мы можем «зажечь» точку на экране. В нашем случае матрица состоит из знакомест (чаще всего 8х5 пикселей), сгруппированых в несколько рядков. Этим всем управляет встроенный контроллер HD44780. У контроллера есть однобайтные ячейки памяти (DDRAM), содержимое которых собственно отображается на экране согласно таблице записанной в CGRAM. Ячеек памяти обычно больше чем знакомест в ЖКИ, поэтому адресацию знакомест нужно смотреть в даташите. То есть нам необходимо только в нужную позицию записать код нужного знака, а все остальное HD44780 сделает сам.

Для выбора позиции существует виртуальный курсор (номер текущей ячейки памяти, АС), которым можно управлять посредством команд, курсор можно сделать видимым. По умолчанию при записи символа в ячейку, курсор сдвигаеться вперед на одну позицию. Коды символов ля ЖКИ поддерживающего кириллицу можно увидеть в таблице



Старшая тетрада кода будет равна ряду выбранного символа, а младшая – строке. Можно создать свою таблицу символов, записав ее в CGRAM. На каждый символ требуется 5 байт, где единицы отвечают за «зажженные» пиксели. Например, цифра «8» кодируется последовательностью 0x6c,0x92,0x92,0x92,0x6c.
Коды команд приведены в таблице.

Таблица символов HD44780

 

Значения флагов:

Остается открытым вопрос: «как записать в нужную позицию код требуемого символа»? Для этого рассмотрим за что отвечают выводы ЖКИ. Выводы DB0-DB7 отвечают за входящие/исходящие данные. Высокий уровень на выводе RS дает индикатору понять, что сигнал на выводах DB0-DB7 является данными, а низкий – командой. Вывод W/R отвечает за направление данных, пишутся ли данные в память или читаются из нее (обычно чтение из ЖКИ не используется, можем смело на него подать низкий уровень). Импульс на выводе Е (длительностью не менее 500 нс) используется как сигнал для записи/чтения данных с выводов DB0-DB7, RS и W/R.

Вывод V0 используется для задания контраста изображения, вывода А,К – для питания подсветки (если она есть в вашей модели ЖКИ). Оставшиеся 2 вывода – собственно питание ЖКИ. То есть, для управления ЖКИ потребуется 8+1+1=10 выводов. Но можно работать в режиме 4-х битного интерфейса. При этом, сперва будет передавать старшая тетрада команды/данных на выводах DB4-DB7, а после – младшая. Выводы при DB0-DB3 при этом не используются. Итого для управления требуется 6 выводов микроконтроллера.
Теперь рассмотрим живой пример. Напишем программу для вывода текста на имеющийся у меня в наличии WH1602А (2 строки по 16 символов).

Для других ЖКИ следует сверить соответствие ячеек DDRAM знакоместам. Схема подключения ЖКИ к контроллеру выглядит так.

Схема подключения к микроконтроллеру AVR

 

 

Резистор R3 - 17 Ом ограничивает ток через подсветку, а переменный VR1 задает контраст (если все правильно подключено и запрограммировано, но индикатор молчит, покрутите VR1, чтобы изображения стало видимым). Также не в коем случае не следует путать полярность ЖКИ, питать его выше 5,5В, со своего опыта могу сказать, что горят они моментально. Назначение всех остальных деталей такое же как в макетной платы для ATtiny2313.
Теперь перейдем к написанию программы. Для контроля индикатора напишем программу с несколькими ключевыми функциями работы с ЖКИ: lcd_dat(unsigned char x) – для записи данных х, lcd_com(unsigned char x) – для записи команды х, lcd_init(void) – для начальной инициализации индикатора:

1. #include <avr/io.h> //библиотека ввода/вывода2. 3. #define RS 2 //RS=PD2 - сигнал управления ЖКИ4. #define E 3 //E=PD3 - сигнал управления ЖКИ5. 6. #define TIME 10 //Константа временной задержки для ЖКИ7. //Частота тактирование МК - 4Мгц 8. 9. //Программа формирвоания задержки 10. void pause (unsignedint a) 11. {unsignedint i;12. 13. for(i=a;i>0;i--);14. }15. 16. //Программа передачи команд в ЖКИ 17. void lcd_com (unsignedchar lcd)18. {unsignedchar temp;19. 20. temp=(lcd&~(1<<RS))|(1<<E); //RS=0 – это команда 21. PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E 22. asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации 23. PORTD=temp&~(1<<E); //Сигнал записи команды 24. 25. temp=((lcd*16)&~(1<<RS))|(1<<E); //RS=0 – это команда 26. PORTD=temp; //Выводим на portD младшую тетраду команды, сигналы RS, E 27. asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации 28. PORTD=temp&~(1<<E); //Сигнал записи команды 29. 30. pause (10*TIME); //Пауза для выполнения команды 31. }32. 33. //Программа записи данных в ЖКИ 34. void lcd_dat (unsignedchar lcd)35. {unsignedchar temp;36. 37. temp=(lcd|(1<<RS))|(1<<E); //RS=1 – это данные 38. PORTD=temp; //Выводим на portD старшую тетраду данных, сигналы RS, E 39. asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации 40. PORTD=temp&~(1<<E); //Сигнал записи данных 41. 42. temp=((lcd*16)|(1<<RS))|(1<<E); //RS=1 – это данные 43. PORTD=temp; //Выводим на portD младшую тетраду данных, сигналы RS, E 44. asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации 45. PORTD=temp&~(1<<E); //Сигнал записи данных 46. 47. pause(TIME); //Пауза для вывода данных 48. }49. 50. //Программа иниализации ЖКИ 51. void lcd_init (void)52. {53. lcd_com(0x2c); //4-проводный интерфейс, 5x8 размер символа 54. pause(100*TIME);55. lcd_com(0x0c); //Показать изображение, курсор не показывать 56. pause(100*TIME);57. lcd_com(0x01); //Очистить DDRAM и установить курсор на 0x00 58. pause (100*TIME);59. }60. 61. //Основная программа 62. int main(void)63. {64. DDRD=0xfc; //Инициализация portD 65. PORTD=0x00;66. 67. pause(1000); //Задержка, чтобы ЖКИ успел включиться 68. lcd_init(); //Инициализация ЖКИ 69. 70. 71. lcd_dat('w'); //Вывод "www.avrlab.com" 72. lcd_dat('w');73. lcd_dat('w');74. lcd_dat('.');75. lcd_dat('a'); 76. lcd_dat('v');77. lcd_dat('r');78. lcd_dat('l');79. lcd_dat('a');80. lcd_dat('b');81. lcd_dat('.');82. lcd_dat('c');83. lcd_dat('o');84. lcd_dat('m');85. 86. lcd_com(0xc0); //Ставим курсор на начало 2-й строки ЖКИ 87. 88. lcd_dat('I'); //Записываем "It's so easy" 89. lcd_dat('t');90. lcd_dat('"');91. lcd_dat('s');92. lcd_dat(' ');93. lcd_dat('s');94. lcd_dat('o');95. lcd_dat(' ');96. lcd_dat('e');97. lcd_dat('a');98. lcd_dat('s');99. lcd_dat('y');100. 101. 102. while(1) //бесконечный цикл 103.;104. 105. return1;106. }

Программа очень проста, разобраться в ней не составит труда любому, кто хоть немного владеет C для AVR. Для латиницы и цифр ASCII коды совпадают с зашитыми в знакогенератор ЖКИ, поэтому позволительно использовать lcd_dat(‘A’). Можно создать свою библиотеку для работы с ЖКИ, выделив функции lcd_dat(unsigned char x), lcd_com(unsigned char x), lcd_init(void) в отдельный модуль LCD.h и подключать его за надобностью.

Эта затея очень экономит время, стоит только один раз написать нужные функции, а потом все время их только использовать. Также можно подметить, что неудобно выводить длинную фразу по одной букве, для этого можно нашу выводимую строку запихнуть в массив из unsigned char и выводить с помощью цикла:

1. int main(void)2. {unsignedchar data [14]={'w','w','w','.','a','v','r','l','a','b','.','c','o','m'};3. unsignedchar i;4. DDRD=0xfc; //Инициализация portD 5. PORTD=0x00;6. 7. pause(1000); //Задержка, чтобы ЖКИ успел включиться 8. lcd_init(); //Инициализация ЖКИ 9. 10. for(i=0;i<14;i++) //Вывод записи побуквенно 11. lcd_dat(data[i]);

Только не стоит забывать, что нумерация массивов в С начинается с нуля. Существующую программу можно без существенных изменений использовать совместно с контроллером ATtiny2313, подключив ЖКИ к PORTB, та как PORTD у ATtiny2313 имеет всего 7 выводов, а не 8, как у ATmega8.

 

Заключение

Алфавитно-цифровые ЖКИ-модули представляют собой недорогое и удобное решение, позволяющее сэкономить время и ресурсы при разработке новых изделий, при этом обеспечивают отображение большого объема информации при хорошей различимости и низком энергопотреблении. Возможность оснащения ЖКИ-модулей задней подсветкой позволяет эксплуатировать их в условиях с пониженной или нулевой освещенностью, а исполнение с расширенным диапазоном температур (-20°С...+70°С) в сложных эксплуатационных условиях, в том числе в переносной, полевой и даже, иногда, в бортовой аппаратуре.

 

Литература

 

https://ru.wikipedia.org/wiki/AVR

https://avrlab.com/node/80

https://www.gaw.ru/html.cgi/txt/lcd/chips/hd44780/start.htm



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: