Está en la página 1de 7

;Programa que lee la tecla presionada en un teclado matricial 4x4

;y lo muestra en display de 7 segmentos anodo común.

;Interrupcion por cambio en PORTB.

;Hardware se conecta de RD0-RD6 a segmentos a-g respectivamente

;De Fila1-Fila4 a RB0-RB3 y de Columna1-Columna4 a RB4-RB7 respectivamente

LIST P=16F887

#include "p16f887.inc"

__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF &
_CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT

__CONFIG _CONFIG2, _WRT_OFF & _BOR21V

;**** Definicion de variables ****

NTECLA EQU 20h ; Numero de la tecla presionada

W_TEMP EQU 21h ; Registro para guardar temporalmente W.-

STATUS_TEMP EQU 22h ; Registro para guardar temporalmete STATUS

CNT1 EQU 23H ; Contador para delay

CNT0 EQU 24H ; Contador para delay

;**** Inicio del Micro ****

ORG 0x00 ; Aquí comienza el micro.-

GOTO INICIO ; Salto a inicio de mi programa.-

;**** Vector de Interrupcion ****

ORG 0x04 ; Atiendo Interrupcion.-

GOTO INTERRUPCION
;**** Programa principal ****

;**** Configuracion de puertos ****

INICIO

BANKSEL TRISA

CLRF TRISA ; PORTA salida

MOVLW B'11110000' ; Nibble superior entrada, nibble inferior salida

MOVWF TRISB

MOVLW B'10111111' ; RC7/RX entrada,

MOVWF TRISC ; RC6/TX salida

BANKSEL PORTA

MOVLW B'11111111' ; Todos los bits en alto para que

MOVWF PORTA ; inicialmente el display anodo comun este apagado

CLRF PORTB

CLRF PORTC

BANKSEL ANSEL

CLRF ANSEL ; PORTA digital

BANKSEL ANSELH

CLRF ANSELH ; PORTB digital

BANKSEL OPTION_REG

BCF OPTION_REG,7 ; Resistencias pull-up habilitadas

BANKSEL WPUB

MOVLW B'11110000' ; Resistencias pull-up de RB4 a RB7 habilitadas

MOVWF WPUB

BANKSEL TXSTA

MOVLW B'00100100' ; Configuración USART

MOVWF TXSTA ; y activación de transmisión

BANKSEL SPBRG

MOVLW .25 ; 1200 baudios


MOVWF SPBRG

BANKSEL RCSTA

MOVLW B'10010000' ; Configuración del USART para recepción continua

MOVWF RCSTA

MOVLW B'11001000' ; GIE, PEIE Y RBIE habilitadas

MOVWF INTCON

BANKSEL IOCB

MOVLW B'11110000' ; Interrupciones de RB4 a RB7 habilitadas

MOVWF IOCB

BANKSEL PIE1

BSF PIE1,RCIE ; Habilita interrupción en recepción

CLRF NTECLA

;**** Bucle ****

BUCLE

NOP ; Espero interrupción

GOTO BUCLE

;**** Rutina de servicio de Interrupcion ****

; Guardado de registro W y STATUS.-

INTERRUPCION

MOVWF W_TEMP ; Copiamos W a un registro Temporario.-

SWAPF STATUS,0 ; Invertimos los nibles del registro STATUS.-

MOVWF STATUS_TEMP ; Guardamos STATUS en un registro temporal.-

BANKSEL PIR1

BTFSC INTCON,RBIF ; Interrupcion por teclado?

GOTO TECLA_PRESIONADA; Si. Se detecta la tecla presonada

BTFSC PIR1,RCIF ; No. Interrupción por recepción?

GOTO RECEPCION ; Si. Se recive el dato

GOTO FIN ; No, entonces restauramos valores.


;**** Rutinas *****

; Rastreamos Tecla presionada.-

TECLA_PRESIONADA

CLRF NTECLA ; Borra Numero de Tecla

BANKSEL PORTB

MOVLW B'00001110' ; Saca 0 a la primera fila

MOVWF PORTB ; de PORTB

NOP ; Para estabilizacion de señal.

NOP

NOP

NOP

TEST_COLUMNAS

BTFSS PORTB,4 ; Primera columna = 0?

GOTO SUELTA_TECLA ; Si. Sale si se ha pulsado tecla.

INCF NTECLA,1 ; No. Incrementa nº tecla.

