Программа взаимодействия PIC16 и индикаторов ЖК
Программа инициализации LCD дисплея
В данной статье я приведу пример одного из вариантов программы инициализации жидкокристаллического алфавитно-цифрового индикатора на платформе контроллера HD44780 или KS0066 для начинающих программистов на языке ассемблер применительно к микроконтроллерам PIC16.
Данная программа является частью программы для измерителя температуры и влажности, описанного в статье «Измеритель влажности и температуры с ЖКИ». Для удобства работы со статьей и исходным файлом программы лучше сперва-наперво сразу скачать проект, распечатать исходный файл и положить его перед собой. При написании программы инициализации ЖКИ дисплея, записи команд и вывода символов на индикатор, лучше пользоваться созданными для этой цели макросами. Смотрим скрин.
После директив замены текста идут макросы – маленькие программки, к которым можно обращаться из основной программы сколько угодно и когда угодно. Первый макрос — impuls_E, обеспечивает на линии Е, линии стробирования и синхронизации, получение стробирующего импульса. Строка 14 – устанавливает на линии логическую единицу, через две псевдокоманды NOP, строка17 – устанавливает логический ноль. Таким образом мы получаем на линии Е положительный импульс длительностью 2 мксек при частоте кварцевого генератора 4 мГц. Следующий макрос Load_Znak, Позволяет нам загрузить код символа в регистр DR, для вывода его на индикатор. Можно заметить, что в этом макросе есть обращение к другому макросу, написанному ниже. Рассмотрим макрос send_LCD. Строка 26 – читаем содержимое регистра Write_data, т.е. код символа, который должен в нем находиться. Строка – 27, меняем местами старший и младший полубайты регистра. Строка – 28, выделяем старший полубайт кода символа, который уже находится в младшем полубайте и выдаем эти данные в порт В. Дело в том, что запись данных при 4-х разрядном режиме работы контроллера индикатора, происходит последовательно, сперва старший полубайт регистра, потом младший – строка 31… 33. После передачи полубайт, обязательно должен быть сформирован стробирующий импульс. Что мы и видим, строка 30 и 34. Для того, что бы контроллер дисплея успел обработать информацию, в макрос введена временная задержка, равная 200 микросекунд. После созданных нами макросов идет стандартная процедура инициализации микроконтроллера. В статье «Жидкокристаллические алфавитно-цифровые индикаторы» я рассказал об основных свойствах LCD дисплеев и коснулся темы создания своих символов. Как я уже говорил, в моих индикаторах нет символа градуса. Вот его и загрузим в знакогенератор индикатора. Для этого напишем небольшую подпрограмму, которая должна находится за процедурой инициализации микроконтроллера и впереди основной программы.Начинается подпрограмма с 69 строки, где мы заносим код адреса в области CGRAM, 40h — под этим адресом будет храниться первый пользовательский адрес. Смотрим скриншот 2.
Так как каждый символ занимает восемь регистров памяти, то следующий созданный нами символ будет начинаться с адреса 40h + 08h = 48h. Следующий – 48h + 08h = 50h. Не забудьте, что сложение происходит в шестнадцатеричной системе счисления. И так, строки 69 и 70 – загрузка начального адреса символа. Далее идет поочередная запись восьми байт кода символа. Код символа градуса мы возьмем из программы LCDCC.
Придется немного повторить то, что было в статье «Жидкокристаллические алфавитно-цифровые индикаторы». Смотрим скриншот этой программы. Нажатием на ячейки матрицы, мы рисуем нужный символ, в данном случае это символьный значок градуса. Внизу нам программа сразу пишет коды выбранных точек матрицы. Теперь нам необходимо эти коды записать в контроллер индикатора. Что мы и сделали. Теперь мы дошли до инициализации самого индикатора. Смотрим скриншот 3.
Перед инициализацией для примера запишем данные в регистры вывода значений на индикатор. Введем, например, значение температуры 21,7 градусов. Потом мы создадим проект в протеусе и посмотрим, что у нас получилось. И так. Скриншот 3, строки 88… 93 – запись чисел в регистры. Инициализация начинается с метки InitLCD, как и положено ждем не менее 15 ms. После паузы, строки 98… 100, записываем в регистр Reg_3 число три – это будет количество раз передачи команды 30h = b’0011 0000’ (30h). И три записываем в регистр порта В, для последующей записи в контроллер индикатора, это число три находится в старшем полубайте команды. Формируем стробирующий импульс, строка 102, выдерживаем паузу 5 ms. Возвращаемся на метку Setloop. Посылаем команду пока не обнулится регистр Reg_3, т.е. три раза. После передачи этой команды, контроллер индикатора будет готов к работе, но в 8-ми разрядном режиме. Теперь переведем его в 4-х разрядный режим. Для этого перешлем команду 20h. Имейте в виду, что команды записываются в контроллер индикатора в 4-х разрядном режиме. Значит так, имеем команду 20h или 0010 0000. Так как в 4-х разрядном режиме команды передаются в два этапа, сперва данные старшего полубайта регистра, то мы заносим двойку в регистр порта В и записываем в контроллер индикатора, а так как младший полубайт пустой, то мы ничего и не передаем.
После записи 2 в порт В, стробируем линию Е и делаем паузу в 200 us. Теперь индикатор будет работать в 4-х разрядном режиме. Следующая команда, это команда установки режима работы – две строки, шрифт — 5×7. Код команды 28h. Далее идет команда 0С на включение индикатора. Ну, а дальше, я думаю, разберетесь. Да, еще немного. В протеусе, созданный нами символ значка градуса выводится не корректно, выводит две точки, хотя в реальности все работает нормально. Смотрим фото. Успехов.
Необходимые файлы в архиве.
Один комментарий к “Программа взаимодействия PIC16 и индикаторов ЖК”
Спасибо, буду изучать Ваш код. А Вы работали с китайским модулем «IC I2C TWI последовательный интерфейс SPI порт платы 1602» ?
Ранее, благодаря Вам, изучил ТМ1637, MAX7219 соответственно протоколы передачи данных и мн.другое.