;**************************************************************************** ; RUTINA PARA TECLADO DE 16 TECLAS * ; Vicente Martinez mayo-1999 * ; Columnas por RB0,1,2 y RB3 y filas por RA0,1,2 y RA3 * ; Acompaña teclad.gif para la disposicion de las teclas * ;**************************************************************************** list p=16c84 ;Tipo de procesador STATUS equ 0x03 ;Registro de estado TRISA equ 0x05 ;Registro de direci¢n de la puerta A TRISB equ 0x06 ;Registro de direcci¢n de la puerta B w equ 0 f equ 1 RA equ 0x05 ;Puerta A RB equ 0x06 ;Puerta B cuenta EQU 0X14 byte EQU 0X15 ;aqui se guarda un numero que corresponde a cada tecla cuenta2 EQU 0x16 ; colum EQU 0x17 ;dato a salir por columnas (RB) fila EQU 0x18 ;dato leido como fila (RA) org 0 inicio movlw 0x0F bsf STATUS,5 ;ponemos el bit 5 del regidtro STATUS a "1" movwf TRISA ;Puerto A como entrada movlw 0x00 movwf TRISB ;puerto B como salidas bcf STATUS,5 ;volvemos al BANCO de memoria inicial busca movlw 0xF7 movwf colum movwf RB ;ponemos a "0" RB0 call mira_fila movlw 0xFB movwf colum movwf RB ;ponemos a "0" RB1 call mira_fila movlw 0xFD movwf colum movwf RB ;ponemos a "0" RB2 call mira_fila movlw 0xFE movwf colum movwf RB ;ponemos a "0" RB3 call mira_fila goto busca mira_fila movf RA,w ;leemos RA para ver si hay alguna tecla pulsada addlw 0x0F sublw 0x0E movwf byte ;comparamos y si no es 00001111 es que se ha pulsado decfsz byte,f goto alli return ;si es 00001111 retorna alli movf RA,w movwf fila call retardo ;antirebotes btfsc fila,1 ;miramos si el bit 1 es cero de RA goto otro movlw 0x00 addwf colum ;sumamos para fila 1, "00" y la columna movwf byte ;guardamos en byte return otro movf RA,w movwf fila call retardo ;antirebotes btfsc fila,2 ;miramos si el bit 2 es cero goto otro1 movlw 0x10 addwf colum movwf byte return otro1 movf RA,w movwf fila call retardo ;antirebotes btfsc fila,3 ;miramos si el 3 bit es cero goto otro2 movlw 0x20 addwf colum movwf byte return otro2 movlw 0x30 addwf colum ;si no es ninguno de los otros 3 sera este movwf byte return retardo movlw 0xFF movwf cuenta retado decfsz cuenta,f goto retado movlw 0x99 movwf cuenta2 ratado decfsz cuenta2,f goto ratado return end ;SEGUN EL VALOR DE BYTE (EN HEXADECIMAL) CORRESPONDERA A CADA TECLA ;si byte= 7 tecla numero 1 ;si byte= B tecla numero 2 ;si byte= D tecla numero 3 ;si byte= E tecla numero 4 ;si byte= 17 tecla numero 5 ;si byte= 1B tecla numero 6 ;si byte= 1D tecla numero 7 ;si byte= 1E tecla numero 8 ;si byte= 27 tecla numero 9 ;si byte= 2B tecla numero 0 ;si byte= 2D tecla numero A ;si byte= 2E tecla numero B ;si byte= 37 tecla numero C ;si byte= 3B tecla numero D ;si byte= 3D tecla numero E ;si byte= 3E tecla numero F ;RB0 RB1 RB2 RB3 ; | ---- | ---- | ---- | -----RA0 ; | ---- | ---- | ---- | -----RA1 ; | ---- | ---- | ---- | -----RA2 ; | ---- | ---- | ---- | -----RA3