Для создания данного эффекта можно последовательно устанавливать на определенной ножке (или группе ножек) сигнал высокого уровня, выдерживать паузу, затем устанавливать сигнал низкого уровня, снова выдерживать паузу и затем устанавливать сигнал на других ножках. Весь этот процесс зацикливается, что приводит к созданию соответствующего эффекта.
Команду установки сигналов низкого уровня можно исключить, чтобы в работе МК исключить случай всех потушенных светодиодов (это дело индивидуальных предпочтений).
Код на ассемблере, 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.