• Sábado 20 de Abril de 2024, 06:06

Autor Tema:  Teclado matricial atmega16  (Leído 2423 veces)

oscarvb5

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Teclado matricial atmega16
« en: Miércoles 11 de Mayo de 2011, 20:45 »
0
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=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