#include <p18f4550.h>
#include <types.h>
#include "lcdint.h"

/* Configuration */
#pragma _CONFIG1L _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_1_1L
#pragma _CONFIG1H _FOSC_HSPLL_HS_1H & _FCMEM_OFF_1H & _IESO_OFF_1H
#pragma _CONFIG2L _PWRT_OFF_2L & _BOR_ON_2L & _BORV_21_2L & _VREGEN_OFF_2L
#pragma _CONFIG2H _WDT_OFF_2H & _WDTPS_32768_2H
#pragma _CONFIG3H _MCLRE_ON_3H & _LPT1OSC_ON_3H & _PBADEN_OFF_3H & _CCP2MX_ON_3H
#pragma _CONFIG4L _STVREN_ON_4L & _LVP_OFF_4L & _ICPRT_OFF_4L & _XINST_ON_4L & _DEBUG_OFF_4L

__interrupt__ void lo_pri_ISR()
{
	if (lcd_poll()) lcd_handle();
}

int main(void)
{
	char c = 0;
	uint8_t i;
	uint8_t* cgptr;

	LATD = 0;
	lcd_init();

	/* Enable low-priority interrupts for Timer0 */
	lcd_enable_low_pri_interrupt();
	RCON |=   0b10000000;  /* Enable interrupt priorities */
	INTCON |= 0b11000000;  /* Enable interrupts globally */

	/* Enable port B pull-ups */
	TRISB = 0xff;
	INTCON2 &= 0b01111111;

	cgptr = lcd_cgram;
	*(cgptr++) = 0b00010;
	*(cgptr++) = 0b01110;
	*(cgptr++) = 0b10010;
	*(cgptr++) = 0b10010;
	*(cgptr++) = 0b10010;
	*(cgptr++) = 0b01100;
	*(cgptr++) = 0b00000;
	*(cgptr++) = 0b00000;

	*(cgptr++) = 0b00000;
	*(cgptr++) = 0b10001;
	*(cgptr++) = 0b10101;
	*(cgptr++) = 0b10101;
	*(cgptr++) = 0b01010;
	*(cgptr++) = 0b01010;
	*(cgptr++) = 0b00000;
	*(cgptr++) = 0b00000;

	*(cgptr++) = 0b00000;
	*(cgptr++) = 0b00110;
	*(cgptr++) = 0b01001;
	*(cgptr++) = 0b01111;
	*(cgptr++) = 0b01000;
	*(cgptr++) = 0b00110;
	*(cgptr++) = 0b00000;
	*(cgptr++) = 0b00000;

	*(cgptr++) = 0b00000;
	*(cgptr++) = 0b00110;
	*(cgptr++) = 0b01001;
	*(cgptr++) = 0b01001;
	*(cgptr++) = 0b01001;
	*(cgptr++) = 0b01001;
	*(cgptr++) = 0b00000;
	*(cgptr++) = 0b00000;

	*(cgptr++) = 0b00000;
	*(cgptr++) = 0b00110;
	*(cgptr++) = 0b01001;
	*(cgptr++) = 0b01001;
	*(cgptr++) = 0b01001;
	*(cgptr++) = 0b00111;
	*(cgptr++) = 0b00001;
	*(cgptr++) = 0b00110;

	*(cgptr++) = 0b00000;
	*(cgptr++) = 0b00110;
	*(cgptr++) = 0b01001;
	*(cgptr++) = 0b01001;
	*(cgptr++) = 0b01001;
	*(cgptr++) = 0b00110;
	*(cgptr++) = 0b00000;
	*(cgptr++) = 0b00000;
	lcd_update_cgram();

	lcd_write("\n\t\t\t\t\t\t\t\t\t\t\17\1\2\3\4\5");

	lcd_backlight_on();
	lcd_config_display(7);

	for(;;)
	{
		if (lcd_is_idle_since_ms(250))
		{
			if (!c) c = 16;
			lcd_set_pos(0,0);
			lcd_putc((c / 100u) + '0');
			lcd_putc(((c/10u) % 10u) + '0');
			lcd_putc((c % 10u) + '0');
			lcd_x += 2;
			for (i = 0u; i < 10u; i++) lcd_putc(c);
			c++;
		}
	}
}

