Consegui un ejemplito interesante que estoy comenzando a estudiar y a simular, me pongo con esto a ver si sale, cualquier data estoy mirando asi que el que se quiera sumar es bienvenido!
#include <18F448.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#use delay(clock=8000000)
#case
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#ignore_warnings 202
#byte port_a=0xf80
void scan_pushbutton(void);
void restart_countdown(void);
unsigned long GLOBAL_keypad_inactivity_timer;
unsigned int GLOBAL_button_flag;
enum
{
STATE_BACKLIGHT_OFF,
STATE_BACKLIGHT_ON
};
#INT_TIMER1 // This function is called every time
void clock_isr() // timer 1 overflows (65535->0), which is
{ // approximately 19 times per second for
// this program.
if (GLOBAL_keypad_inactivity_timer > 0)
{
GLOBAL_keypad_inactivity_timer--;
}
}
void main(void)
{
int state;
restart_countdown();
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
set_timer1(0);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
state = STATE_BACKLIGHT_OFF;
printf ("Start: Backlight initially OFF\r\n");
while (1)
{
scan_pushbutton(); // This updates the state of the pushbutton.
switch (state)
{
case STATE_BACKLIGHT_OFF:
if (GLOBAL_button_flag)
{
printf ("Turn on LCD here.\r\n");
printf (" restart x-minute timer\r\n");
restart_countdown();
state = STATE_BACKLIGHT_ON;
}
break;
case STATE_BACKLIGHT_ON:
if (GLOBAL_button_flag)
{
printf (" restart x-minute timer\r\n");
}
else if (GLOBAL_keypad_inactivity_timer == 0)
{
printf ("Turn off LCD here.\r\n");
state = STATE_BACKLIGHT_OFF;
}
break;
default:
break;
}
}
}
void scan_pushbutton(void)
{
if (GLOBAL_button_flag)
{
if (port_a & 0x10) // input has gone up
{
delay_cycles(10);
if (port_a & 0x10)
{
GLOBAL_button_flag = 0;
}
}
}
else
{
if (!(port_a & 0x10))
{
delay_cycles(10);
if (!(port_a & 0x10))
{
GLOBAL_button_flag = 1;
}
}
}
}
// 8000000/(4*1*65535) * 60 minutes/sec * 2 minutes = 3662
void restart_countdown(void)
{
GLOBAL_keypad_inactivity_timer = 3662;
}