#pragma num_alias_table_entries	14
#pragma enable_multiple_baud
#include 

IO_0 output bitshift numbits(8) clockedge(+) io_com_data;
IO_2 output bit en;

IO_5 input bit up;
IO_6 input bit down;
IO_7 input bit enter;
IO_8 input bit esc;

network input SNVT_count nvi_no_lighting = 1;

int item = 1;
int cur_pos = 1;
int mnu_pos = 1;
char display[20];

eeprom unsigned int no_lighting = 1;

void writecmd(int a)
{
	io_out(en, 1);
	io_out(io_com_data, 0b00000000UL);
	io_out(io_com_data, a);
	io_out(en, 0);
	delay(0);
}

void command(int a)
{
	io_out(en, 1);
	io_out(io_com_data, 0b00000000UL);
	switch(a)
	{
		case 0:
			io_out(io_com_data, 0b00000001UL);	//clear
			break;
		case 1:
			io_out(io_com_data, 0b00111000UL);	//datainterface
			break;
		case 20:
			io_out(io_com_data, 0b00001000UL);	//displayoff
			break;
		case 21:
			io_out(io_com_data, 0b00001100UL);	//displayon
			break;
		case 30:
			io_out(io_com_data, 0b00000100UL);	//autoforward off
			break;
		case 31:
			io_out(io_com_data, 0b00000110UL);	//autoforward on
			break;
	}
	io_out(en, 0);
	if(a == 2)
	{
		delay(63);
	}
	else
	{
		delay(0);
	}
}

void chr(char a)
{
	io_out(en, 1);
	io_out(io_com_data, 0b10000000UL);
	io_out(io_com_data, a);
	io_out(en, 0);
	delay(0);
}

void str(char a[20])
{
	int chr_num;
	for(chr_num = 0; a[chr_num] != '~'; chr_num = chr_num + 1)
	{
		chr(a[chr_num]);
	}
}

void move(int a, int b)
{
	if(a == 1)
	{
		writecmd(127 + b);
	}
	else if(a == 2)
	{
		writecmd(128 + 63 + b);
	}
	else if(a == 3)
	{
		writecmd(128 + 19 + b);
	}
	else if(a == 4)
	{
		writecmd(128 + 83 + b);
	}
}

void name(int a)
{
	switch(a)
	{
		case 1:
			strcpy(display, " Lighting~");
			str(display);
			break;
		case 11:
			strcpy(display, " Lamp 1~");
			str(display);
			break;
		case 12:
			strcpy(display, " Lamp 2~");
			str(display);
			break;
		case 13:
			strcpy(display, " Lamp 3~");
			str(display);
			break;
		case 2:
			strcpy(display, " Blind~");
			str(display);
			break;
		case 3:
			strcpy(display, " Air Condition~");
			str(display);
			break;
		case 4:
			strcpy(display, " Other~");
			str(display);
			break;
	}
}

void menu(int a)
{
	int b;
	switch(a)
	{
		case 1:
			command(0);
			for(b = 1; b <= 4; b = b + 1)
			{
				move(b, 1);
				name(b);
			}
			move(1, 1);
			chr(126);
			cur_pos = 1;
			break;
		case 21:
			command(0);
			for(b = 1; b <= no_lighting; b = b + 1)
			{
				move(b, 1);
				name(b + 10);
			}
			move(1, 1);
			chr(126);
			cur_pos = 1;
			break;
	}
}

void roll_cur(int a)
{
	switch(a)
	{
		case 1:
			if(cur_pos > 1)
			{
				if(cur_pos == 2)
				{
					move(2, 1);
					chr(' ');
					move(1, 1);
					chr(126);
				}
				else if(cur_pos == 3)
				{
					move(3, 1);
					chr(' ');
					move(2, 1);
					chr(126);
				}
				else if(cur_pos == 4)
				{
					move(4, 1);
					chr(' ');
					move(3, 1);
					chr(126);
				}
				item = item - 1;
				cur_pos = cur_pos - 1;
			}
			break;
		case 2:
			if(cur_pos < 4)
			{
				if(cur_pos == 1)
				{
					writecmd(128 + 0);
					chr(' ');
					writecmd(128 + 64);
					chr(126);
				}
				else if(cur_pos == 2)
				{
					writecmd(128 + 64);
					chr(' ');
					writecmd(128 + 20);
					chr(126);
				}
				else if(cur_pos == 3)
				{
					writecmd(128 + 20);
					chr(' ');
					writecmd(128 + 84);
					chr(126);
				}
				item = item + 1;
				cur_pos = cur_pos + 1;
			}
			break;
		case 21:
			if(cur_pos < 4 && cur_pos < no_lighting)
			{
				if(cur_pos == 1)
				{
					writecmd(128 + 0);
					chr(' ');
					writecmd(128 + 64);
					chr(126);
				}
				else if(cur_pos == 2)
				{
					writecmd(128 + 64);
					chr(' ');
					writecmd(128 + 20);
					chr(126);
				}
				else if(cur_pos == 3)
				{
					writecmd(128 + 20);
					chr(' ');
					writecmd(128 + 84);
					chr(126);
				}
				item = item + 1;
				cur_pos = cur_pos + 1;
			}
			break;
	}
}

when(nv_update_occurs(nvi_no_lighting))
{
	no_lighting = nvi_no_lighting;
	if(mnu_pos == 21)
	{
		menu(21);
	}
}

when(reset)
{
	delay(600);	//delay 15ms
	command(1);	//datainterface 1
	delay(160);	//delay 4.1ms
	command(1);	//datainterface 2
	delay(2);	//delay 100us
	command(1);	//datainterface 3
	delay(160);	//delay 4.1ms
	command(1);	//datainterface 4
	command(20);//displayoff
	command(0);	//clear
	command(21);//displayon
	menu(1);
}

when(io_changes(up)to 0)
{
	roll_cur(1);
}

when(io_changes(down)to 0)
{
	if(mnu_pos == 1)
	{
		roll_cur(2);
	}
	else if(mnu_pos == 21)
	{
		roll_cur(21);
	}
}

when(io_changes(enter)to 0)
{
	if(mnu_pos == 1 && item == 1)
	{
		menu(21);
		cur_pos = 1;
		mnu_pos = 21;
	}
}

when(io_changes(esc)to 0)
{
	if(mnu_pos == 21)
	{
		menu(1);
		cur_pos = 1;
		mnu_pos = 1;
		item = 1;
	}
}

    Source: geocities.com/hk/cloud_fan_school/Program/LCD/20031119

               ( geocities.com/hk/cloud_fan_school/Program/LCD)                   ( geocities.com/hk/cloud_fan_school/Program)                   ( geocities.com/hk/cloud_fan_school)                   ( geocities.com/hk)