Урок 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);
Здесь мы используем следующую команду
Единичка в 5 бите нам говорит о том, что мы используем именно эту команду. Дальше идёт у нас бит DL, говорящий контроллеру дисплея о том, какую размерность передачи данных мы используем
И, так как мы включаем режим 4-битной передачи, то в 4 бите у нас будет 0.
Следующий бит — N, который отвечает за колисество строк
У нас 2 строки, поэтому в 3 бит поставим 1.
F — это размер символа
Здесь также 0.
Передадим следующий байт
_delay_ms(1);
sendbyte(0b00001100, 0); //включаем изображение на дисплее (D=1), курсоры никакие не включаем (C=0, B=0)
_delay_ms(1);
Посмотрим данную команду в документации
Соответственно, здеь 3 бит, установленный в единицу, говорит о том, что мы применяем именно эту команду, вторая единичка — это параметр D
Данной единичкой мы включаем дисплей.
Следующий бит — это параметр C
Здесь мы включаем видимость курсора. Смотреть на курсор нам ни к чему, поэтому 0.
Далее бит B
Этот бит отвечает за мигание дисплея. Также ставим в 0.
Передаём последнюю команду в функции инициализации дисплея
_delay_ms(1);
sendbyte(0b00000110, 0); //курсор (хоть он у нас и невидимый) будет двигаться влево
_delay_ms(1);
}
Посмотрим данную команду в документации
Бит 2 говорит о том, что мы используем именно данную команду.
Следующий бит — I/D
Данный бит отвечает за движение курсора в ту или иную сторону при вводе данных. Хотя у нас курсор и невидимый, двигаемся мы влево, поэтому поставим 1.
Следующий бит — SH
Данный бит отвечает за смещение дисплея. Так как мы это не применяем, то 0.
На этом инициализация закончена.
В следующей части урока мы уже попробуем поработать с выводом данных на экран дисплея.
Предыдущая часть Программирование МК AVR Следующая часть
Техническая документация на дисплей
Техническая документация на контроллер дисплея HD44780
Программатор и дисплей можно приобрести здесь:
Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером
Смотреть ВИДЕОУРОК (нажмите на картинку)
Огромное спасибо за серию уроков. Раньше программировал только на Бейсике. Но вот жизнь заставила перейти на Си. Ваша статья это то что надо. СПАСИБО.
«Этот бит отвечает за мигание дисплея.»
Опечатка, имелось ввиду мигание курсора.
Здравствуйте, что означает запись sendbyte(0b00101000, 0);
а точнее 0 в скобках после запятой?
означает режим передачи команды процессору дисплея
Спасибо за уроки, мне очень нравится что без библиотек, с самого нуля так сказать.
Мне не понятен один момент.
После того как мы передали байт 0b00000010, по документации в алгоритме инициализации я ее и предыдущие байты нашел, а почему мы следующий байт взяли из Function set никак не пойму.
Поясните пожалуйста.
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 на разные выводы?
Единичка в 5 бите нам говорит о том, что мы используем именно эту команду.
Почему,откуда мы это видим?
«В некоторых даташитах пишут, что данное число нужно передавать 2 раза, но работает и с 1 передачей. Вы на своих дисплеях можете поэксперементировать и с 2 передачами числа 10.»
за каким-то лешим сразу прописал две отсылки числа 10, и полдня бился с протеусом, почему он у меня не показывает цифры на экране. Дисплей Протеуса не работает при отсылке числа 10 два раза, шлите только один раз.