Pic16f84a: Бегущий огонь, змейка

Для создания данного эффекта можно последовательно устанавливать на определенной ножке (или группе ножек) сигнал высокого уровня, выдерживать паузу, затем устанавливать сигнал низкого уровня, снова выдерживать паузу и затем устанавливать сигнал на других ножках. Весь этот процесс зацикливается, что приводит к созданию соответствующего эффекта.

Команду установки сигналов низкого уровня можно исключить, чтобы в работе МК исключить случай всех потушенных светодиодов (это дело индивидуальных предпочтений).

Код на ассемблере, asm файл:

LIST P=PIC16F84A
 __CONFIG H3FF1
STATUS EQU H0003
PORTB EQU H0006
TRISB EQU H0006
Reg_1 EQU H000C
Reg_2 EQU H000D
Reg_3 EQU H000E

 org 0 ; начало программы 

; подготовительные моменты
 bsf STATUS,5 ; переход в Банк 1 
 clrf TRISB
 bcf STATUS,5 ; переход назад в Банк 0
; установка сигналов на порту В

m1 movlw b00000011 ; запись в аккумулятор 
 movwf PORTB ; перенос из аккумулятора в порт
 call Pause ; переход на метку (с возвратом)
 movlw b00001100 ; запись в аккумулятор 
 movwf PORTB ; перенос из аккумулятора в порт
 call Pause ; переход на метку (с возвратом)
 movlw b00110000 ; запись в аккумулятор 
 movwf PORTB ; перенос из аккумулятора в порт
 call Pause ; переход на метку (с возвратом)
 movlw b11000000 ; запись в аккумулятор 
 movwf PORTB ; перенос из аккумулятора в порт
 call Pause ; переход на метку (с возвратом)
 goto m1 ; переход на метку (зацикливание)

Pause movlw .85
 movwf Reg_1
 movlw .138
 movwf Reg_2
 movlw .3
 movwf Reg_3
wr decfsz Reg_1, F
 goto wr
 decfsz Reg_2, F
 goto wr
 decfsz Reg_3, F
 goto wr
 return
 end ; конец программы

Второй, принципиально иной подход можно реализовать с помощью команд сдвига битов в регистре. Рассмотрим пример:

LIST P=PIC16F84A
 __CONFIG H3FF1
STATUS EQU H0003
PORTB EQU H0006
TRISB EQU H0006
Reg_1 EQU H000C
Reg_2 EQU H000D
Reg_3 EQU H000E

 org 0 ; начало программы 

; подготовительные моменты
 bsf STATUS,5 ; переход в Банк 1 
 clrf TRISB
 bcf STATUS,5 ; переход назад в Банк 0
 clrf PORTB ; очистка порта
 bsf STATUS,0 ; установка нулевого бита в единицу
; установка сигналов на порту B

m1 
rlf PORTB,1 ; <<< сдвиг в регистре PORTB
 call Pause ; <<<
 goto m1 ; <<< переход на метку (зацикливание)

;delay = 500000 machine cycles
Pause movlw .85
 movwf Reg_1
 movlw .138
 movwf Reg_2
 movlw .3
 movwf Reg_3
wr decfsz Reg_1, F
 goto wr
 decfsz Reg_2, F
 goto wr
 decfsz Reg_3, F
 goto wr
 return
 end ; конец программы


Как видим, текст программы намного проще и суть работы заложена в трёх строчках.
Следует обратить внимание на дополнительные подготовительные моменты и на
расположение метки m1.

Добавить комментарий