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

Проект 02. Бегущие огни на 8 светодиодах

Огонёк последовательно пробегает по восьми светодиодам. Проект знакомит с командами сдвига и работой со всем портом целиком.

Задача

Зажигать светодиоды по очереди, создавая эффект бегущего огня.

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

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

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

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

ВыводПодключение
RB0…RB7восемь светодиодов, каждый через резистор 330 Ом на GND
MCLRчерез 10 кОм на +5 В
OSC1/OSC2кварц 4 МГц

Алгоритм

  1. Весь порт B настроить на выход (clrf TRISB).
  2. Записать в порт код 00000001 — горит первый светодиод.
  3. Сбросить флаг переноса и командой rlf сдвинуть содержимое порта влево.
  4. Повторить восемь раз, затем начать заново.

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

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

;=======================================================
; Проект 02. Бегущие огни на 8 светодиодах
; PIC16F84A, 4 МГц. Светодиоды RB0..RB7 через 330 Ом
;=======================================================
        LIST    p=16F84A
        #include <p16f84a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

        cblock  0x0C
        d1, d2, cnt
        endc

        ORG     0x000
        goto    Start

Start
        bsf     STATUS,RP0
        clrf    TRISB
        bcf     STATUS,RP0

Main
        movlw   b'00000001'     ; зажигаем младший разряд
        movwf   PORTB
        movlw   .8
        movwf   cnt
Shift
        call    Delay150
        bcf     STATUS,C        ; сдвигаем огонёк влево
        rlf     PORTB,f
        decfsz  cnt,f
        goto    Shift
        goto    Main

Delay150
        movlw   .150
        movwf   d1
DL1     movlw   .200
        movwf   d2
DL2     nop
        decfsz  d2,f
        goto    DL2
        decfsz  d1,f
        goto    DL1
        return

        END

Пояснения

  • Команда rlf сдвигает байт влево через флаг переноса C. Поэтому перед каждым сдвигом переносом управляем сами: bcf STATUS,C.
  • Скорость бега задаётся подпрограммой задержки — уменьшите константы, и огонь побежит быстрее.
  • Ток одного вывода PIC ограничен (около 20 мА), а суммарный ток порта — тоже. Резисторы 330 Ом обязательны.

Что дальше

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