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 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.
Обратите внимание, в разных сегментах паузы используются одинаковые регистры общего
назначения, т.к. в начале каждой паузы эти регистры заполняются своими значениями.

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