Код: Выделить всё
.include "tn2313def.inc"
.dseg
.cseg
ldi R16,low(RamEnd) ;установка указателя стека
out SPL,R16
ldi R16,0b11111111 ;настройка портов B
out DDRB,R16
ldi R16,0b00011111 ;настройка портов D
out DDRD,R16
clr r23
clr r24
clr r25
clr r26
Start:
in r16,PinD ; пересылаем r16
sbic PinD,4 ; бит 4
rcall CycleINC
Indic:
ldi R17,0b00000111
out PortD,R17
mov R22,r23
rcall Decoder
sbic PinD,5
sbr r17,0b10000000
out PortB,R17
rcall Delay1
ldi R17,0b00001011
out PortD,R17
mov R22,r24
rcall Decoder
out PortB,R17
rcall Delay1
ldi R17,0b00001101
out PortD,R17
mov R22,r25
rcall Decoder
out PortB,R17
rcall Delay1
ldi R17,0b00001110
out PortD,R17
mov R22,r26
rcall Decoder
out PortB,R17
rcall Delay1
in r3,PinD ; пересылаем порт в r3
and r3,r16 ; проверяем, изменился ли 4-й бит
sbrc r3,4 ; бит 4 в r3 очищен?
rjmp Indic ; нет => Индикация
rjmp Start ; да => Старт
CycleINC:
sbic PinD,5
rjmp CycleDEC
inc r23
cpi r23,10
breq M
ret
M:
clr r23
inc r24
cpi r24,10
breq F
ret
F:
clr r24
inc r25
cpi r25,10
breq W
ret
W:
clr r25
inc r26
cpi r26,10
breq T
ret
T:
clr r26
ret
CycleDEC:
dec r23
cpi r23,255
breq M1
ret
M1:
ldi r23,9
dec r24
cpi r24,255
breq F1
ret
F1:
ldi r24,9
dec r25
cpi r25,255
breq W1
ret
W1:
ldi r25,9
dec r26
cpi r26,255
breq T1
rjmp Indic
T1:
ldi r26,9
rjmp Indic
Decoder:
ldi ZL,Low(DcMatrix*2) ;инициализация массива
ldi ZH,High(DcMatrix*2)
ldi R18,0 ;прибавление переменной
add ZL,R22 ;к 0-му адресу массива
adc ZH,R18
lpm ;загрузка значения
mov R17,r0
ret
DcMatrix:
;массив - таблица истинности декодера
; hgfedcba hgfedcba
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111 ;2,3
.db 0b01100110,0b01101101 ;4,5
.db 0b01111101,0b00000111 ;6,7
.db 0b01111111,0b01101111 ;8,9
Delay1:
ldi R20,20
ldi R21,11
d11:
dec R20
brne d11
dec R21
brne d11
ret