В этом примере мы оживим работу нашего МК, попеременно устанавливая высокий и низкий уровни сигналов на одних и тех же ножках.
Схема распиловки микросхемы:
Код 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 b11111111 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт call Pause ; переход на метку (с возвратом) clrf 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 ; конец программы
Если длительность свечения и длительность в потушенном состоянии должны отличаться по
времени, то можно воспользоваться следующим кодом:
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 b11111111 ; запись в аккумулятор movwf PORTB ; перенос из аккумулятора в порт call Pause1 ; переход на метку (с возвратом) clrf PORTB ; "очистка" порта call Pause2 ; переход на метку (с возвратом) goto m1 ; переход на метку (зацикливание) ;delay = 500000 machine cycles Pause1 movlw .85 movwf Reg_1 movlw .138 movwf Reg_2 movlw .3 movwf Reg_3 wr1 decfsz Reg_1, F goto wr1 decfsz Reg_2, F goto wr1 decfsz Reg_3, F goto wr1 return ;delay = 1000000 machine cycles Pause2 movlw .173 movwf Reg_1 movlw .19 movwf Reg_2 movlw .6 movwf Reg_3 wr2 decfsz Reg_1, F goto wr2 decfsz Reg_2, F goto wr2 decfsz Reg_3, F goto wr2 return
Здесь два сегмента паузы помеченные метками Pause1 и Pause2. Для правильности работы
сегментов метки wr в соответствующих сегментах паузы переименованы в wr1 и wr2.
Обратите внимание, в разных сегментах паузы используются одинаковые регистры общего
назначения, т.к. в начале каждой паузы эти регистры заполняются своими значениями.