BTFSS PORTB,5 ; Segunda columna = 0?

GOTO SUELTA_TECLA ; Si. Sale si se ha pulsado tecla.

INCF NTECLA,1 ; No. Incrementa nº tecla.

BTFSS PORTB,6 ; Tercera columna = 0?

GOTO SUELTA_TECLA ; Si. Sale si se ha pulsado tecla.

INCF NTECLA,1 ; No. Incrementa nº tecla.

BTFSS PORTB,7 ; Cuarta columna = 0?

GOTO SUELTA_TECLA ; Si. Sale si se ha pulsado tecla.

INCF NTECLA,1 ; No. Incrementa nº Tecla.

ULTIMA_TECLA

BTFSS PORTB,3 ; Ya se revisaron todas las filas?

GOTO NULL_TECLA ; Si. Falsa alarma, no se ha presionado ninguna tecla.

BSF STATUS,C ; No, seguimos con la siguiente. Pone a 1 Bit C

RLF PORTB,1 ; asi la Fila 1 pasa a 1 con la rotaci¢n a izqda.


GOTO TEST_COLUMNAS

NULL_TECLA

CLRF NTECLA ; Coloca variable Tecla a 0 (Ninguna)

CLRF PORTB ; Dejamos Puerto para recibir otra tecla.-

GOTO FIN ; y regresa.

; Ahora se espera a que la tecla sea soltada para evitar rebotes

; y reactivaciones de tecla

SUELTA_TECLA

ESPERA1

BTFSS PORTB,4 ; Si no se suelta la tecla FILA 1

GOTO ESPERA1 ; vuelve a esperar.

ESPERA2

BTFSS PORTB,5 ; Si no se suelta la tecla FILA 2

GOTO ESPERA2 ; vuelve a esperar.

ESPERA3

BTFSS PORTB,6 ; Si no se suelta la tecla FILA 3

GOTO ESPERA3 ; vuelve a esperar.

ESPERA4

BTFSS PORTB,7 ; Si no se suelta la tecla FILA 4

GOTO ESPERA4 ; vuelve a esperar.

CLRF PORTB ; Dejamos Puerto para recibir otra tecla.

TX_DATO

;BANKSEL PIR1

;BCF PIR1,TXIF ; Restaura el flag del transmisor

BANKSEL TXREG

MOVF NTECLA,0

MOVWF TXREG ; Mueve el byte a transmitir al registro de transmision

TX_DAT_W

BANKSEL TXSTA
BTFSS TXSTA,TRMT ; ¿Byte transmitido?

GOTO TX_DAT_W ; No, esperar

DELAY

MOVLW 0xF0

MOVWF CNT1

D1

MOVLW 0xFA

MOVWF CNT0

D0

DECFSZ CNT0

GOTO D0

DECFSZ CNT1

GOTO D1

GOTO FIN

RECEPCION

BANKSEL RCREG

MOVF RCREG,0 ; Lectura del dato recibido

CALL TABLA

BANKSEL PORTA

MOVWF PORTA ; Lo muestra por PORTA

GOTO FIN

TABLA ADDWF PCL,1 ; Ánodo común

RETLW 0XF9 ;1

RETLW 0XA4 ;2

RETLW 0XB0 ;3

RETLW 0X88 ;A

RETLW 0X99 ;4

RETLW 0X92 ;5

RETLW 0X82 ;6
RETLW 0X83 ;b

RETLW 0XF8 ;7

RETLW 0X80 ;8

RETLW 0X90 ;9

RETLW 0XC6 ;C

RETLW 0X86 ;E

RETLW 0XC0 ;0

RETLW 0X8E ;F

RETLW 0XA1 ;d

; Restauramos los valores de W y STATUS.-

FIN

BCF INTCON,RBIF ; Bandera interrupcion por teclado bajada

BCF PIR1,TXIF ; Bandera interrupcion por recepcion bajada

SWAPF STATUS_TEMP,0 ; Invertimos lo nibles de STATUS_TEMP

MOVWF STATUS

SWAPF W_TEMP,1 ; Invertimos los nibbles y lo guardamos en el mismo registro.-

SWAPF W_TEMP,0 ; Invertimos los nibbles nuevamente y lo guardamos en W.-

RETFIE ; Salimos de interrupción.

;..........................................

END

También podría gustarte