AVR: подключаем lcd hd44780

hd44780Существует множество различных LCD дисплеев, но наиболее простыми в освоении являются текстовые дисплеи на основе контроллера hd44780, которые стали де-факто стандартом на  символьные ЖКИ.

Описание контроллера LCD hd44780

  • встроенный знакосинтезатор, для вывода символа достаточно записать его код в соответствующую область (DDRAM) памяти контроллера
  • параллельный интерфейс,  4 или 8 линии данных, три управляющих линии
  • возможность загружать  в память знакосинтезатора  (CGRAM)  произвольные символы

Система команд lcd контроллера hd44780

Очистить дисплей

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
0 0 0 0 0 0 0 1

Переход в начало экрана

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
0 0 0 0 0 0 1 *

Сдвиг курсора или экрана при записи символа

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
0 0 0 0 0 1 I/D S

I/D – режим увеличения/уменьшения адреса DDRAM: 0 – адрес уменьшается (сдвиг влево) , 1 –  адрес увеличивается ( сдвиг вправо )
S –  сдвиг дисплея : 0 – сдвига нет, 1 – сдвиг происходит согласно параметру I/D

Вкл/выкл дисплей, курсор, мигание

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
0 0 0 0 1 D C B

D – Вкл/выкл  дисплея:  0 – дисплей выключен, 1 – дисплей включен
C – Вкл/выкл курсора: 0 – курсор выключен, 1 – курсор включен
B – Вкл/выкл мерцания: 0 – мерцающий курсор включен, 1 – мерцающий курсор выключен

 

Команда сдвига курсора/экрана

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
0 0 0 1 S/C R/L * *

S/C —  сдвиг содержимого экрана: 0 — сдвигается курсор, 1 — сдвигается экран.
R/L  — направление сдвига: 0 — влево, 1 — вправо.

Разрядность шины данных, кол-во строк, размер шрифта

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
0 0 1 DL N F * *

DL –  разрядность шины:  0 – 4 бита, 1 – 8 бит
N –  количество строк дисплея:  0 – одна строка, 1 – две строки
F –  шрифт: 0 –  5×8, 1 –  5×11

Установка адреса CCGRAM

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
0 1 A5 A4 A3 A2 A1 A0

Установка адреса DDRAM

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
1 A6 A5 A4 A3 A2 A1 A0

 

Кодовая таблица lcd контроллера hd44780

Русифицированные контроллеры hd44780 имеют следующую таблицу символов:

hd44780 codepage

По таблице видно, что коды латинских  символов совпадают со стандартной кодировкой windows (CP1252), а кириллические символы есть только те, для которых нет аналогичных по начертанию латинских символов.  По этому в программе потребуется перекодировка из кодов символов windows в коды lcd контроллера hd44780.

Назначение выводов контроллера LCD hd44780

  1. Земля, общий провод, GND
  2. Напряжение питания, Vcc
  3. Регулировка контрастности, Vo (VEE )
  4. Выбор регистра RS ( A0) : 0 — команды, 1 — данные
  5. Выбор операции, R/W:  1 — чтение, 0  —  запись
  6.  Разрешение на выполнение операции, E.   По заднему фронту  на этом выводе происходит запись или чтение
  7. Bit 0
  8. Bit 1
  9. Bit 2
  10. Bit 3
  11. Bit 4
  12. Bit 5
  13. Bit 6
  14. Bit 7
  15. Питание подсветки (+)
  16. Питание подсветки ( — )

При подключении по 4-х битной схеме  для шины данных используются выводы 11 , 12, 13,  14.

Схема подключения LCD hd44780 к avr atmega

Рассмотрим 8-битную схему подключения.LCD AVR

Линии данных подключены к порту D микроконтроллера avr. Управляющие сигналы подключены к порту С: RS — PC0, RW — PC1, E — PC2.

В принципе, так как чтение из контроллера использоваться не будет,  линию RW можно подключить к земле.

Подстроечный резистор нужен для регулировки контрастности.

Программа для микроконтроллера avr

Для доступа к портам avr atmega заведем макросы:

//линии данных
#define LCD_DATA PORTD
#define LCD_DATA_DDR DDRD
 
//управляющие линии
#define LCD_CTRL PORTC
#define LCD_CTRL_DDR DDRC
 
#define LCD_RS  _BV( 0 )  /*0 - команды, 1 - данные*/
#define LCD_RW  _BV( 1 )  /*0 - запись, 1 - чтение*/
#define LCD_E   _BV( 2 )  
 
#define lcd_set_e()   LCD_CTRL |= LCD_E  /*выставить в 1 линию E*/
#define lcd_set_rs()  LCD_CTRL |= LCD_RS /*выставить в 1 линию RS*/
#define lcd_set_rw()  LCD_CTRL |= LCD_RW /*выставить в 1 линию RW*/
 
#define lcd_clear_e()  LCD_CTRL &= ~LCD_E  /*выставить в 0 линию E*/
#define lcd_clear_rs() LCD_CTRL &= ~LCD_RS /*выставить в 0 линию RS*/
#define lcd_clear_rw() LCD_CTRL &= ~LCD_RW /*выставить в 0 линию RW*/

Функция генерирующая строб на линии E. По этому стробу производится запись команды/данных   или чтение.

static void lcd_pulse_e(void)
{
  lcd_set_e();
  _delay_us(1);
  lcd_clear_e();
  _delay_us(1);
}

