'******** EJEMPLO DE INTERRUPCIONES Y LCD *********
'******** PROBADO EN LA PLACA PIC EBASIC **********
'******** PIC16F88 ********************************
'CONFIGURACION DE BIT Y FRECUENCIA RELOJ-----------
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'COMFIGURACIN LCD----------------------------------
Define LCD_BITS = 4 'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA 'el bus de datos sera el puerto A
Define LCD_DBIT = 0 'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7 'se usara el RB7 como RS
Define LCD_EREG = PORTB 'el bit de control E sera del puerto B
Define LCD_EBIT = 6 'se usara el RB6 como E
Define LCD_COMMANDUS = 2000 'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
'---------------------------------------------------
'Define SIMULATION_WAITMS_VALUE = 1 'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
'VARIABLES------------------------------------------
'INICIO VARIABLES-----------------------------------
a = 0
ss = 0
m = 0
h = 0
'CONFIGURACION PIN----------------------------------
ANSEL = 0x00 'los pin I/O digitales (no analogicos)
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07 'comparador a off
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'puerto B como salidas
'CONFIGURACION TMR0---------------------------------
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
TMR0 = 130 'cargo el registro del tmr0 para que desborde cada 1mS
'PERMITE INTERRUPCIONES------------------------------
INTCON.PEIE = 1 'bit de habilitacion de interrupciones de perifericos
Enable 'INTCON.GIE habilita todas las interrupciones globales
'INICIO PROGRAMA-------------------------------------
Lcdinit 'inicializa el lcd sin cursor
WaitMs 100 'pausa de 100mSeg.
Lcdout "Pruebas LCD/INT." 'Escribe literal en lcd
WaitMs 3000 'pausa 3Seg.
Lcdcmdout LcdClear 'Borra LCD
INTCON.TMR0IE = 1 'habilita las interrupciones del timer0
'PROGRAMA--------------------------------------------
main:
'Cuerpo del programa vacío
GOTO main
END 'NO OLVIDAR NUNCA PONERLO ON Interrupt
'desactiva las interrupciones 'Save System 'Guarda los valores del sistema
a = a + 1
IF a = 20 THEN '129
a = 0
ss = ss + 1
Endif
IF ss = 10 THEN '60
ss = 0
m = m + 1
Endif
IF m = 5 THEN '60
m = 0
h = h + 1
Endif
Lcdcmdout LcdLine1Home 'paso a inicio primera linea del lcd
Lcdout "A:", #a, " " 'Escribe literal y varibles
Lcdcmdout LcdLine2Home 'paso a la segunda linea
Lcdout "H:", #h, " M:", #m, " S:", #ss, " " 'Escribe literal y variables
TMR0 = 130 'cargo el registro del tmr0 para que desborde cada 1mS
INTCON.TMR0IF = 0 'borra el flag de desbordamiento del timer0
RESUME