Les dejo este material para revisar en el caso de mejoras, de seguro las tiene, me costo mucho trabajo llegar a esto, esta funcionando.
Es un monedero echo con un pic 16f873a.
con el pulsador incrementamos el conteo descendente de 60 en 60 minutos, al llegar a cero por el puerto Rb7 se escuchara un buzzer por 10 segundos y quedara en la espera del pulsador.
en espera aparecxe la leyenda ON en los display.
les dejo el hex y archivo de proteus para que lo revicen.
'TEMPORIZADOR PARA MONEDERO
'REESCRITO POR JAVIER SARACHO
'FECHA 2/4/13
'PIC BASIC PRO
'------------------------------------------------------------------------------
Include "P16F873A.inc"
Define OSC 4 'DEFINO OSCILADOR EXTERNO
Define BUTTON_PAUSE 1000 'DEFINO DELAY PARA PULSADOR
'------------------------------------------------------------------------------
@_Config_INTRC_OSC_NOCLKOUT 'CONFIGURACIONES BASICAS
@_Config_WDT_OFF
@_Config_MCLRE_OFF
@_Config_CP_ON
@_Config_PWRTE_ON
@_Config_OST_ON
'------------------------------------------------------------------------------
TRISA=%111100 'DEFINO PUERTOS
TRISB=0
TRISC=0
'------------------------------------------------------------------------------
PORTA=%111100 'ESTABLESCO EL ESTADO DE LOS PUERTOS
PORTB=0
PORTC=0
'------------------------------------------------------------------------------
ADCON1=%00001110 'DEFINO PUERTOS COMO DIGITALES
PCON=%00000001 'POWER CONTROL, POR-BOR(POWER ON RESET-BROWN OUT RESET)
OPTION_REG=%00000111 'DEFINO PRESCALER TIMER0
INTCON=%10100000 'HABILITO INTERRUPCIONES Y TIMER0
Symbol PUL=porta.3
'-------------------------------------------------------------------------------
I var Byte 'Variables
d1 var Byte
d2 var Byte
d3 var Byte
M var Word
DATO var Byte[10]
AA var Byte
TIM var Word
'------------------------------------------------------------------------------
DATO[0]=63 'Cargo en la memoria los numeros en binario
DATO[1]=6
DATO[2]=91
DATO[3]=79
DATO[4]=102
DATO[5]=109
DATO[6]=125
DATO[7]=7
DATO[8]=127
DATO[9]=103
Pause 500
'------------------------------------------------------------------------------
inicio:
Button PUL,0,0,0,AA,1,Suma 'Pulsador para la suma de tiempo de 60' en 60'
If M=0 Then I=0
portb.7=1 'Buzzer por 10 seg
Pause 10000
portb.7=0
Call Esperar
Paso:
For M = I to 0 step -1 'Conteo Regresivo
Call Mostrar
Next M
Goto inicio
Mostrar: 'Muestro en display 7 segmentos
portc.7=1 'Led deberia parpadear pero me agoto!
d1=M DIG 0
d2=M DIG 1
d3=M DIG 2
porta.0=1 'Port A0, A1, habilitan display Catodo(-)
portc=DATO[d1] 'Digito 1
portb=DATO[d3] 'Digito 3
Pause 10
porta.0=0
porta.1=1
portc=DATO[d2] 'Digito 2
portb=%01110110
Pause 10
porta.1=0
Button PUL,0,0,0,AA,1,Suma1
If TIM=915 Then
TIM=0
Return
Endif
'-----------------------------------------------------------------------------
ON INTERRUPT GOTO Mas 'Interrupcion Timer0
INTCON=%10100000
Disable
Goto mostrar
Suma:
I = I + 60
Return
Suma1:
M=M+61
Return
'-----------------------------------------------------------------------------
Mas: 'Salto de interrupcion, sumo 1 a TIM
INTCON=%10100000 'Cuando TIM = 915 entoces son 59,965 seg
portc.7=0
TIM=TIM+1
INTCON.2=0 'reinicio TMR0
Enable 'Activo las interrupciones
Return
'------------------------------------------------------------------------------
Esperar: 'Muestro en display -On-
porta.0=1
portb=%00111111
portc=%01000000
Pause 5
porta.0=0
Pause 2
porta.1=1
portb=%01000000
portc=%01010100
Pause 5
porta.1=0
Pause 2
Button PUL,0,0,0,AA,1,Suma 'Con el pulsador a 0 pongo mi contador TIM=0
If PUL=0 Then Goto Paso 'Voy a Paso
TIM=0
Goto esperar 'Si no Espera
End