Hola programadores, les escribo para pedirles ayuda con un código para leer un teclado matricial de 4x4, mediante un microcontrolador ATMEGA16. A continuación les paso el código que he escrito y la simulación en Proteus: Si alguien me puede ayudar con este problema le agradezco mucho. El programa debe leer un número (o letra) por el teclado y mostrarlo en el display de 7 segmentos.
En el siguiente enlace les envio el circuito en PROTEUS y el codigo en ensamblador (solo pongo el id, que va despues del .com/, solo tienen que añadirlo para descargar el archivo):
d=EGTST7N6A continuación el codigo:
;reloj de 1MHz
;se leen datos de un tecladopor el puerto D; se muestran los datos en un
;diplay de siete segmentos por el puerto B
.include "m16def.inc"
.def temp=r16
.def unidad=r18
.def tecla_pres=r19
.def cont=r21
.def zero=r22
.dseg
guarda: .byte 1
.cseg
.org 0x0000 ;vector de reset
jmp principal
; tabla: .db
; 0xD7, 11010111 tecla 13 (0)
; 0xEE, 11101110 tecla 0 (1)
; 0xDE, 11011110 tecla 1 (2)
; 0xBE, 10111110 tecla 2 (3)
; 0xED, 11101101 tecla 4 (4)
; 0xDD, 11011101 tecla 5 (5)
; 0xBD, 10111101 tecla 6 (6)
; 0xEB, 11101011 tecla 8 (7)
; 0xDB, 11011011 tecla 9 (8)
; 0xBB, 10111011 tecla 10 (9)
; 0xE7, 11100111 tecla 12 (A)
; 0xB7, 10110111 tecla 14 (
; 0x77, 01110111 tecla 15 (C)
; 0x7B, 01111011 tecla 11 (D)
; 0x7D, 01111101 tecla 7 (E)
; 0x7E 01111110 tecla 3 (F)
.org 0x002a;desde aqui cpmienza la memoria del programa
tabla: .db 0xD7,
0xEE,
0xDE,
0xBE,
0xED,
0xDD,
0xBD,
0xEB,
0xDB,
0xBB,
0xE7,
0xB7,
0x77,
0x7B,
0x7D,
0x7E
principal:
ldi temp,low(RAMEND) ;inicializa el puntero de pila
out spl,temp
ldi temp,high(RAMEND) ;configuracion de los puertos
out sph,temp
ldi temp,0x0f ; parte baja del puerto D se configura como salida [D0..D3] (unos)
out DDRD,temp ; parte alta del puerto D de configurta como entrada [D4.D7] (ceros)
ser temp
out DDRB,temp ; puerto B se configura como salida
clr temp
ldi zero,0x00
ldi unidad,0x01
clr r1
getch:
poll:
call kbhit
cp r1,zero
breq poll
ldi r17,0xf7 ;11110111
sec ;c=1
ciclo:
out PORTD,r17
in temp,PIND
andi temp,0xf0
cpi temp,0xf0
brne fin_ciclo;salte si no son iguales, es porque hubo tecla presionada
cpi r17,0xff
breq cargar_init
ror r17;rota a la derecha
jmp ciclo
cargar_init:
ldi r17,0xf7 ;11110111
jmp ciclo
fin_ciclo:
andi r17,0x0f
or temp,r17
call decode
ret
kbhit: ;esperar a precionar una tecla, si presiona r1=1, sino r1=0
push temp
clr r1
ldi temp,0xf0
out PORTD,temp
in temp,PIND
andi temp,0xf0
cpi temp,0xf0
breq final
inc r1
final:
pop r16
ret
decode: ;funcion que indica a que numero corresponde el codigo que quedo guardado en temp
ldi zl,low(tabla<<1)
ldi zh,high(tabla<<1)
clr tecla_pres
tecla:
lpm r20,z
cp r20,temp
breq fin_tecla
add r30,unidad
adc r31,zero
inc tecla_pres
jmp tecla
fin_tecla:
call muestra_dato
ret
muestra_dato:
mov temp,tecla_pres
out PORTB,temp
rcall delay
ret
delay:
ldi cont,0xFF
sigue:
ldi temp,0xFF
sigue2:
dec temp
brne sigue2
dec cont
brne sigue
ret