;Registros de Chequear teclado
TECLA EQU 0x28 ;variable que va contando el numero de tecla
; Registro para CARGAR_REGISTROS
NTECLA EQU 0x29
TECLA_ANTERIOR EQU 0x30
; Registros temporales usados para delays y otras cosas mas
TMP1 EQU 0x31 ; RETARDO
TMP2 EQU 0x32 ; RETARDO
; Registros de MOSTRAR_DISPLAY
DIGITO1 EQU 0x33 ; 1er digito
DIGITO2 EQU 0x34 ; 2do digito
DIGITO3 EQU 0x35 ; 3er digito
DIGITO4 EQU 0x36 ; 4to digito
NDIGITO EQU 0x37 ; Numero de digito a mostrar
;Comienzo de programa
;Vector de reset
ORG 0x00
GOTO INICIO
;Vector de interrupcion
ORG 0x04
RETURN
TABLA:
ADDWF PCL, F
RETLW B'00000000'; Todo apagado
RETLW B'01111001';1
RETLW B'00100100';2
RETLW B'00110000';3
RETLW B'00001000';A
RETLW B'00011001';4
RETLW B'00010010';5
RETLW B'00000011';6
RETLW B'00000011';B
RETLW B'01111000';7
RETLW B'00000000';8
RETLW B'00011000';9
RETLW B'01000110';C
RETLW B'00001110';F
RETLW B'01000000';0
RETLW B'00100001';D
RETLW B'00000110';E
INICIO:
CLRF PORTB ;LIMPIA PORTB
CLRF PORTC ;LIMPIA PORTB
CLRF PORTD ;LIMPIA PORTB
BSF STATUS,RP0 ; ACEDO AL BANCO 1
MOVLW 0xF0 ; PORTB0-3 SALIDAS
MOVWF TRISB ; PORTB4-7 ENTRADAS
BCF OPTION_REG,7 ; HABILITA RESISTENCIA DE POLARIZACION EN ENTRADAS
CLRF TRISD ; PUERTO D COMO SALIDA AL DISPLAY
MOVLW B'11110000' ;DECLARANDO SALIDA LOR PUERTO DE 0 A 3
MOVWF TRISC ;PUERDO C COMO SALIDA
BCF STATUS,RP0 ;REGRESO AL BANCO 0
CLRF PORTB ;LIMPIA PORTB
CLRF PORTC ;LIMPIA PORTB
CLRF PORTD ;LIMPIA PORTB
MOVLW B'01000000'; COMIENZA CON 0 LOS DISPLAY
MOVWF PORTD
;Preparacion de los registros
CLRF DIGITO1
CLRF DIGITO2
CLRF DIGITO3
CLRF DIGITO4
CLRF NDIGITO
CLRF NTECLA
CLRF TECLA
PRINCIPAL:
CALL CHEQUEO_TECLA ; Verifica el teclado y devuelve un valor de 0x0 a 0xF en caso de presionado, o otro numero en caso de que no hay nada presionado
CALL CARGAR_REGISTROS ; Carga los registros para que MOSTRAR_DISPLAY muestre lo que debe
CALL MOSTRAR_DISPLAY ; MUESTRA EL VALOR AL DISPLAY
CALL RETARDO_5MS ;RETARDO
GOTO PRINCIPAL
CARGAR_REGISTROS:
MOVF TECLA, W
XORWF TECLA_ANTERIOR, W ; Reviso si la tecla presionada es la misma que la anterior ves que entro
BTFSC STATUS, Z
RETURN ; Es la misma, entonces salgo, no la tengo en cuenta.
MOVF TECLA, W
ANDLW 0xF ; ¿ No hay nada presionado ?, revisar que el numero sea
BTFSC STATUS, Z ; Tenemos 16 teclas que se pueden representar como 0x0 a 0xF, cualquier otro valor significa que no se presiono.
RETURN ; En caso de no ser un valor valido salgo
MOVLW DIGITO1 ; En caso de haber algo presionado, debo guardarlo
ADDWF NTECLA, W ; NTECLA me va a dar la posicion, y DIGITO1 la posicion inicial, es decir voy a guardar en DIGITO1 + NTECLA
MOVWF FSR
MOVF TECLA, W ;
MOVWF TECLA_ANTERIOR ; Guardo la tecla, para ser tenida en cuenta la proxima ves que entre aca
MOVWF INDF ; incremento en 1, para distinguirlo de cuando este todo apagado
INCF INDF, F
RETURN
MOSTRAR_DISPLAY:
MOVLW DIGITO1 ;La direccion de Digito1 (0x33)
ADDWF NDIGITO, W ;Le agrego el numero de digito
MOVWF FSR
MOVF INDF, W ; Obtengo el valor de (0x33 + N de digito)
CALL TABLA ; Ya poseeo el digito, ahora con esto consigo el valor a poner en el display
MOVWF PORTD ; Pongo el valor en el Puerto
RLF PORTC, W ; el PORTC podemos hacer que tenga un 1, y lo vamos rotando asi queda 0001 luego 0010 lueg 0100 y asi
ANDLW 0xF ; Revizamos si paso de 0000 1000 a 0001 0000
BTFSC STATUS, Z ; En caso de serlo, ponemos a 1 el Carry para comenzar de nuevo
BSF STATUS, C ; Esto tiene en cuenta que las RC4 a RC7 sean entradas
RLF PORTC, F ; Rotamos el PORTC
INCF NDIGITO, F ; Incrementamos nuestro numero de digito a mostrar
MOVF NDIGITO, W ; Cuando nos pasemos, es decir mostyramos los digitos 1,2,3 y4 (numeros 0,1,2 y 3 respectivamente)
XORLW 0x4 ; Reseteamos asi vuelve a mostrar del primero
BTFSC STATUS, Z
CLRF NDIGITO
RETURN