Окончание
Начало читайте здесь:
Введение
Данный материал является продолжением статьи «Символьные ЖК дисплеи. Часть 1». В этой части мы подключим ЖК модуль к микроконтроллеру Atmega8, а затем напишем некоторый код, чтобы управлять им.
Схема
Наша первая задача – собрать схему.
Мы будем использовать 28 контактную плату разработки от AVR. Для питания схемы используем кабель – переходник с USB на круглый разъем. Таким образом, нам не понадобится собирать схему источника питания 5 В. Вместо нее мы подключим провод от круглого разъема к линии положительного напряжения питания, как показано на фотографии ниже.
Так же нам не потребуется ни внешний кварцевый резонатор, ни фильтр для напряжения AVCC микроконтроллера. Мы просто соединим напряжение питания и контакт AVCC отрезком провода.
Поскольку мы не планируем запаивать ЖК модуль навсегда, и хотим иметь возможность извлечь его в дальнейшем, мы припаяем к плате 16-контактное гнездо.
Затем мы припаяем контакты VDD и BLA к плюсовой шине, а контакты VSS, RW, D0, D1, D2, D3 и BLK к общему проводу. Контакты D0…D3 подключены к общему проводу, поскольку мы будем управлять дисплеем в 4-битовом режиме. Это позволит нам использовать для управления всего 6 проводов.
Затем мы установим подстроечный резистор для регулировки контраста ЖК дисплея. Я использовал резистор сопротивлением 5 кОм, но вполне подходят и другие.
Теперь мы подключим контакты RS, EN (Enable) и D4…D7 к выводам PC0…PC5 микроконтроллера. Они могут быть подключены и к любым другим выводам контроллера Atmega8, но порт С кажется идеально подходящим, так как имеет 6 доступных линий ввода/вывода. Если вы решите использовать другие контакты, просто отредактируйте исходный код соответствующим образом.
Как и на макетной плате, мы припаяем 16-контактный разъем для к ЖК модулю.
Наконец, мы вставим ЖК модуль в соответствующий разъем на макетной плате.
Программа. Часть A
Наша первая программа «Hello World» представлена ниже. В ней реализована почти та же самая последовательность шагов, как в случае с 4-битным примером в первой части.
Код программы:
#include
avr/io.h
#includeavr/io.h
#includeutil/delay.h
#includestdio.h
//Define functions //========================================================== void io_init(void); //Initializes IO void send_nibble(unsigned char __rs, unsigned char __data); //==========================================================
int main (void) { io_init(); _delay_ms(15); send_nibble(0,0b0010);
//Set to 4 bit operation (note: 1 nibble operation) _delay_ms(5);
send_nibble(0,0b0010); //Function set, 4 bit send_nibble(0,0b1000);
send_nibble(0,0b0000); //Display ON, Cursor On, Cursor Blinking send_nibble(0,0b1111);
send_nibble(0,0b0000); //Clear Display send_nibble(0,0b0001);
send_nibble(0,0b0000); //Entry Mode, Increment cursor position, No display shift send_nibble(0,0b0110);
send_nibble(1,0b0100); //H send_nibble(1,0b1000);
send_nibble(1,0b0110); //e send_nibble(1,0b0101);
send_nibble(1,0b0110); //l send_nibble(1,0b1100);
send_nibble(1,0b0110); //l send_nibble(1,0b1100);
send_nibble(1,0b0110); //o send_nibble(1,0b1111);
send_nibble(1,0b0010); //Space send_nibble(1,0b0000);
send_nibble(1,0b0101); //w send_nibble(1,0b0111);
send_nibble(1,0b0110); //o send_nibble(1,0b1111);
send_nibble(1,0b0111); //r send_nibble(1,0b0010);
send_nibble(1,0b0110); //l send_nibble(1,0b1100);
send_nibble(1,0b0110); //d send_nibble(1,0b0100);
return(0); }
void io_init (void) { /* PC 7: N/A
PC 6: Reset PC 5: Enable PC 4: Register Select PC 3: Data 7 PC 2: Data 6 PC 1: Data 5 PC 0: Data 4 */
DDRC = 0b00111111;
}
void send_nibble(unsigned char __rs, unsigned char __data) { PORTC = (__rs<<4) | __data | 0b00100000; // Set RS & Data. Set EN=High _delay_ms(1); PORTC = (__rs<<4) | __data; // Set RS & Data. Set EN=Low _delay_ms(1); }
Программа. Часть Б
Предыдущий пример хорошо подходит для понимания принципов управления LCD дисплеем, но на практике программирование таким способом – мучительное занятие. Чтобы все упростить, нам надо отвлечься от деталей реализации и сфокусироваться на задачах, поставленных перед разработчиком. Простейший путь осуществить этос– использовать готовую библиотеку.
Очень популярная библиотека AVR для HD44780 – библиотека от PeterFleury. Это очень хорошая библиотека, но я решил использовать библиотеку от alank2. Причинами были:
- Библиотека от Peter Fleury требует, чтобы контакт R/W был подключен к одному из портов ввода/вывода
- Библиотека от alank2 выделяет настройки в отдельный .h файл. Я думаю, это делает программу более прозрачной и понятной
- Библиотека от alank2 при компилируется более сжато
- Библиотека от alank2 поддерживает до 4 LCD дисплеев, у них общие линии данных и RS, но разные линии EN.
Чтобы использовать библиотеку от alank2, необходимо
- Добавить в ваш проект файлы hd44780.c и hd44780.h
- Создать файл hd44780_settings.h (пример есть в alank2's zip file) и добавить его к проекту
- Использовать предоставляемые библиотекой функции
Используя библиотеку от alank, мы создали следующую версию программы. Эта программа делает намного больше чем предыдущая «Hello World», а состоит только из 30 строчек кода.
Код программы:
#include
avr/io.h
#includeutil/delay.h
#includestdlib.h
![]()
#include "hd44780.h"
int main (void) { lcd_init();
lcd_clrscr(); lcd_puts("Hello World...");
lcd_goto(40); //Position 40 is the start of line 2 char digit[1];
for (int i=0;i<16;i++) _delay_ms(1000); lcd_clrscr();
lcd_puts("Goodbye"); _delay_ms(2000); lcd_clrscr();
return(0); }