Работа с дисплеем 16x2 на контроллере HD44780 в Bascom-AVR


http://avrproject.ru
 Жидкокристаллические дисплеи на контроллере HD44780 (а также совместимом с ним KS0066) очень распространены благодаря простому методу работы с ними, а так же небольшой цене. В зависимости от исполнения дисплея, они позволяют выводить от 8-и до 40-ка символов в каждой строке, строк может быть одна, две или четыре. Чаще всего встречаются 8*2 (восемь символов*две строки), 16*2 и 20*4.  


 Для примера рассмотрим распиновку индикатора 16*2 (у всех дисплеев на контроллере HD44780 она похожа)


 
У каждого дисплея на контроллере HD44780 для подключения имеется 14 выводов + 2 вывода для подсветки (если она имеется):

  1. Земля, GND
  2. Напряжение питания, Vcc (+5V)
  3. Настройка контрастности, Vo
  4. Выбор регистра, R/S
  5. Чтение/запись, R/W
  6. Сигнал разрешения чтения/записи, E
  7. Bit 0, D0 
  8. Bit 1, D1
  9. Bit 2, D2
  10. Bit 3, D3
  11. Bit 4, D4 
  12. Bit 5, D5
  13. Bit 6, D6
  14. Bit 7, D7 
  15. Питание подсветки для дисплеев с подсветкой, LED +
  16. Питание подсветки для дисплеев с подсветкой, LED -

Данные в дисплей загружаются по шине данных (D0-D7), при этом контроллер поддерживает как 8-и, так и 4-х битное подключение. 4-х битное подключение экономит ножки микроконтроллера и чаще всего достаточно для многих задач (при 8и битном подключении можно быстрее загружать данные в контроллер дисплея, но нам пока это ни к чему, поэтому не будем его рассматривать). Для 4-х битного подключения используются 4 последних бита шины (D4-D7).

В качестве примера будем использовать дисплей 20х4, подключенный к микроконтроллеру ATmega8 по 4х битному интерфейсу по схеме ниже



 Дисплей требует для питания 5 вольт, делителем на резисторе R1 настраивается контрастность отображаемых символов, вывод R/W подключается к земле (т.е. выбрана постоянная запись в дисплей). Подключать оставшиеся выводы можно к любым свободным ножкам микроконтроллера. Конфигурация ножек для подключения дисплея у микроконтроллера ATmega8 будет выглядеть следующим образом:

$regfile = "m8def.dat"                        'выбранный тип микроконтроллера
$crystal = 1000000                            'частота работы 1 МГц

Config Lcd = 20 * 4                           'указываем какой у нас дисплей

'и конфигурируем ножки для подключения
Config Lcdpin=Pin,Db4=PortB.3, Db5=PortB.2, Db6=PortB.1, Db7=PortB.0,E=PortB.4,Rs=PortB.5


А дальше уже можно выводить информацию на дисплей: буквы, цифры, специальные символы, а если извернуться и псевдографику. Для вывода данных на дисплей нужно знать несколько команд: 
CLS - очистка дисплея
LCD - вывести данные на дисплей (пример: Lcd "Hello world" выведет надпись Hello world)
Locate - установка места на индикаторе с которого начнется выводится текст (пример: Locate 1,5 установит курсор на 5-е знакоместо первой строчки и текст выводимый командой LCD будет начинаться отсюда)
CURSOR ON / OFF / BLINK / NOBLINK - включает или отключает отображение и мигание курсора, по умолчанию он включен (пример: отключим курсор командой Cursor Off)

А теперь напишем вот такую небольшую программку, которая выведет надпись на дисплей:

$regfile = "m8def.dat"      'выбранный тип микроконтроллера
$crystal = 1000000          'частота работы 1 МГц

Config Lcd = 20 * 4         'указываем какой у нас дисплей
'и конфигурируем ножки для подключения
Config Lcdpin=Pin,Db4=Portb.3, Db5=Portb.2, Db6=Portb.1, Db7=Portb.0,E=Portb.4,Rs=Portb.5

