Задача
Управлять восемью светодиодами через сдвиговый регистр по трём линиям.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- микросхема 74HC595
- 8 светодиодов + 8×330 Ом
Схема подключения
| Вывод | Подключение |
|---|---|
| RB0 | вход данных DS регистра |
| RB1 | тактовый вход SHCP |
| RB2 | вход защёлки STCP |
| Выходы Q0…Q7 | светодиоды через резисторы 330 Ом |
Алгоритм
- Выставить очередной бит на линии данных, старшим вперёд.
- Дать фронт на тактовой линии — бит вдвигается в регистр.
- Повторить восемь раз для всего байта.
- Импульсом на линии защёлки перенести содержимое на выходы.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: 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.