unid VAR BYTE ;variable unidades
dece VAR BYTE ;variable decenas
cent VAR BYTE ;variable centenas
mile VAR BYTE ;variable miles
actual var byte
cuenta var byte
chicha VAR porta.0 ;pin de la chicharra
pulsoreloj VAR porta.2 ;pulso segundos
resetear VAR porta.1 ;regresa a cero
activar VAR BIT ;bandera para la tecla contar
trisb=0 ;todo el puerto b es de salida
cmcon=7 ;Todo el puerto A en modo digital
pito:
high chicha
pause 200
low chicha
encerar:
unid=0 ;carga la variable unid con cero
dece=0 ;carga la variable dece con cero
cent=0 ;carga la variable cent con cero
mile=0 ;carga la variable mile con cero
actual=1
cuenta=0
;setea TMR0 de interrupción cada 32768 microsegundos
OPTION_REG = %1010110 ;setea TMR0 configurando y habilita PORTB pullups
INTCON = %10100000 ;hablilita TMR0 interrupción interna
ON INTERRUPT GOTO interrup
display:
portb= 224+unid ;224 %11100000, activa las unidades
PAUSE 3
portb= 208+dece ;208 %11010000, activa las decenas
PAUSE 3
portb= 176+cent ;176 %10110000, activa las centenas
PAUSE 3
portb= 112+mile ;112 %01110000, activa los miles
PAUSE 3
gosub interrup
GOTO display
;************** Handler de interrupciones para incrementar contador ***************
DISABLE ;deshabilita interrupciones durante el proceso
interrup:
if resetear=0 then pito
high pulsoreloj
cuenta = cuenta + 1 ;cuenta las interrupciones del TMR0
TMR0=4 ;resta 4 al contador de 256 del TMR0
IF cuenta < 31 THEN reset ;31 cuentas (32256ms = 999936uS)
cuenta = 0
low pulsoreloj
unid = unid + 1
IF unid >= 10 THEN
unid = 0
dece = dece + 1
IF dece >= 6 THEN
dece = 0
cent = cent + 1
IF cent>= 10 THEN
cent = 0
mile = mile + 1
IF mile>= 6 THEN
cent = 0
ENDIF
ENDIF
ENDIF
endif
reset:
INTCON.2 = 0 ;resetea la bandera de interrupción del TMR0
RESUME