'*****PIC16F88, 3x7 Segmentos Led Display******
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'-----Ignora los valores de Waitms-----
Define SIMULATION_WAITMS_VALUE = 1
'-----DECLARO VARIABLES----------
Dim contador As Word
Dim aux_contador As Word
Dim conversion As Word
Dim digito1 As Byte
Dim digito2 As Byte
Dim digito3 As Byte
Dim mascara As Byte
Dim tmr1ms As Byte
Dim tmr2ms As Byte
Dim tmr3ms As Byte
Dim tmr1ms_tp As Byte
Dim tmr2ms_tp As Byte
Dim tmr3ms_tp As Byte
Dim tecla As Bit
Dim lcd_digito As Byte
Dim flag As Byte
'-----ASIGNACION DE VALORES A VARIABLES-----
contador = 0
conversion = 0
digito1 = 0
digito2 = 0
digito3 = 0
tmr1ms_tp = 2
tmr2ms_tp = 1 '2 valor real
tmr3ms_tp = 3 '200 valor real
lcd_digito = 1
'-----CONFIGURO REGISTROS-----
AllDigital 'Pin I/O Digitales
CMCON = 0x07 'comparador a off
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = %00000010
TRISB = %00000000
'-----INICIALIZO PIN----------
PORTA = %00000000
PORTB = %00000000
'-----INICIALIZA INTERRUPCIONES CADA 1mSeg. CON EL TIMER1-----
T1CON.TMR1CS = 0 'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0 'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0 'factor del preescales del timer1, 0
TMR1H = 0xf8 'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30 'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1 'habilitacion del TMR1, comienza a incrementarce
PIE1.TMR1IE = 1 'activa las interrupciones del timer1
INTCON.PEIE = 1 'bit de habilitacion de interrupciones de perifericos
Enable 'INTCON.GIE habilita todas las interrupciones globales
'-----COMIENZO----------
loop:
'-----CENTENAS, DECENAS, UNIDADES----------
digito1 = contador / 100 'calculo centenas
aux_contador = contador - (digito1 * 100) '___calculo decenas
digito2 = aux_contador / 10 '_________________
digito3 = aux_contador - (digito2 * 10) 'calculo unidades
'-----MUESTRO UNIDADES----------
If lcd_digito = 1 Then
mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), digito3
PORTB = mascara
RA0 = 1
flag = 1 'control rutina demora digito
tmr2ms = 0 'activa base de tiempos
Endif
'-----MUESTRO DECENAS----------
If lcd_digito = 2 Then
mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), digito2
PORTB = mascara
RA.7 = 1
flag = 2 'control rutina demora digito
tmr2ms = 0 'activa base de tiempos
Endif
'-----MUESTRO CENTENAS----------
If lcd_digito = 3 Then
mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f), digito1
PORTB = mascara
RA6 = 1
flag = 3 'control rutina demora digito
tmr2ms = 0 'activa base de tiempos
Endif
'-----INCREMENTA SI DETECTA TECLA-----
If tecla = 1 And tmr3ms >= tmr3ms_tp Then
contador = contador + 1
tecla = 0 'desbloquea tecla
tmr3ms = 0 'activa base de tiempos
Endif
Goto loop
End
'-----INTERRUPCIONES-----
On Interrupt 'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
TMR1H = 0xf8 'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30 'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
Save System 'Guarda los valores del sistema para poder reemprender el curso normal del programa
If PIR1.TMR1IF = 1 Then 'comprueba que la interrupcion del timer1 es activa
If tmr1ms < tmr1ms_tp Then tmr1ms = tmr1ms + 1 'tmr1
If tmr2ms < tmr2ms_tp Then tmr2ms = tmr2ms + 1 'tmr2
If tmr3ms < tmr3ms_tp Then tmr3ms = tmr3ms + 1 'tmr3
Endif
If RA1 = 0 And tecla = 0 Then tecla = 1
'_____Control digitos-----
If flag = 1 Then 'control digito a ON
If tmr2ms >= tmr2ms_tp Then 'digito a OFF a los 2mSeg.
RA.0 = 0 'apaga digito
lcd_digito = 2 'selecciona el siguiente digito
Endif
Endif
If flag = 2 Then 'control digito a ON
If tmr2ms >= tmr2ms_tp Then 'digito a OFF a los 2mSeg.
RA.7 = 0 'apaga digito
lcd_digito = 3 'selecciona el siguiente digito
Endif
Endif
If flag = 3 Then 'control digito a ON
If tmr2ms >= tmr2ms_tp Then 'digito a OFF a los 2mSeg.
RA.6 = 0 'apaga digito
lcd_digito = 1 'selecciona el siguiente digito
Endif
Endif
'_____
PIR1.TMR1IF = 0 'borra el flag de salto del tmr1
Resume 'activa las interrupciones y retorna al curso normal del programa antes del salto
End