de este mismo foro me e bajado el codigo de un reloj digital ,la cuestion es que no funciona cuando llega a un segundo.
el segundo se calcula con el tmr0 , tengo una variable como se puede observar llamada seg ,cuando esta llega a 60 la variable de minuto se incrementa en 1 ,lo curioso es que cuando llega exactamente a un 60 se bloquea la simulacion, pero en cambio bajo ese valor a 40 ,35 20 ,50 y funciona perfectamente.
Algo pasa cuando pasan 60 segundos
perdonen por las molestias causadas
este programa se definio apartir del original cabe argumentar que este programa es un contador desendente apartir de 10000 y tiene exactamente el mismo problema que el original el cual eara un reloj digital con lcd para un pic 16f84
sera porque estoy compilando un programa de pic basic pro en pic basic plus
CODIGO
' Define registros del LCD y bits
DEFINE LCD_DREG PORTA
DEFINE LCD_DBIT 0
' Primer bit de datos en PortA.0 , en modo a 4 bits
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 0
' Señal del LCD RS en PortB.6
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 1
' Señal del LCD Enable en PortB.7
DEFINE LCD_LINES 2
INCLUDE "modedefs.bas"
DEFINE OSC 4
' Grupo de variables tipo Byte
'Hora var byte ' Variable con el dato de la hora.
'DispH var byte ' Hora a mostrar en el display.
Minuto var WORD ' Variable con el dato de los minutos.
Seg var byte ' Variable con el dato de los segundos.
TicTac var byte ' Variable con las fracciones de segundo.
Actual var bit ' Bandera de actualizacion del display.
i var byte ' Variable para retardos teclado.
'definicion del teclado
DecMin var PORTB.7 'Tecla decrementar minutos
IncMin var PORTB.6 'Tecla incrementar minutos
'DecHora var PORTB.5 'Tecla decrementar hora
'IncHora var PORTB.4 'Tecla incrementar hora
clear 'borrar variables
pause 300 ' espera reactivacion display LCD
Actual = 1 'fuerza actualizacion del display
'seteo del TMR0 para interrupcion cada 16.384 milisegundos
OPTION_REG =$55 'Configura TMR0 y habilita PullUps
INTCON = $A0 'Habilita interrupciones
on interrupt goto Interr
MINUTO=10000
Principal:
PORTB = 0 'lineas en bajo para leer pulsadores
TRISB = $f0 'habilita los pulsadores
'chequea los pulsadores
if DecMin = 0 then baja_min
if IncMin = 0 then sube_min
'chequeo para ver si hay que actualizar display
Chequeo:
if Actual = 1 then
lcdout $fe, 1 'borra display
'hora en formato hh:mm:ss
' DispH = Hora 'cambia hora entre 0 y 12
' if (Hora // 12) = 0 then
' DispH = DispH + 12
' endif
'chequea si es AM o PM
if actual=1 then
lcdout dec5 Minuto,":", dec2 Seg
' else
' lcdout dec5 Minuto,":", dec2 Seg,"PM"
endif
Actual = 0 'display ya esta actualizado
endif
goto Principal 'loop infinito
'Rutinas
baja_min:
Minuto = Minuto - 100
if Minuto <=0000 then
Minuto = 10000
endif
goto Debounce
sube_min:
Minuto = Minuto + 100
if Minuto >= 10001 then
Minuto = 100
endif
goto Debounce
Debounce:
for i = 1 to 25
pause 10 'con 10 milisegundos no se perderan interrupciones
next i
Actual = 1 'actualizar display
goto Chequeo
'rutina de interrupcion
disable
Interr:
TicTac= TicTac + 1
if TicTac < 61 then SalirTic
'paso un segundo, actualizar tiempo
TicTac = 0
Seg = Seg + 1
if Seg >= 10 then
Seg = 1
Minuto = Minuto - 1
' if Minuto >= 60 then
' Minuto = 0
' Hora = Hora + 1
' if Hora >= 24 then
' Hora = 0
' endif
' endif
endif
Actual = 1
SalirTic:
INTCON.2 = 0 'resetea flag de interrupcion del timer
resume
end