Функция ожидания готовности контроллера hd44780. Можно считывать статусный бит, но мы будем просто делать паузу, в течение которой команда будет гарантированно выполнена.

static void lcd_wait(void)
{
  _delay_us( 40 );
}

Функция записи байта в lcd контроллер. Команда это или данные, определяется уровнем, который был выставлен на линии RS перед вызовом данной функции.

static void lcd_write(unsigned char data)
{
  LCD_DATA = data;
  lcd_pulse_e();
  lcd_wait();
}

Для облегчения настройки контроллера hd44780 заведем макросы, описывающие систему команд:

#define LCD_CLR              _BV( 0 ) /*Очистить дисплей*/
 
#define LCD_HOME             _BV( 1 ) /*Переход в начало экрана*/
 
#define LCD_MODE             _BV( 2 ) /*Сдвиг курсора или экрана при записи символа*/
#define LCD_MODE_INC         _BV( 1 ) 
#define LCD_MODE_SHIFT       _BV( 0 ) 
 
#define LCD_ON               _BV( 3 ) /*Вкл/выкл дисплей, курсор, мигание*/
#define LCD_ON_DISPLAY       _BV( 2 ) 
#define LCD_ON_CURSOR        _BV( 1 ) 
#define LCD_ON_BLINK         _BV( 0 )
 
#define LCD_SHIFT            _BV( 4 ) /*Команда сдвига курсора/экрана*/
#define LCD_SHIFT_DISPLAY    _BV( 3 )
#define LCD_SHIFT_RIGHT      _BV( 2 )
 
#define LCD_FUNCTION         _BV( 5 ) /*Разрядность шины данных, кол-во строк, размер шрифта*/
#define LCD_FUNCTION_8BIT    _BV( 4 )
#define LCD_FUNCTION_2LINES  _BV( 3 )
#define LCD_FUNCTION_10DOTS  _BV( 2 )
 
#define LCD_SET_CGRAM_ADDR   _BV( 6 ) /*Установка адреса CGRAM*/
 
#define LCD_SET_DDRAM_ADDR   _BV( 7 ) /*Установка адреса DDRAM*/

Функция инициализации lcd контроллера hd44780.

void lcd_init( void )
{
  //настраиваем на выход порт данных и управляющие пины
  LCD_DATA_DDR = 0xFF;
  LCD_CTRL_DDR |= ( LCD_E | LCD_RW | LCD_RS );
 
  lcd_clear_rw();   //переключаемся в режим записи 
  lcd_clear_rs();   //записывать будем команды
 
  _delay_ms(15); 
  //выбираем 8-ми битную шину и 2х строчный режим
  lcd_write( LCD_FUNCTION | LCD_FUNCTION_8BIT | LCD_FUNCTION_2LINES );
  _delay_ms(5); 
  lcd_write( LCD_FUNCTION | LCD_FUNCTION_8BIT | LCD_FUNCTION_2LINES );
  _delay_us( 100 ); 
  lcd_write( LCD_FUNCTION | LCD_FUNCTION_8BIT | LCD_FUNCTION_2LINES );
 
  //разрешаем автоматическое увеличение текущей позиции 
  lcd_write( LCD_MODE | LCD_MODE_INC ); 
 
  //включаем дисплей
  lcd_write( LCD_ON | LCD_ON_DISPLAY  ); 
 
  //установка начального адреса 
  lcd_write( LCD_SET_DDRAM_ADDR | 0x00 ); 
 
  lcd_set_rs(); //теперь будем записывать данные, выводимые на ЖКИ
}

Функция вывода символа, символ должен быть в кодировке win1251, для конвертирования в коды lcd контроллера  hd44780 используется таблица lcd_codepage.

void lcd_putc(unsigned char c) 
{
    if ( c == 0xA8) {     //буква 'Ё'
      c = 0xA2; 
    }
    else if ( c ==0xB8) { //буква 'ё'
      c = 0xB5; 
    }
    else if ( c >= 0xC0 ) {
      c = lcd_codepage[ c - 0xC0 ];
    }
    lcd_write( c );
}
 
unsigned  char  lcd_codepage[]=
{
  0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa3,0xa4,
  0xa5,0xa6,0x4b,0xa7,0x4d,0x48,0x4f,0xa8,
  0x50,0x43,0x54,0xa9,0xaa,0x58,0xe1,0xab,
  0xac,0xe2,0xad,0xae,0x62,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_puts( const char *str)
{
  while( *str ) {
    lcd_putc( *str++ );
  }
}

Функция изменения текущей позиции курсора, x — номер символа в строке, y — номер строки

void lcd_goto( unsigned char x, unsigned char y )
{
  unsigned char address = x;
  if ( y ) {
    address += 0x40;
  }
  lcd_clear_rs();   
  lcd_write( LCD_SET_DDRAM_ADDR |  address ); 
  lcd_set_rs(); 
}

Функция main

int main( void )
{
  lcd_init();
  lcd_goto(0,0);
  lcd_puts("mainloop.ru/avr-" );
  lcd_goto(0,1);
  lcd_puts("atmega/lcd.html" );
  for(;;) {  
  }
  return 0;
}

Скачать исходники примера для avr-gcc (WinAvr) можно тут.

Запись опубликована в рубрике Микроконтроллеры avr с метками , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>