;Programa principal
.include "m164pdef.inc"
.def tempo=r16
.dseg
tecla: .byte 1
binariol: .byte 1
binarioh: .byte 1
dig: .byte 4
segmentos: .byte 4
.cseg
.org 0x00
clr tempo
out ddrb,tempo
out porta,tempo
com tempo
out portb,tempo
out ddra,tempo
ldi tempo,0b00001111
out ddrc,tempo ;los 4 bits menos significativos untilizo para control de encendido de display
out ddrd,tempo ;para el teclado 4 bits como salida y 4 como entrada
com tempo
out portc,tempo
ldi tempo,255
out portd,tempo
in tempo,mcucr
andi tempo,0b11101111
out mcucr,tempo
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
clr tempo
sts binariol,tempo
sts binarioh,tempo
lazo:
;valor anterior
lds r16,tecla
call teclado
;valor actual de tecla
lds r20,tecla
;comparo para ver si el valor de tecla cambio (si no cambia es xq continua presionada)
cp r16,r20
breq continuar
cpi r20,0
breq continuar
;sumo lo que tenia acumulado con el valor de tecla
ldi tempo,0
lds r17,binariol
lds r18,binarioh
mov r17,r20
mov r18,tempo
sts binariol,r17
sts binarioh,r18
continuar:
call bin_bcd
call bcd_7seg
call barrido
rjmp lazo
.include "teclado.asm"
.include "binarioabcd.asm"
.include "bcda7seg.asm"
.include "barrido.asm"
;Subrutinas
; barrido
barrido:
push r16
push r17
push r18
push xl
push xh
ldi r17,4
ldi xh,high(segmentos)
ldi xl,low(segmentos)
ldi r18,0b11110111
barrido0:
ser r16
out portc,r16
ld r16,x+
;no es necesario encender el punto borro estras líneas
;cpi r17,2
;breq punto
;ori r16,0b10000000
;punto:
out porta,r16
out portc,r18
call retardo_barrido
sec
ror r18
dec r17
brne barrido0
ser r16
out portc,r16
pop xh
pop xl
pop r18
pop r17
pop r16
ret
retardo_barrido:
push r16
ldi r16,255
retardo0:
nop
dec r16
brne retardo0
pop r16
ret
;bcd_7seg
bcd_7seg:
push r16
push r17
push xl
push xh
push yl
push yh
push zl
push zh
ldi xh,high(segmentos)
ldi xl,low(segmentos)
ldi yh,high(dig)
ldi yl,low(dig)
ldi r17,4
bcd_7seg0:
ldi zh,high(tabla_seg<<1)
ldi zl,low(tabla_seg<<1)
ld r16,y+
add zl,r16
clr r16
adc zh,r16
lpm r16,z
st x+,r16
dec r17
brne bcd_7seg0
pop zh
pop zl
pop yh
pop yl
pop xh
pop xl
pop r17
pop r16
ret
tabla_seg:
.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
.db 0b00001000,0b00000000;A,B
.db 0b00110001,0b00000001;C,D
.db 0b00110000,0b00111000;E,F
;bin_bcd:
bin_bcd:
push r16
push r17
push r18
push r19
push r20
push r21
push xl
push xh
push zl
push zh
lds r16,binariol
lds r17,binarioh
ldi r18,3
ldi xl,low(dig)
ldi xh,high(dig)
ldi zl,low(constantes<<1)
ldi zh,high(constantes<<1)
bin_bcd0:
lpm r19,z+
lpm r20,z+
bin_bcd1:
sub r16,r19
sbc r17,r20
brcs bin_bcd2
inc r21
rjmp bin_bcd1
bin_bcd2:
add r16,r19
adc r17,r20
st x+,r21
clr r21
dec r18
brne bin_bcd0
st x,r16
pop zh
pop zl
pop xh
pop xl
pop r21
pop r20
pop r19
pop r18
pop r17
pop r16
ret
constantes:
.dw 1000, 100, 10
;teclado:
teclado:
push r16
push r17
ldi r17,0
ldi r16,0b11111110
out portd,r16
sbis pind,4
ldi r17,7
sbis pind,5
ldi r17,8
sbis pind,6
ldi r17,9
sbis pind,7
ldi r17,10
ldi r16,0b11111101
out portd,r16
sbis pind,4
ldi r17,4
sbis pind,5
ldi r17,5
sbis pind,6
ldi r17,6
sbis pind,7
ldi r17,11
ldi r16,0b1111011
out portd,r16
sbis pind,4
ldi r17,1
sbis pind,5
ldi r17,2
sbis pind,6
ldi r17,3
sbis pind,7
ldi r17,12
ldi r16,0b11110111
out portd,r16
sbis pind,4
ldi r17,13
sbis pind,5
ldi r17,14
sbis pind,6
ldi r17,15
sbis pind,7
ldi r17,16
sts tecla,r17
pop r17
pop r16
ret
No hay comentarios.:
Publicar un comentario