List p=16F84
Incluye “p16f84.inc”
cont1 equ 0x0C; asignamos direcciones de memoria
cont2 equ 0x0D
cont3 equ 0x0E
cont4 equ 0x0F
Lcd_var equ 0x10
org 0x00
goto Inicio
org 0x05
include “lcd_cxx.ini”
Inicio bsf STATUS, 5; Ponemos a 1 el bit 5 de STATUS (entramos en banco1)
movlw b`00001000´; Movemos la literal hasta el registro de trabajo,
(utilizamos una entrada RA3)
movwf TRISA; Movemos el registro de trabajo a TRISA
clrf TRISB; Ponemos el puerto B como salida.
mowf OPTION_REG
bcf STATUS,5; Ponemos a 0 el bit 5 de STATUS (entramos en banco 0)
call LCD_INI
movlw b`00001111´
call LCD_REG
clrf cont1; Ponemos a 0 los contadores y puerta B
clrf cont2
clrf cont3
clrf PORTB
Pregunta btfss PORTA, 3; Activamos el interruptor
goto Pregunta
Sigue call Temp; Si está activado el interruptor, empieza a contar
call Mostrar_lcd
incf con1,1; Cuando pasa 0,1seg incrementa contador 1
btfss PORTA,3; Pregunta si está desactivado el interruptor
call Mostrar_lcd; Si lo a puesto a cero muestra en LCD
movlw d`9´; Si no, mueve el nueve al registro de trabajo
subwf cont1,0; Resto 9 al contador 1
btfss STATUS,2; Pregunto si la resta es 0
goto Sigue; Si no es cero, sigue
call Temp
clrf cont1; Si el cont1 a llegado a 9 , se pone a 0
incf cont2,1; Incremento cont2
movlw d`9´; Llevo el 9 al registro de trabajo
subwf cont2,0; Resto 9 al contador 2
btfss STATUS,2; Pregunto se la resta es igual a 0
goto Sigue; Si no es cero, se va a sigue
call Temp
clrf cont1; Si el cont2 a llegado a 9, ponemos a 0 los contadores y STATUS,2
clrf cont2
incf cont3,1; Incremento cont3
movlw d`9´; Llevo el 9 al registro de trabajo
subwf cont3,0; Resto 9 al contador 3
btfss STATUS,2; Pregunto se la resta es igual a 0
goto Sigue; Si no es cero, se va a sigue
call Temp
clrf cont1; Si el cont3 a llegado a 9, se pone a 0 los contadores
clrf cont2
clrf cont3
goto Sigue; Volvemos al principio de la cuenta
Temp movlw d`2´; Muevo un dos al registro de trabajo
movwf cont4; Pongo cont4 a dos
Retardo bcf INTCON,2; Pone a cero el bit de rebasamiento del TMR0
movlw `61´; Muevo el 61 al registro de trabajo
movwf TMR0; Cargo el TMR0 hasta 61
Explora btfss INTCON,2; Pregunta si el TMR0 a llegado a 256 (activación del bit)
goto Explora; Si no, se va a explora
decfsz cont4; Si si, decremento cont4 y se va a retardo
goto Retardo
return; vuelve de la subrutina
Mostrar_lcd call LCD_REG
movlw d`30´
addwf cont3,0
call LCD_DATO
movlw 0x3a
call LCD_DATO
movlw d`30´
addwf cont2,0
call LCD_DATO
movlw d`30´
addwf cont1,0
call LCD_DATO
return
end