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

Проект 11. Семисегментный индикатор

Вывод цифр на семисегментный индикатор через таблицу знакогенератора. Проект знакомит с табличным преобразованием — приёмом, который используется во всех задачах индикации.

Задача

Последовательно выводить цифры от 0 до 9 на семисегментный индикатор.

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

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

  • PIC16F84A
  • кварц 4 МГц + 2×22 пФ
  • индикатор с общим катодом
  • 7 резисторов 330 Ом
  • резистор 10 кОм

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

ВыводПодключение
RB0…RB6сегменты a…g, каждый через резистор 330 Ом
Общий катодна GND
MCLRчерез 10 кОм на +5 В

Алгоритм

  1. Составить таблицу кодов: каждой цифре — свой набор сегментов.
  2. Получить код командой addwf PCL,f — вычисляемый переход по таблице.
  3. Вывести код в порт B и выдержать паузу.
  4. Увеличить цифру, после 9 вернуться к нулю.

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

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

;=======================================================
; Проект 11. Статический 7-сегментный индикатор
; PIC16F84A, 4 МГц. Индикатор с ОБЩИМ КАТОДОМ на RB0..RB6
; Счёт 0..9 с интервалом ~1 с
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

        cblock  0x0C
        d1, d2, digit
        endc

        ORG     0x000
        goto    Start

;--- таблица сегментов (общий катод): dp g f e d c b a ---
Table
        addwf   PCL,f           ; смещение по W
        retlw   b'00111111'     ; 0
        retlw   b'00000110'     ; 1
        retlw   b'01011011'     ; 2
        retlw   b'01001111'     ; 3
        retlw   b'01100110'     ; 4
        retlw   b'01101101'     ; 5
        retlw   b'01111101'     ; 6
        retlw   b'00000111'     ; 7
        retlw   b'01111111'     ; 8
        retlw   b'01101111'     ; 9

Start
        bsf     STATUS,RP0
        clrf    TRISB           ; порт B — выходы на сегменты
        bcf     STATUS,RP0
        clrf    digit

Main
        movf    digit,w
        call    Table           ; получаем код сегментов
        movwf   PORTB
        call    Delay1s
        incf    digit,f
        movf    digit,w
        xorlw   .10             ; после 9 — снова 0
        btfsc   STATUS,Z
        clrf    digit
        goto    Main

Delay1s
        movlw   .255
        movwf   d1
DL1     movlw   .255
        movwf   d2
DL2     nop
        nop
        nop
        nop
        decfsz  d2,f
        goto    DL2
        decfsz  d1,f
        goto    DL1
        return

        END

Пояснения

  • Таблица работает через изменение счётчика команд: addwf PCL,f прибавляет W к адресу, и выполняется нужная строка retlw.
  • Вся таблица должна помещаться в одну страницу памяти (256 слов), иначе переход уйдёт не туда.
  • Для индикатора с общим анодом коды нужно инвертировать — сегмент зажигается нулём.

Что дальше

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