Autor Tema: Manejo teclado matricial ATMEGA16  (Leído 4341 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado oscarvb5

  • PIC10
  • *
  • Mensajes: 1
Manejo teclado matricial ATMEGA16
« en: 11 de Mayo de 2011, 15:55:52 »
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:

http://www.megaupload.com/d=EGTST7N6


A 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 (B)
; 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