Наш канал в telegram

Программная реализация обмена данными со знакосинтезирующим ЖКИ (PIC16F628A). Часть 1. Восьмибитный интерфейс

В данной статье приведен пример программы, реализующей обмен данными микроконтроллера 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

[свернуть]

Скачать готовую прошивку и asm-файл

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