Autor Tema: teclado 4x4  (Leído 2239 veces)

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

Desconectado sandra_rcb2000

  • PIC12
  • **
  • Mensajes: 92
teclado 4x4
« en: 02 de Agosto de 2004, 13:46:00 »
TECLADO.ASM


  Presenta un conjuntos de rutinas que permiten la gestión de un teclado hexadecimal. El teclado hexadecimal se supone conectado a la puerta B y su disposición es la siguiente:


       RB0 RB1 RB2 RB3

                         TECLA           CODIGO
                            -----      --------------
      |---|---|---|---|      0   01111101 = 0x7D
RB4 -->   | 1 | 2 | 3 | F |      1   11101110 = 0xEE
      |---|---|---|---|      2   11101101 = 0xED
RB5 -->   | 4 | 5 | 6 | E |      3   11101011 = 0xEB
      |---|---|---|---|      4   11011110 = 0xDE
RB6 -->   | 7 | 8 | 9 | D |      5   11011101 = 0xDD
      |---|---|---|---|      6   11011011 = 0xDB
RB7 -->   | A | 0 | B | C |      7   10111110 = 0xBE
      |---|---|---|---|      8   10111101 = 0xBD
                        9   10111011 = 0xBB
                      A   01111110 = 0x7E
                        B   01111011 = 0x7B
                  C   01110111 = 0x77
                  D   10110111 = 0xB7
                  E   11010111 = 0xD7
                  F   11100111 = 0xE7
                                                                     

cblock  Key_var        ;Reserva de memoria para las variables
      Tecla         ;Para devolver el código de la tecla
      Key_1         ;Nº de columnas a explorar
      Key_2           ;Temporal de código  
      Key_Delay_1     ;Variables de temporización        
      Key_Delay_2            
   endc                                            

**********************************************************************
 Rutina de exploración del teclado. La variable "Tecla" retorna con el código de la tecla pulsada o el código 0x80 si no se pulsa ninguna.
                    
Key_Scan:        bsf     STATUS,RP0       ;Selecciona página 1                    
         movlw   b"00001111"
         movwf   PORTB     ;RB7-RB4 salidas, RB3-RB0 entradas            
         bsf     OPTION_REG,NOT_RBPU    ;Activa cargas pull-up
         bcf     STATUS,RP0      ;Selecciona página 0
         movlw   4
         movwf   Key_1       ;Nº de columnas a explorar      
         movlw   b"01111111"
         movwf   Tecla           ;Columna a activar      
Key_Scan_1:       movf    Tecla,W
         movwf   PORTB           ;Activa columna   
               nop
          movf    PORTB,W
         movwf   Key_2
         subwf   Tecla,W         ;Lee las filas        
         btfss   STATUS,Z        ;¿ Hay alguna pulsada ?
         goto    Key_Scan_2      ;No hay ninguna pulsada        
         bsf     STATUS,C       ;No hay ninguna en esa columna
         rrf     Tecla,F           ;Selecciona siguiente columna
                  decfsz  Key_1,F
         goto    Key_Scan_1
         movlw   0x80  ;Retorna código 0x80 (no hay pulsación)
         movwf   Tecla                          
      return  
            

Key_Scan_2:  movlw   .100           ;Bucle de temporización de unos 20mS                        
       movwf   Key_Delay_1  ;para evitar el rebote al pulsar

Key_Scan_3:  clrf    Key_Delay_2                    
       Clrwdt

Key_Scan_4:  decfsz  Key_Delay_2,F
       goto    Key_Scan_4
       decfsz  Key_Delay_1,F
       goto    Key_Scan_3
            
      movf    Tecla,W    ;Tras la temporización se lee nuevamente        
      movwf   PORTB      ;si la tecla es la misma. Así se evitan
 ;los rebotes  
      nop                    
      movf    PORTB,W
      subwf   Key_2,W
      btfss   STATUS,Z        ;Es la misma ??
      goto    Key_Scan_1      ;No, seguir con la exploración
      movf    Key_2,W   ;Si guardar en variable de salida "Tecla"    
      movwf   Tecla
   return   


**********************************************************************
 Convierte el código de la tecla que haya en la variable "Tecla" a Hexadecimal(0-F). El resultado se devuelve en la variable "Tecla".
 
Key_Tabla         movf    Key_1,W      ;Calcula desplazamiento sobre
         addwf   PCL,F        ;sobre la tabla                      
         retlw   0x7d            ;0              
         retlw   0xee            ;1                
         retlw   0xed            ;2                
         retlw   0xeb            ;3                
         retlw   0xde            ;4                
         retlw   0xdd            ;5                
         retlw   0xdb            ;6                
         retlw   0xbe            ;7                
         retlw   0xbd            ;8                
         retlw   0xbb            ;9                
         retlw   0x7e            ;A                
         retlw   0x7b            ;B                
         retlw   0x77            ;C                
         retlw   0xb7            ;D                
         retlw   0xd7            ;E                
         retlw   0xe7            ;F   

Key_BCD:      movf    Tecla,W
        movwf   Key_2      ;Almacena el código temporalmente        
        clrf    Key_1      ;Contador BCD a 0  

     
Key_BCD_2     call    Key_Tabla  ;Busca código en la tabla    
        subwf   Key_2,W    ;Compara con el de la tecla                      
        btfsc   STATUS,Z   ;Coincide ??                      
        goto    Key_BCD_1  ;Si   
              incf    Key_1,F    ;No, incrementa contador BCD                    
        goto    Key_BCD_2

Key_BCD_1     movf    Key_1,W
              movwf   Tecla   ;Carga BCD en la variable de salida                  

       
     return                   
         




Desconectado YF-21

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 185
RE: teclado 4x4
« Respuesta #1 en: 20 de Agosto de 2004, 18:55:00 »
Pequeñas y breves notas ...

El teclado 4X4 son un arreglo especial de 16 botones que nos pueden representar varios estados de informacion.

Estan conectados a manera de filas y columnas.

Se tienen en un 4X4 justamente 8 lineas de conexion.

Se configura el pic con 4 salidas y 4 entradas, de manera que ...

Supongamos que las salidas se conectan a las columnas, entonces mandas un "1" a la primera columna y si presionas un boton que este relacionado con esa columna permite que pase ese "1" hacia alguna entrada (fila) , testeas entrada por entrada para ver cual fue el que se presionó, de esta manera logras encontrar la "fila y columna del boton pulsado" (el procedimiento se repite para todas las columnas)

Creo que a grandes rasgos asi funciona el teclado 4X4, si no CORRIJANME POR FAVOR

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
RE: teclado 4x4
« Respuesta #2 en: 16 de Mayo de 2005, 14:25:00 »
Si, efectivamente asi funciona a grandes rasgos.
El codigo que pones arriba esta mal, no funciona.
para que funcione hay que reemplazar la linea:
bsf OPTION_REG,NOT_RBPU ;Activa cargas pull-up
por esta otra:
bcf OPTION_REG,NOT_RBPU ;Activa cargas pull-up

Si no activas las pull ups pues no esperes nada bonito en el programa Giño

Si no te sirve me avisas. Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.