Пример 2. "Бегущий огонь" и "бегущая тень"На тему этого примера напрашивается несколько решений создания программы.
Можно последовательно устанавливать на определенной ножке (или группе ножек) сигнал высокого уровня, выдерживать паузу, затем устанавливать сигнал низкого уровня, снова выдерживать паузу и затем устанавливать сигнал на других ножках. Весь этот процесс зацикливается, что приводит к созданию соответствующего эффекта. Команду установки сигналов низкого уровня можно исключить, чтобы в работе МК исключить случай всех потушенных светодиодов (это дело индивидуальных предпочтений). Вариантов последовательности включения светодиодов можно придумать великое множество, была бы фантазия. Рассмотрим сегмент программы (установка сигналов на порту B)
; установка сигналов на порту В
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 ; переход на метку (зацикливание)
Далее прошивка скомпилированной программы, с использованием рассматриваемого сегмента:
:020000040000FA
:100000008316860183120330860010200C30860090
:100010001020303086001020C030860010200328C9
:1000200055308C008A308D0003308E008C0B1628E2
:0A0030008D0B16288E0B1628080011
:02400E00F13F80
:00000001FF
В нашей макетной плате используется семисегментный индикатор. Использование МК даёт нам неоспоримую возможность в создании оптимального рисунка печатной платы под конкретные элементы. Мы уже упоминали, что именно программу мы пишем под разрабатываемое устройство, поэтому при создании рисунка печатной платы порядок электрических соединений индикатора с МК был для нас не актуален, лишь бы это были соединения с ножками портов (в нашем случае с ножками порта B).
Результат работы индикатора на макете с указанной выше прошивкой не самый симпатичный. Для самостоятельного занятия предлагаю написать вам программу, которая будет включать светодиоды индикатора таким образом, что будет создаваться эффект "бегущего по кругу сегмента"; направление "бега" выберите сами. Эту задачу несложно решить, обратившись к принципиальной схеме нашей макетной платы.
Мы говорили о нескольких решениях реализации "бегущего огня". Второй, принципиально иной подход можно реализовать с помощью команд сдвига битов в регистре. Рассмотрим пример.
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 ; конец программы
Далее прошивка
:020000040000FA
:1000000083168601831286010314860D08200528B5
:1000100055308C008A308D0003308E008C0B0E28FA
:0A0020008D0B0E288E0B0E28080031
:02400E00F13F80
:00000001FF
Как видим, текст программы намного проще и суть работы заложена в трёх строчках. Следует обратить внимание на дополнительные подготовительные моменты и на расположение метки m1.
|