Клеммные колодки Keen Side

Символьные ЖК дисплеи. Часть 2

Окончание
Начало читайте
здесь:

Часть 1

Введение

Новое семейство LED-драйверов XLC компании MEAN WELL с дополнительными возможностями диммирования

Данный материал является продолжением статьи «Символьные ЖК дисплеи. Часть 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
#include avr/io.h
#include util/delay.h
#include stdio.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); }

Исходный код для части A

Программа. Часть Б

Предыдущий пример хорошо подходит для понимания принципов управления 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
#include util/delay.h
#include stdlib.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); }

Исходный код для части Б

protostack.com

Перевод: [IMG]/i/Image/wand.gif[/IMG] по заказу РадиоЛоцман

На английском языке: Character LCD Displays. Part 2

ТМ Электроникс. Электронные компоненты и приборы. Скидки, кэшбэк и бесплатная доставка
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя