TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: sandra_rcb2000 en 02 de Agosto de 2004, 13:46:00

Título: teclado 4x4
Publicado por: sandra_rcb2000 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                   
         



Título: RE: teclado 4x4
Publicado por: YF-21 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
Título: RE: teclado 4x4
Publicado por: BrunoF 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.