#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;

int item = 1;
int cur_pos = 1;
char display[20];
char menu1[20], menu2[20], menu3[20], menu4[20], menu5[20], menu6[20];
char menu1_1[20], menu1_2[20], menu1_3[20], menu1_4[20], menu1_5[20];

void command(int cmd)
{
	io_out(en, 1);
	io_out(io_com_data, 0b00000000UL);
	switch(cmd)
	{
		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);
	delay(0);
}

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

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

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

void syb(int symbol)
{
	switch(symbol)
	{
		case 0:
			writechr(0b01111110UL);		//symbol ->
			break;
		case 1:
			writechr(0b00111111UL);		//symbol ?
			break;
		case 2:
			writechr(0b00100001UL);		//symbol !
			break;
	}
}

void cur_posit(int position)
{
	switch(position)
	{
		case 0:
			writecmd(0b11000110UL);	//cursor go to central of line 2
			break;
		case 1:
			writecmd(0b10010101UL);	//cursor go to central of line 3
			break;
		case 10:
			writecmd(0b10000000UL);	//cursor go to first bit of line 1
			break;
		case 11:
			writecmd(0b10000001UL);	//cursor go to second bit of line 1
			break;
		case 20:
			writecmd(0b11000000UL);	//cursor go to first bit of line 2
			break;
		case 21:
			writecmd(0b11000001UL);	//cursor go to second bit of line 2
			break;
		case 30:
			writecmd(0b10010100UL);	//cursor go to first bit of line 3
			break;
		case 31:
			writecmd(0b10010101UL);	//cursor go to second bit of line 3
			break;
		case 40:
			writecmd(0b11010100UL);	//cursor go to first bit of line 4
			break;
		case 41:
			writecmd(0b11010101UL);	//cursor go to second bit of line 4
			break;
	}
}

void menu_display(int a)
{
	if(a == 0)
	{
		item = 6;
		strcpy(menu1, "Lighting~");
		strcpy(menu2, "Air Condition~");
		strcpy(menu3, "Menu 3~");
		strcpy(menu4, "Menu 4~");
		strcpy(menu5, "Menu 5~");
		strcpy(menu6, "Menu 6~");
		strcpy(menu1_1, "Lamp 1~");
		strcpy(menu1_2, "Lamp 2~");
		strcpy(menu1_3, "Lamp 3~");
		strcpy(menu1_4, "Lamp 4~");
	}
	else if(a == 1)
	{
		cur_posit(11);
		strcpy(display, menu1);
		writestr(display);
		cur_posit(21);
		strcpy(display, menu2);
		writestr(display);
		cur_posit(31);
		strcpy(display, menu3);
		writestr(display);
		cur_posit(41);
		strcpy(display, menu4);
		writestr(display);
	}
	else if(a == 2)
	{
		cur_posit(11);
		strcpy(display, menu2);
		writestr(display);
		cur_posit(21);
		strcpy(display, menu3);
		writestr(display);
		cur_posit(31);
		strcpy(display, menu4);
		writestr(display);
		cur_posit(41);
		strcpy(display, menu5);
		writestr(display);
	}
	else if(a == 3)
	{
		cur_posit(11);
		strcpy(display, menu3);
		writestr(display);
		cur_posit(21);
		strcpy(display, menu4);
		writestr(display);
		cur_posit(31);
		strcpy(display, menu5);
		writestr(display);
		cur_posit(41);
		strcpy(display, menu6);
		writestr(display);
	}
	else if(a == 11)
	{
		cur_posit(10);
		writestr(menu1);
		cur_posit(21);
		strcpy(display, menu1_1);
		writestr(display);
		cur_posit(31);
		strcpy(display, menu1_2);
		writestr(display);
		cur_posit(41);
		strcpy(display, menu1_3);
		writestr(display);	
	}
	else if(a == 12)
	{
		cur_posit(10);
		writestr(menu1);
		cur_posit(21);
		strcpy(display, menu1_2);
		writestr(display);
		cur_posit(31);
		strcpy(display, menu1_3);
		writestr(display);
		cur_posit(41);
		strcpy(display, menu1_4);
		writestr(display);	
	}
}

void roll(int a, int b)
{
	switch(a)
	{
		case 1:
			if(b == 6)
			{
				cur_posit(40);	//point to bit 1 at line 4
				writechr(' ');
				cur_posit(30);	//point to bit 1 at line 3
				syb(0);			//display cursor
			}
			else if(b == 5)
			{
				cur_posit(30);	//point to bit 1 at line 3
				writechr(' ');
				cur_posit(20);	//point to bit 1 at line 2
				syb(0);			//display cursor
			}
			else if(b == 4)
			{
				cur_posit(20);	//point to bit 1 at line 2
				writechr(' ');
				cur_posit(10);	//point to bit 1 at line 1
				syb(0);			//display cursor
			}
			else if(b == 3)
			{
				menu_display(2);
				cur_posit(10);
				syb(0);		//display cursor
			}
			else if(b == 2)
			{
				command(0);
				menu_display(1);
				cur_posit(10);
				syb(0);		//display cursor
			}
			break;
		case 2:
			if(b == 1)
			{
				cur_posit(10);	//point to bit 1 at line 1
				writechr(' ');
				cur_posit(20);	//point to bit 1 at line 2
				syb(0);			//display cursor
			}
			else if(b == 2)
			{
				cur_posit(20);	//point to bit 1 at line 2
				writechr(' ');
				cur_posit(30);	//point to bit 1 at line 3
				syb(0);			//display cursor
			}
			else if(b == 3)
			{
				cur_posit(30);	//point to bit 1 at line 3
				writechr(' ');
				cur_posit(40);	//point to bit 1 at line 4
				syb(0);			//display cursor
			}
			else if(b == 4)
			{
				command(0);
				menu_display(2);
				cur_posit(40);
				syb(0);		//display cursor
			}
			else if(b == 5)
			{
				command(0);
				menu_display(3);
				cur_posit(40);
				syb(0);		//display cursor
			}
			break;
	}
}

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
	delay(63);			//delay 1650us
	command(21);		//displayon
	command(31);		//autoforward
	cur_posit(0);		//cursor go to central of line 2
	strcpy(display, "71301-3D~");
	writestr(display);	//display 71301-3D
	cur_posit(1);		//cursor go to central of line 3
	strcpy(display, "Final Year Project~");
	writestr(display);	//display Final Year Project
	delay(33333);
	command(0);			//clear
	menu_display(0);	//inital menu page
	menu_display(1);	//menu
	cur_posit(10);		//cursor to bit 1 at line 1
	syb(0);				//select cursor
}

when(io_changes(up)to 0)
{
	if(cur_pos > 1)
	{
		roll(1, cur_pos);
		cur_pos = cur_pos - 1;
	}
}

when(io_changes(down)to 0)
{
	if(cur_pos < 6)
	{
		roll(2, cur_pos);
		cur_pos = cur_pos + 1;
	}
}

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

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