Cursor Off                  'выключим отображение курсора
Cls                         'очистим дисплей

Lcd "LCD 20*4 HD44780"      'выводим текст в первой строке
Locate 2 , 8                'переводим курсор на вторую строку, восьмое знакоместо
Lcd "AVRproject.ru"         'выводим текст

End


в результате на дисплее получим следующее:





 Также в Bascom-AVR есть еще несколько дополнительных команд для работы с дисплеями:

UPPERLINE - возвращает курсор на самую верхнюю строчку дисплея.
LOWERLINE - перевод курсора на вторую строку
THIRDLINE - перевод курсора на третью строку
FOURTHLINE - перевод курсора на четвертую строку 
HOME - также возвращает курсор на верхнюю строчку, но в отличии от команды UPPERLINE эта команда может принимать дополнительные значения: если после нее поставить букву L, T или F то курсор переместится в начало строчки, название которой начинается с соответствующей буквы (пример:  для того чтобы переместить курсор в начало третьей строки, нужно написать команду HOME T )


пример кода для вывода информации на дисплей с использованием этих команд:

$regfile = "m8def.dat"      'выбранный тип микроконтроллера
$crystal = 1000000          'частота работы 1 МГц

Config Lcd = 20 * 4         'указываем какой у нас дисплей
'и конфигурируем ножки для подключения
Config Lcdpin=Pin,Db4=Portb.3, Db5=Portb.2, Db6=Portb.1, Db7=Portb.0,E=Portb.4,Rs=Portb.5

Cursor Off                  'выключим отображение курсора
Cls                         'очистим дисплей

Lcd "*** HD44780  LCD ***"  'выводим текст в первой строке
Lowerline                   'переходим на вторую строку
Lcd "Line number 2"         'выводим текст
Thirdline                   'переходим на третью строку
Lcd "AaBbCcDdEeFfGgHfIiJj"  'выводим на третьей строке
Fourthline                  'переходим на четвертую строку
Lcd "1234567890"            'печатаем на четвертой строчке

End                         'конец программы







SHIFTLCD LEFT / RIGHT - сдвигает текст в строке на которой находится курсор на одну позицию влево или вправо. 
SHIFTCURSOR LEFT / RIGHT - сдвигает курсор на одну позицию влево или вправо 

и пример того как использовать сдвиг текста:

$regfile = "m8def.dat"    'выбранный тип микроконтроллера
$crystal = 1000000        'частота работы 1 МГц

Dim A As Byte             'переменная для организации цикла

Config Lcd = 20 * 4       'указываем какой у нас дисплей
'и конфигурируем ножки для подключения
Config Lcdpin=Pin,Db4=Portb.3, Db5=Portb.2, Db6=Portb.1, Db7=Portb.0,E=Portb.4,Rs=Portb.5

Cursor Off                'выключим отображение курсора
Cls                       'очистим дисплей

Locate 1 , 11             'устанавливаем курсор на первой строке, десятом знакоместе
Lcd "Bascom-AVR"          'выведем текст

'цикл сдвига влево
For A = 1 To 10           'повторяем этот цикл пока переменная А не достигнет значения 10
 Shiftlcd Left            'сдвинем текст влево
 Waitms 300               'задержка 300 миллисекунд
Next A                    'увеличиваем значение переменной А на 1

'цикл сдвига вправо
For A = 1 To 10           'повторяем цикл пока переменная А не достигнет значения 10
 Shiftlcd Right           'теперь сдвинем текст вправо
 Waitms 300               'задержка 300 миллисекунд
Next A                    'увеличиваем значение переменной А на 1

'продолжаем выполнение  программы
Wait 1                    'задержка 1 секунда

Home F                    'устанавливаем курсор на нижнюю строчку

Lcd "END PROGRAM"         'и выводим надпись

End                       'конец программы


результат на видео ниже: