Программная реализация обмена данными со знакосинтезирующим ЖКИ (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-файл

radiohlam.ruпрограммированиепромышленные микрухи и девайсы

Понравилась статья? Поделись с друзьями!

Обсудить эту статью на форуме

 
Rambler's Top100 © 2009 - Материалы сайта охраняются законом об авторском праве