jueves, 29 de octubre de 2015

Barrido de teclado: assembler ejemplo

Circuito en proteus




;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