'---------- Solo simulacion, rectificado By COS
Define CONF_WORD = 0x3ff2
Define CLOCK_FREQUENCY = 8
'Define SIMULATION_WAITMS_VALUE = 1
'**************** Pic16F84 ********************
'**********************************************
'-- DECLARO VARIABLES
Dim mascara As Byte
Dim digito As Byte
Dim numero As Word
Dim timer0 As Byte
Dim timer1 As Byte
Dim timer2 As Byte
Dim timer0_tiempo As Byte
Dim timer1_tiempo As Byte
Dim timer2_tiempo As Byte
Dim tecla1 As Byte
Dim digito0 As Word
Dim digito1 As Word
Dim digito2 As Word
Dim digito3 As Word
Dim aux_digito As Word
Dim indice As Byte
'--Asiganacion de valores a variables
mascara = 0
digito = 0
numero = 0
tecla1 = 0
timer0_tiempo = 1 '150 'Retarado entre pulsacion en mSeg. (valor real 150)
timer1_tiempo = 1 'Libre
timer2_tiempo = 10 'Libre
numero = 4321
'-- CONFIGURO PUERTOS
AllDigital 'Desactivo comparadores
TRISA = %10000 'Configuro entradas y salidas PORTA
TRISB = %00000000 'Configuro entradas y salidas PORTB
PORTA = %00000000 'Limpio PORTA
PORTB = %00000000 'Limpio PORTB
'-----Inicializacion de Interrupciones por TIMER0-----------------------------
OPTION_REG.T0CS = 0 'selecciona reloj interno
OPTION_REG.PSA = 0 'asigna el prescales al timer0
OPTION_REG.PS0 = 1 'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS1 = 1 'bits de la seleccion del factor de division,prescaler 16
OPTION_REG.PS2 = 0 'bits de la seleccion del factor de division,prescaler 16
INTCON.T0IF = 0 'borra el flag de desbordamiento del timer0
TMR0 = 130 'cargo el registro del tmr0 para que desborde cada 1mS
'TMR0 = 250 'habilitar para simulacion
Enable 'INTCON.GIE habilita las interrupciones globales
INTCON.T0IE = 1 'INTCON.tmr0ie = 1 'habilita las interrupciones del timer0
'----------------------------------------------------------------------------
'------------------ Rutina del programa principal ---------------------------
main: 'Rutina principal
If tecla1 = 1 Then Gosub sub_tecla1 'Activa evento tecla
Goto main 'Impide que la rutina principal termine
'----------------------------------------------------------------------------
End
'--Subrutinas generales
sub_tecla1: 'Si se pulso la tecla
numero = numero + 1 'Incrementa el numero a mostrar
tecla1 = 0 'Deja la tecla libre
Return
'-- RUTINA DE VISUALIZACIÓN POR INTERRUPCIÓN y bases de tiempos
On Interrupt 'Rutina interrupciones
TMR0 = 130 'cargo el registro del TMR0 para que desborde cada 1ms
'Descompone el numero a mostrar en digitos
digito3 = numero / 1000 'calculo unidades de millar
aux_digito = numero - (digito3 * 1000) '___calculo centenas
digito2 = aux_digito / 100 '_________________
digito1 = (aux_digito - (digito2 * 100)) / 10 'calculo decenas
digito0 = aux_digito - ((aux_digito / 10) * 10) 'calculo unidades
'Selecciona el numero a mostrar
If digito = 0 Then indice = digito0
If digito = 1 Then indice = digito1
If digito = 2 Then indice = digito2
If digito = 3 Then indice = digito3
mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), indice
'Apaga display y carga puerto (mascara)
RA.1 = 0
RA.2 = 0
RA.3 = 0
RA.0 = 0
PORTB = mascara
'Enciende digito
If digito = 0 Then 'Unidades
RA.0 = 1
Endif
If digito = 1 Then 'Decenas
RA.1 = 1
Endif
If digito = 2 Then 'Centenas
RA.2 = 1
Endif
If digito = 3 Then 'Unidades de millar
RA.3 = 1
Endif
digito = digito + 1 'selecciona el proximo digito
If digito > 3 Then digito = 0 'Reinicia digito
'Bases de tiempos
If timer0 < timer0_tiempo Then timer0 = timer0 + 1
If timer1 < timer1_tiempo Then timer1 = timer1 + 1
If timer2 < timer2_tiempo Then timer2 = timer2 + 1
'Detecta teclas
If timer0 >= timer0_tiempo And RA4 = 1 Then 'Detecta tecla pulsada + retardo
tecla1 = 1 'Activa la secuencia de la tecla
timer0 = 0 'Reinicia el timer
Endif
'TMR0 = 250 'habilitar para simulacion
INTCON.T0IF = 0 'habilita nuevamente la interrupción
Resume