#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 cur_pos = 1;
char display[20];
char menu1_1[20], menu1_2[20], menu1_3[20], menu1_4[20], menu1_5[20];

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 dis_chr)
{
	io_out(en, 1);
	io_out(io_com_data, 0b10000000UL);
	io_out(io_com_data, dis_chr);
	io_out(en, 0);
	delay(0);
}

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

void cur_posit(int x)
{
	switch(x)
	{
		case 1:
			writecmd(0b10000000UL);
			break;
		case 2:
			writecmd(0b11000000UL);
			break;
		case 3:
			writecmd(0b10010100UL);
			break;
		case 4:
			writecmd(0b11010100UL);
			break;
	}
}

void menu1_display(int a)
{
	if(a == 1)
	{
		cur_posit(1);
		strcpy(display, menu1_1);
		writestr(display);
		cur_posit(2);
		strcpy(display, menu1_2);
		writestr(display);
		cur_posit(3);
		strcpy(display, menu1_3);
		writestr(display);
		cur_posit(4);
		strcpy(display, menu1_4);
		writestr(display);
	}
	else if(a == 2)
	{
		cur_posit(1);
		strcpy(display, menu1_2);
		writestr(display);
		cur_posit(2);
		strcpy(display, menu1_3);
		writestr(display);
		cur_posit(3);
		strcpy(display, menu1_4);
		writestr(display);
		cur_posit(4);
		strcpy(display, menu1_5);
		writestr(display);
	}
}

when(reset)
{
	strcpy(menu1_1, " Lighting~");
	strcpy(menu1_2, " Air Condition~");
	strcpy(menu1_3, " Menu 3~");
	strcpy(menu1_4, " Menu 4~");
	strcpy(menu1_5, " Menu 5~");
	delay(600);				//delay 15ms
	writecmd(0b00111000UL);	//datainterface 1
	delay(160);				//delay 4.1ms
	writecmd(0b00111000UL);	//datainterface 2
	delay(2);				//delay 100us
	writecmd(0b00111000UL);	//datainterface 3
	delay(160);				//delay 4.1ms
	writecmd(0b00111000UL);	//datainterface 4
	writecmd(0b00001000UL);	//displayoff
	writecmd(0b00000001UL);	//clear
	delay(63);				//delay 1650us
	writecmd(0b00001100UL);	//displayon
	writecmd(0b00000110UL);	//autoforward
	writecmd(0b11000110UL);	//cursor go to central of line 2
	strcpy(display, "71301-3D~");
	writestr(display);		//display 71301-3D
	writecmd(0b10010101UL);	//cursor go to central of line 3
	strcpy(display, "Final Year Project~");
	writestr(display);		//display Final Year Project
	delay(33333);
	writecmd(0b00000001UL);	//clear
	//Menu page
	menu1_display(1);		//display menu
	cur_posit(1);			//cursor to bit 1 at line 1
	writechr(0b01111110UL);	//display cursor
}

when(io_changes(up)to 0)
{
	if(cur_pos == 4)
	{
		cur_pos = cur_pos - 1;
		writecmd(0b11010100UL);	//point to bit 1 at line 4
		writechr(' ');
		writecmd(0b10010100UL);	//point to bit 1 at line 3
		writechr(0b01111110UL);	//display cursor
	}
	else if(cur_pos == 3)
	{
		cur_pos = cur_pos - 1;
		writecmd(0b10010100UL);	//point to bit 1 at line 3
		writechr(' ');
		writecmd(0b11000000UL);	//point to bit 1 at line 2
		writechr(0b01111110UL);	//display cursor
	}
	else if(cur_pos == 2)
	{
		cur_pos = cur_pos - 1;
		writecmd(0b11000000UL);	//point to bit 1 at line 2
		writechr(' ');
		writecmd(0b10000000UL);	//point to bit 1 at line 1
		writechr(0b01111110UL);	//display cursor
	}
	else if(cur_pos == 1)
	{
		writecmd(0b00000001UL);
		menu1_display(1);
		cur_posit(1);
		writechr(0b01111110UL);	//display cursor
	}
}

when(io_changes(down)to 0)
{
	if(cur_pos == 1)
	{
		cur_pos = cur_pos + 1;
		writecmd(0b10000000UL);	//point to bit 1 at line 1
		writechr(' ');
		writecmd(0b11000000UL);	//point to bit 1 at line 2
		writechr(0b01111110UL);	//display cursor
	}
	else if(cur_pos == 2)
	{
		cur_pos = cur_pos + 1;
		writecmd(0b11000000UL);	//point to bit 1 at line 2
		writechr(' ');
		writecmd(0b10010100UL);	//point to bit 1 at line 3
		writechr(0b01111110UL);	//display cursor
	}
	else if(cur_pos == 3)
	{
		cur_pos = cur_pos + 1;
		writecmd(0b10010100UL);	//point to bit 1 at line 3
		writechr(' ');
		writecmd(0b11010100UL);	//point to bit 1 at line 4
		writechr(0b01111110UL);	//display cursor
	}
	else if(cur_pos == 4)
	{
		writecmd(0b00000001UL);
		menu1_display(2);
		cur_posit(4);
		writechr(0b01111110UL);	//display cursor
	}
}

    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)