__CONFIG _LVP_OFF & _MCLRE_OFF & _BODEN_OFF & _CP_OFF & _PWRTE_Off & _WDT_OFF & _INTOSC_OSC_NOCLKOUT
LIST P=16F628A ;Procesador utilizado.
INCLUDE <P16F628A.INC>
ERRORLEVEL 0, -302 ;suppress bank selection messages
;****************************** MAPA DE MEMORIA ****************************
CBLOCK 0x20
Digito
Digito10
CONTADOR
Data_EE
Addr_EE
Contador1
Contador2
ENDC
;****************************** ZONA DE DATOS ****************************
#define Banco0 bcf STATUS,RP0
#define Banco1 bsf STATUS,RP0
#define LED PORTA,2
org 0x000
goto Inicio
Inicio
bsfSTATUS,RP0; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
movlwb'00000011'; PORTA CONFIGURADO COMO ENTRADA
movwfTRISA
movlwb'00000000'; PORTB CONFIGURADO COMO SALIDA
movwfTRISB
bcfOPTION_REG,NOT_RBPU ;Activa las resistencias Pull-Up del Puerto B
bcfSTATUS,RP0; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
;************************** ZONA DE INSTRUCCIONES ************************
CLRFPORTA
CLRFPORTB
CLRFDigito;REGISTRO PARA GUARDAR DATO PARA GRABAR EN EEPROM
CLRFINTCON
MOVLW 0x07 ;PARA DESHABILITAR LOS COMPARADORES
MOVWF CMCON
CALLLeeEprom
TESTEO
DT"OBSOLESCENCIA PROGRAMADA"
movlw 0x0A ; cargo W con 10, para transferirlo
movwf Digito10
BTFSSPORTA,0; Testeamos si esta a 1 logico.-
GOTOTESTEO; No, seguimos testeando.-
CALLDemora_20ms; Eliminamos Efecto rebote
BTFSSPORTA,0; Testeamos nuevamente.-
GOTOIDENTIFICAR;RUT1
btfssPORTA,1; Testeamos si esta a 1 logico.-
GOTO RD_LED
GOTO TESTEO
IDENTIFICAR
BTFSSLED;REVISO EN QUE ESTADO ESTA EL LED
GOTOE_LED;SI ESTA EN 0 VOY A LA SUBRUTINA PARA ENCENDERLO
GOTOA_LED;SI ESTA EN 1 VOY A LA SUBRUTINA PARA APAGARLO
GOTOTESTEO;Testeamos nuevamente.
E_LED
MOVFDigito,W
SUBWF Digito10,0 ; realizo la resta 10-Digito
btfsc STATUS,Z ; si W=11, entonces Z=1
goto DANO ; Cambio el numero mostrado
BSFLED
INCFDigito,1
CALLGrabaEprom
btfscPORTA,0; Esperamos a que se suelte el pulsador -**-
goto$-1; No, PCL - 1, --> btfssPORTA,Pulsador.-
callDemora_20ms; Eliminamos efecto rebote.-
btfscPORTA,0; Testeamos nuevamente.-
goto$-4
GOTOTESTEO
A_LED
BCFLED
btfscPORTA,0; Esperamos a que se suelte el pulsador -**-
goto$-1; No, PCL - 1, --> btfssPORTA,Pulsador.-
callDemora_20ms; Eliminamos efecto rebote.-
btfscPORTA,0; Testeamos nuevamente.-
goto$-4
GOTOTESTEO
DANO
BCFLED
BTFSSPORTA,1
GOTORD_LED
GOTODANO
RD_LED
movlw 0x00 ; cargo W con 10, para transferirlo
movwf Digito
CALLGrabaEprom
btfscPORTA,1; Esperamos a que se suelte el pulsador -**-
goto$-1; No, PCL - 1, --> btfssPORTA,Pulsador.-
callDemora_20ms; Eliminamos efecto rebote.-
btfscPORTA,1; Testeamos nuevamente.-
goto$-4; No, Falsa alarma, volvemos a testear a que se suelte (**).-
GOTO TESTEO
;******************************************************************************
;********************************** EPROM **********************************
;******************************************************************************
GrabaEprom
MOVLW 0x00 ; Direccion de la eprom a grabar
MOVWF Addr_EE
MOVFW Digito ; dato a enviar
MOVWF Data_EE
CALL GRABAR_EEPROM
return
LeeEprom
MOVLW 0x00 ; Direccion que deseo leer
MOVWF Addr_EE
CALL LEER_EEPROM
MOVFW Data_EE ;el dato obtenido de la eeprom
MOVWF Digito ;lo pasa a este registro
return
;-------------------------------------------------------------------------------------------
; Graba en la memoria EEPROM, verificando la grabación exitosa. En caso de error en la
; grabación, vuelve a intentarlo.
;
; In: Addr_EE (Reg) -> Dirección de la EEPROM donde grabar
; In: Data_EE (Reg) -> Dato a grabar
;
; Nota: - El banco de salida es el 0.
; - Modificar según se utilicen Interrupciones o no.
;
GRABAR_EEPROM
BANKSEL Addr_EE
MOVF Addr_EE,W ; Mueve el valor del "Addr_EE" a "W"
Banco1
MOVWF EEADR ; Mueve el valor de "W" al registro "EEADR"
BANKSEL Data_EE
MOVF Data_EE,W ; Mueve el valor del "Data_EE" a "W"
Banco1
MOVWF EEDATA ; Mueve el valor de "W" al registro "EEDATA"
BSF EECON1,WREN ; Habilita el BIT de escritura en la EEPROM (WREN)
;-------------------------------------------------------------------------------------------;
BCF INTCON, GIE ; Desabilita las interrupciones
MOVLW 0x55 ; Secuencia obligatoria
MOVWF EECON2 ; para activar la grabación
MOVLW 0xAA ; de la memoria
MOVWF EECON2 ; EEPROM
BSF EECON1,WR ; Inicia el ciclo de escritura Bit WR
;-------------------------------------------------------------------------------------------;
; BSF INTCON, GIE ; Habilita las interrupciones
Banco0
GRABAR_EEPROM_ESPERAR clrwdt
BTFSS PIR1,EEIF ; Lee ek EEIF y salta una instrucción si el valor es 1
GOTO GRABAR_EEPROM_ESPERAR ; Espera de grabación de la EEPROM
BCF PIR1,EEIF ; Limpia el flag EEIF
Banco1
BCF EECON1,WREN ; Deshabilita el Bit de escritura de la EEPROM (WREN)
BANKSEL Data_EE
GRABAR_EEPROM_VERIFICACION
MOVFW Data_EE ; Coloca el valor leido en W
Banco1
BSF EECON1, RD ; Leer la EEPROM
SUBWF EEDATA, W ; Compara el valor leido con el grabado
BTFSS STATUS,Z ; Si son iguales, salta una instrucción
GOTO GRABAR_EEPROM ; Si no son iguales, comienza de nuevo la rutina
Banco0
RETURN
; Fin Rutina: GRABAR_EEPROM ----------------------------------------------------------------
;-------------------------------------------------------------------------------------------
; Lee la memoria EEPROM
; In: Addr_EE (Reg) -> Dirección de la EEPROM donde leer
; Out: Data_EE (Reg) -> Dato leido
;
LEER_EEPROM
BANKSEL Addr_EE ;lo situa automaticamente en el banco correspondiente
MOVFW Addr_EE ; Carga la dirección en W
Banco1
MOVWF EEADR ; Coloca la dirección en EEADR
BSF EECON1, RD ; Leer la EEPROM
MOVF EEDATA, W ; Coloca en W el contenido de la EEPROM
BANKSEL Data_EE
MOVWF Data_EE ; Coloca en Data_EE el contenido de W
Banco0
RETURN
Demora_20ms
movlw0xFF
movwfContador1; Iniciamos contador1.-
Repeticion1
movlw0x19;
movwfContador2; Iniciamos contador2
Repeticion2
decfszContador2,1; Decrementa Contador2 y si es 0 sale.-
gotoRepeticion2; Si no es 0 repetimos ciclo.-
decfszContador1,1; Decrementa Contador1.-
gotoRepeticion1; Si no es cero repetimos ciclo.-
return; Regresa de la subrutina.-
END