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

Проект 39. Программный SPI и сдвиговый регистр

Сдвиговый регистр 74HC595 превращает три вывода контроллера в восемь выходов. Проект показывает программный SPI — простейший синхронный обмен, который легко наращивается каскадом.

Задача

Управлять восемью светодиодами через сдвиговый регистр по трём линиям.

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

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

  • PIC16F84A
  • кварц 4 МГц + 2×22 пФ
  • микросхема 74HC595
  • 8 светодиодов + 8×330 Ом

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

ВыводПодключение
RB0вход данных DS регистра
RB1тактовый вход SHCP
RB2вход защёлки STCP
Выходы Q0…Q7светодиоды через резисторы 330 Ом

Алгоритм

  1. Выставить очередной бит на линии данных, старшим вперёд.
  2. Дать фронт на тактовой линии — бит вдвигается в регистр.
  3. Повторить восемь раз для всего байта.
  4. Импульсом на линии защёлки перенести содержимое на выходы.

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

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

;=======================================================
; Проект 39. Программный SPI: сдвиговый регистр 74HC595
; PIC16F84A, 4 МГц
; RB0 — DATA (DS), RB1 — CLOCK (SHCP), RB2 — LATCH (STCP)
; Восемь светодиодов подключены к выходам регистра
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

#define DAT     PORTB,0
#define CLK     PORTB,1
#define LAT     PORTB,2

        cblock  0x0C
        d1, d2, bitcnt, obyte, pattern
        endc

        ORG     0x000
        goto    Start

Start
        bsf     STATUS,RP0
        clrf    TRISB           ; все три линии — выходы
        bcf     STATUS,RP0
        clrf    PORTB
        movlw   b'00000001'
        movwf   pattern

Main
        movf    pattern,w
        call    SpiSend         ; выдвигаем байт в регистр
        call    Delay200ms
        bcf     STATUS,C
        rlf     pattern,f       ; бегущий огонь
        movf    pattern,w
        btfsc   STATUS,Z        ; вышли за край?
        goto    Restart
        goto    Main
Restart
        movlw   b'00000001'
        movwf   pattern
        goto    Main

;--- выдвинуть байт из W, старший бит вперёд ---
SpiSend
        movwf   obyte
        movlw   .8
        movwf   bitcnt
SBit
        btfss   obyte,7         ; готовим бит на линии данных
        goto    S0
        bsf     DAT
        goto    SClock
S0
        bcf     DAT
SClock
        bsf     CLK             ; фронт защёлкивает бит в регистре
        nop
        bcf     CLK
        rlf     obyte,f
        decfsz  bitcnt,f
        goto    SBit
        bsf     LAT             ; переносим данные на выходы
        nop
        bcf     LAT
        return

Delay200ms
        movlw   .150
        movwf   d1
DL1     movlw   .250
        movwf   d2
DL2     nop
        decfsz  d2,f
        goto    DL2
        decfsz  d1,f
        goto    DL1
        return

        END

Пояснения

  • Защёлка отделяет процесс сдвига от выходов: пока байт вдвигается, светодиоды не мигают промежуточными состояниями.
  • Регистры каскадируются: выход переполнения одного идёт на вход данных следующего, и тремя выводами управляют 16, 24 и более линиями.
  • Аппаратный модуль MSSP делает то же самое быстрее, но программный вариант работает на любом контроллере и любых выводах.

Что дальше

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