AVR Урок 12. LCD индикатор 16×2. Часть 3

 

Урок 12

Часть 3

 

LCD индикатор 16×2

 

Сегодня мы продолжим изучение жидкокристаллического индикатора символьного, который способен выводить определённые символы в две строки по 16 символов в каждую.

Вернёмся в проект Atmel Studio и, используя написанную в прошлой части функцию, передадим в контроллер дисплея двоичное число 11 три раза в функции LCD_ini, также применяя соответствующие задержки, взяв их из даташита

 

_delay_ms(15); //Ждем 15 мс (стр 45)

sendhalfbyte(0b00000011);

_delay_ms(4);

sendhalfbyte(0b00000011);

_delay_us(100);

sendhalfbyte(0b00000011);

_delay_ms(1);

 

Дальше передаём двоичное число 10 таким же образом

 

_delay_ms(1);

sendhalfbyte(0b00000010);

_delay_ms(1);

 

В некоторых даташитах пишут, что данное число нужно передавать 2 раза, но работает и с 1 передачей. Вы на своих дисплеях можете поэксперементировать и с 2 передачами числа 10.

В принципе, уже контроллер дисплея должен «догадаться», что мы его просим переключиться в 4 битный режим, и следующая команда будет же с полноправным байтом, переданным поочередно и причем в этой команде уже будет конкретная команда перевода в 4-битный режим. Но для полнорпавных команд мы напишем другую функцию sendbyte, расположив ее код после функции sendhalfbyte.

 

//—————————————-

void sendbyte(unsigned char c, unsigned char mode)

{

}

//—————————————-

 

В данную функцию мы будем передавать уже два аргумента, один — это данные, а другой это режим, то есть мы здесь будем говорить, данные мы будем передавать или команду. Начнем писать код функции.

Сначала мы с помощью условия узнаем, команда в нашу функцию пришла или данные, и среагируем на это установки в соответствующее состояние шины RS

 

void sendbyte(unsigned char c, unsigned char mode)

{

  if (mode==0) rs0;

  else rs1;

 

Добавим ещё одну переменную

 

else rs1;

unsigned char hc=0;

 

Сдвинем вправо на 4 пункта наш байт и отправим результат в данную переменную. Тем самым мы в младшую тетраду байта поместим старшую

 

unsigned char hc=0;

hc=c>>4;

 

 

Затем передадим сначала её в функцию sendhalfbyte, а затем и саму нетронутую переменную c. Не важно, что будет в её старшей части, так как функция sendhalfbyte работает только с младшей тетрадой.

 

  hc=c>>4;

  sendhalfbyte(hc); sendhalfbyte(c);

}

 

Ну и теперь, применяя вышенаписанную функцию, мы передаём следующий байт, взятый из даташита в функции LCD_ini

 

_delay_ms(1);

sendbyte(0b00101000, 0); //4бит-режим (DL=0) и 2 линии (N=1)

_delay_ms(1);

 

Здесь мы используем следующую команду

 

image08

 

Единичка в 5 бите нам говорит о том, что мы используем именно эту команду. Дальше идёт у нас бит DL, говорящий контроллеру дисплея о том, какую размерность передачи данных мы используем

 

image09

И, так как мы включаем режим 4-битной передачи, то в 4 бите у нас будет 0.

Следующий бит — N, который отвечает за колисество строк

 

image10

 

У нас 2 строки, поэтому в 3 бит поставим 1.

F — это размер символа

 

image11

 

Здесь также 0.

 

 

Передадим следующий байт

 

_delay_ms(1);

sendbyte(0b00001100, 0); //включаем изображение на дисплее (D=1), курсоры никакие не включаем (C=0, B=0)

_delay_ms(1);

 

Посмотрим данную команду в документации

 

image12

 

Соответственно, здеь 3 бит, установленный в единицу, говорит о том, что мы применяем именно эту команду, вторая единичка — это параметр D

 

image13

 

Данной единичкой мы включаем дисплей.

Следующий бит — это параметр C

 

image14

 

Здесь мы включаем видимость курсора. Смотреть на курсор нам ни к чему, поэтому 0.

Далее бит B

 

image15

 

Этот бит отвечает за мигание дисплея. Также ставим в 0.

Передаём последнюю команду в функции инициализации дисплея

 

  _delay_ms(1);

  sendbyte(0b00000110, 0); //курсор (хоть он у нас и невидимый) будет двигаться влево

  _delay_ms(1);

}

 

Посмотрим данную команду в документации

 

image16

 

Бит 2 говорит о том, что мы используем именно данную команду.

Следующий бит — I/D

 

image17

 

Данный бит отвечает за движение курсора в ту или иную сторону при вводе данных. Хотя у нас курсор и невидимый, двигаемся мы влево, поэтому поставим 1.

Следующий бит — SH

 

image19

 

Данный бит отвечает за смещение дисплея. Так как мы это не применяем, то 0.

На этом инициализация закончена.

В следующей части урока мы уже попробуем поработать с выводом данных на экран дисплея.

 

 

 

Техническая документация на дисплей

Техническая документация на контроллер дисплея HD44780

 

Программатор и дисплей можно приобрести здесь:

Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером

Дисплей LCD 16×2

 

 

Смотреть ВИДЕОУРОК в EuTube (нажмите на картинку)

AVR LCD индикатор 16×2

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

AVR LCD индикатор 16×2

8 комментариев к “AVR Урок 12. LCD индикатор 16×2. Часть 3

  1. Огромное спасибо за серию уроков. Раньше программировал только на Бейсике. Но вот жизнь заставила перейти на Си. Ваша статья это то что надо. СПАСИБО.

  2. Спасибо за уроки, мне очень нравится что без библиотек, с самого нуля так сказать.
    Мне не понятен один момент.
    После того как мы передали байт 0b00000010, по документации в алгоритме инициализации я ее и предыдущие байты нашел, а почему мы следующий байт взяли из Function set никак не пойму.
    Поясните пожалуйста.

  3. void sendhalfbyte(unsigned char c)
    {
    c<<=4;
    e1; //включаем линию Е
    _delay_us(50);
    PORTD&=(1<<PD0); //D4
    PORTC&=(1<<PC5); //D5
    PORTD&=(1<<PD1); //D6
    PORTD&=(1<<PD2); //D7
    PORTC|=c[5];
    PORTD|=c;
    e0; //выключаем линию Е
    _delay_us(50);
    }
    Как правильно раскидать d4 d5 d6 d7 на разные выводы?

  4. «В некоторых даташитах пишут, что данное число нужно передавать 2 раза, но работает и с 1 передачей. Вы на своих дисплеях можете поэксперементировать и с 2 передачами числа 10.»

    за каким-то лешим сразу прописал две отсылки числа 10, и полдня бился с протеусом, почему он у меня не показывает цифры на экране. Дисплей Протеуса не работает при отсылке числа 10 два раза, шлите только один раз.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*