AFON // радиотехник affonya@mail.ru
← Проекты на PIC

Проект 15. Вывод строк на LCD

Текст хранится в таблице знакогенератора и выводится посимвольно на обе строки дисплея. Проект показывает работу со строками в памяти программ.

Задача

Вывести две текстовые строки — по одной на каждую строку дисплея.

Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.

Что понадобится

  • PIC16F84A
  • кварц 4 МГц + 2×22 пФ
  • дисплей 16×2 на HD44780
  • подстроечник 10 кОм
  • резистор 10 кОм

Схема подключения

ВыводПодключение
RB4…RB7данные D4…D7
RB0RS
RB1E
RWна GND

Алгоритм

  1. Сохранить строки в таблицах команд retlw, завершив нулевым байтом.
  2. Установить курсор в начало первой строки командой 0x80.
  3. Читать символы по индексу и выводить, пока не встретится ноль.
  4. Перевести курсор командой 0xC0 и повторить для второй строки.

Листинг на ассемблере

Код проверен ассемблером и собирается без ошибок. Скачать: p15.asm · p15.hex (готовая прошивка).

;=======================================================
; Проект 15. Вывод строк на LCD (две строки, таблица символов)
; PIC16F84A, 4 МГц. RB4..RB7 — D4..D7, RB0 — RS, RB1 — E
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

#define RS      PORTB,0
#define E       PORTB,1

        cblock  0x0C
        d1, d2, temp, chr, idx
        endc

        ORG     0x000
        goto    Start

;--- строка 1: "AFON radio" ---
Str1
        addwf   PCL,f
        retlw   'A'
        retlw   'F'
        retlw   'O'
        retlw   'N'
        retlw   ' '
        retlw   'r'
        retlw   'a'
        retlw   'd'
        retlw   'i'
        retlw   'o'
        retlw   0x00            ; признак конца

;--- строка 2: "PIC 16F84A" ---
Str2
        addwf   PCL,f
        retlw   'P'
        retlw   'I'
        retlw   'C'
        retlw   ' '
        retlw   '1'
        retlw   '6'
        retlw   'F'
        retlw   '8'
        retlw   '4'
        retlw   'A'
        retlw   0x00

Start
        bsf     STATUS,RP0
        clrf    TRISB
        bcf     STATUS,RP0
        clrf    PORTB
        call    Delay20ms
        call    LcdInit

        movlw   0x80            ; курсор в начало 1-й строки
        call    LcdCmd
        clrf    idx
Loop1
        movf    idx,w
        call    Str1
        movwf   chr
        movf    chr,w
        btfsc   STATUS,Z        ; конец строки?
        goto    Line2
        movf    chr,w
        call    LcdData
        incf    idx,f
        goto    Loop1

Line2
        movlw   0xC0            ; начало 2-й строки
        call    LcdCmd
        clrf    idx
Loop2
        movf    idx,w
        call    Str2
        movwf   chr
        movf    chr,w
        btfsc   STATUS,Z
        goto    Stop
        movf    chr,w
        call    LcdData
        incf    idx,f
        goto    Loop2
Stop
        goto    Stop

LcdInit
        movlw   0x30
        call    SendNibble
        call    Delay5ms
        movlw   0x30
        call    SendNibble
        call    Delay5ms
        movlw   0x30
        call    SendNibble
        call    Delay5ms
        movlw   0x20
        call    SendNibble
        call    Delay5ms
        movlw   0x28
        call    LcdCmd
        movlw   0x0C
        call    LcdCmd
        movlw   0x06
        call    LcdCmd
        movlw   0x01
        call    LcdCmd
        call    Delay5ms
        return

LcdCmd
        movwf   chr
        bcf     RS
        goto    SendByte
LcdData
        movwf   chr
        bsf     RS
SendByte
        movf    chr,w
        andlw   0xF0
        call    SendNibble
        swapf   chr,w
        andlw   0xF0
        call    SendNibble
        call    Delay5ms
        return

SendNibble
        movwf   temp
        movf    PORTB,w
        andlw   0x0F
        iorwf   temp,w
        movwf   PORTB
        bsf     E
        nop
        nop
        bcf     E
        return

Delay5ms
        movlw   .10
        movwf   d1
X1      movlw   .165
        movwf   d2
X2      nop
        decfsz  d2,f
        goto    X2
        decfsz  d1,f
        goto    X1
        return

Delay20ms
        call    Delay5ms
        call    Delay5ms
        call    Delay5ms
        call    Delay5ms
        return

        END

Пояснения

  • У HD44780 адреса строк не идут подряд: первая строка начинается с 0x00, вторая — с 0x40, поэтому команды 0x80 и 0xC0.
  • Нулевой байт как признак конца строки позволяет выводить текст любой длины одной подпрограммой.
  • Кириллицы в стандартном знакогенераторе нет — либо берут дисплей с русской прошивкой, либо загружают свои символы в CGRAM.

Что дальше

Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.