В данной статье приведен пример программы, реализующей обмен данными микроконтроллера PIC16F628A с HD44780, KS0066 -совместимым знакосинтезирующим ЖКИ (для схемы из статьи "Подключение знакосинтезирующего ЖКИ к контроллеру (PIC16F628A)".
Приведенная программа предполагает использование ЖКИ 16х2, восьмибитного интерфейса и не анализирует состояние контроллера ЖКИ (BUSY/READY). Работа программы заключается в выводе на ЖКИ текста "Radiohlam" в верхней строке (начиная с четвертой позиции) и текста "Радиохлам" в нижней строке (начиная с пятой позиции).
Алгоритм:
Подключение линий ЖКИ к портам контроллера:
E-RA0, RS-RA1, R/W-RA7, DB7-RB4, DB6-RB5, DB5-RB2, DB4-RB6, DB3-RB3, DB2-RB7, DB1-RA2, DB0-RA6
list p = 12f629 __config 03F30h ;*** Переменные ***************************************** CBLOCK 0x20 ; Начальный адрес блока пользовательской памяти T_ext ;таймер внешнего цикла T_int ;таймер внутреннего цикла T_n ;таймер начальной задержки M_byte ;байт посылки 7-й бит = DB7, 6-й бит = DB6 и т.д. ENDC ;**** Константы / Адреса регистров ********************** Cr1 equ .50 ;длительность 1-й задержки 50 циклов Cr2 equ .25 ;длительность 2-й задержки 25х50 циклов Cr3 equ .200 ;длительность 3-й задержки 200х50 циклов Status equ 03h ; выбор банка TrisA equ 05h ; выбор направления работы выводов порта А TrisB equ 06h ; выбор направления работы выводов порта В PortA equ 05h ; управление защелками порта А PortB equ 06h ; управление защелками порта В Cmcon equ 1Fh ; вкл/выкл компараторов ;******************************************************** org 0 ;*** ИНИЦИАЛИЗАЦИИЯ КОНТРОЛЛЕРА ************************* ;*** RA7, RA6 - выходы, RA5, RA4, RA3 - входы, RA2, RA1, RA0 - выходы ;*** RB7, RB6, RB5, RB4, RB3, RB2 - выходы, RB1, RB0 - входы start movlw .7 movwf Cmcon ; выключить компараторы clrf PortA ; инициализация защелок порта А clrf PortB ; инициализация защелок порта В bsf Status,5 ; Перейти в 1-й банк movlw .56 ; Записать конфигурацию порта A в аккумулятор. movwf TrisA ; Скопировать конфигурацию порта А из W в регистр TrisA movlw .3 ; Записать конфигурацию порта В в аккумулятор. movwf TrisB ; Скопировать конфигурацию порта B из W в регистр TrisB bcf Status,5 ; Перейти в 0-й банк ;*** ИНИЦИАЛИЗАЦИЯ ЖКИ ********************************** ;*** Пауза более 30 мс + FUNCTION SET ******************* movlw .56 ; DB7-0=00111000 8-битный интерф.,2-строчный ЖКИ,шрифт 5х8 movwf M_byte ; записать это значение в байт сообщения call in_port ; запись в порт bcf PortA, 1 ; RS=0 bcf PortA, 7 ; RW=0 call pause3 call zapis ; передача в ЖКИ ;*** Пауза более 39 мкс ********************************* call pause1 ;*** Продолжение инициализации DISPLAY ON/OFF MODE ****** movlw .14 ; DB7-0=00001110 - вкл.дисплей,вкл.курсор,выкл.мерцание movwf M_byte ; на RS и R/W уже установл. нужные уровни,т.к. с прошлой call in_port ; передачи они не изменились - заново их устан-ть не надо call zapis ; передача в ЖКИ ;*** Пауза более 39 мкс ********************************* call pause1 ;*** Продолжение инициализации DISPLAY CLEAR ************ movlw .1 ; DB7...DB0=00000001 movwf M_byte ; записать это значение в байт сообщения call in_port ; запись в порт call zapis ; передача в ЖКИ ;*** Пауза более 1,53 мс ******************************** call pause2 ;*** Продолжение инициализации ENTRY MODE SET *********** movlw .6 ; DB7-0=00000110 - автосдв. курсора вправо,сдв.диспл.выкл. movwf M_byte ; записать это значение в байт сообщения call in_port ; запись в порт call zapis ; передача в ЖКИ ;*** Пауза более 39 мкс ********************************* call pause1 ;*** Инициализация дисплея закончена ******************** ;*** ВЫВОД ТЕКСТА *************************************** ;*** Set DDRAM ADDRESS ********************************** movlw .131 ; db7=1, address=03h movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .82 ; symbol="R" movwf M_byte call in_port bsf PortA,1 ; RS=1 call zapis call pause1 ;*** Вывод символа ************************************** movlw .97 ; symbol="a" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .100 ; symbol="d" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .105 ; symbol="i" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .111 ; symbol="o" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .104 ; symbol="h" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .108 ; symbol="l" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .97 ; symbol="a" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .109 ; symbol="m" movwf M_byte call in_port call zapis call pause1 ;*** Set DDRAM ADDRESS ********************************** movlw .196 ; db7=1, address=44h movwf M_byte call in_port bcf PortA,1 ; RS=0 call zapis call pause1 ;*** Вывод символа ************************************** movlw .80 ; symbol="Р" movwf M_byte call in_port bsf PortA,1 ; RS=1 call zapis call pause1 ;*** Вывод символа ************************************** movlw .97 ; symbol="a" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .227 ; symbol="д" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .184 ; symbol="и" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .111 ; symbol="o" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .120 ; symbol="х" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .187 ; symbol="л" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .97 ; symbol="a" movwf M_byte call in_port call zapis call pause1 ;*** Вывод символа ************************************** movlw .188 ; symbol="м" movwf M_byte call in_port call zapis call pause1 ;******************************************************** stop nop ; конец программы (просто зацикливание) goto stop ;*** ПРОЦЕДУРЫ ****************************************** ;*** Процедура записи в LCD ***************************** zapis bsf PortA,0 ; E=1 - запись nop ; 1 мкс - пауза для записи nop ; 1 мкс - пауза для записи bcf PortA,0 ; E=0 - выключить запись return ;*** Процедура Паузы 1 (>39 мкс) ************************ pause1 movlw Cr1 movwf T_int ; загрузить значение таймера для паузы в T_int cikl1 nop nop nop nop nop nop decfsz T_int,1 goto cikl1 return ;*** Процедура Паузы 2 (>1.53 мс) *********************** pause2 movlw Cr2 movwf T_ext ; загрузить значение для внешнего цикла cikl2 movlw Cr1 movwf T_int ; загрузить значение для внутреннего цикла cikl3 decfsz T_int,1 goto cikl3 ; внутренний цикл decfsz T_ext,1 goto cikl2 ; внешний цикл return ;*** Процедура Паузы 3 (>30 мс) ************************* pause3 movlw Cr3 movwf T_n ; загрузить значение для внешнего цикла cikl4 movlw Cr1 movwf T_int ; загрузить значение для внутреннего цикла cikl5 nop decfsz T_int,1 goto cikl5 ; внутренний цикл decfsz T_n,1 goto cikl4 ; внешний цикл return ;*** Процедура записи байта сообщения в защелки портов ** in_port btfsc M_byte,7 ; если 7-й бит посылки = 0, - следующ. команда пропуск-ся bsf PortB,4 ; DB7=1 btfss M_byte,7 ; если 7-й бит посылки =1, - следующ. команда пропуск-ся bcf PortB,4 ; DB7=0 ;------------------------------------ btfsc M_byte,6 ; если 6-й бит посылки = 0, - следующ. команда пропуск-ся bsf PortB,5 ; DB6=1 btfss M_byte,6 ; если 6-й бит посылки =1, - следующ. команда пропуск-ся bcf PortB,5 ; DB6=0 ;------------------------------------ btfsc M_byte,5 ; если 5-й бит посылки = 0, - следующ. команда пропуск-ся bsf PortB,2 ; DB5=1 btfss M_byte,5 ; если 5-й бит посылки =1, - следующ. команда пропуск-ся bcf PortB,2 ; DB5=0 ;------------------------------------ btfsc M_byte,4 ; если 4-й бит посылки = 0, - следующ. команда пропуск-ся bsf PortB,6 ; DB4=1 btfss M_byte,4 ; если 4-й бит посылки =1, - следующ. команда пропуск-ся bcf PortB,6 ; DB4=0 ;------------------------------------ btfsc M_byte,3 ; если 3-й бит посылки = 0, - следующ. команда пропуск-ся bsf PortB,3 ; DB3=1 btfss M_byte,3 ; если 3-й бит посылки =1, - следующ. команда пропуск-ся bcf PortB,3 ; DB3=0 ;------------------------------------ btfsc M_byte,2 ; если 2-й бит посылки = 0, - следующ. команда пропуск-ся bsf PortB,7 ; DB2=1 btfss M_byte,2 ; если 2-й бит посылки =1, - следующ. команда пропуск-ся bcf PortB,7 ; DB2=0 ;------------------------------------ btfsc M_byte,1 ; если 1-й бит посылки = 0, - следующ. команда пропуск-ся bsf PortA,2 ; DB1=1 btfss M_byte,1 ; если 1-й бит посылки =1, - следующ. команда пропуск-ся bcf PortA,2 ; DB1=0 btfsc M_byte,0 ; если 0-й бит посылки = 0, - следующ. команда пропуск-ся bsf PortA,6 ; DB0=1 btfss M_byte,0 ; если 0-й бит посылки =1, - следующ. команда пропуск-ся bcf PortA,6 ; DB0=0 ;------------------------------------ return end |