uchar welcome_tab1[] = {"系統初始化中"};
uchar welcome_tab2[] = {"請稍等..."};
uchar tab3[] = {"處理中..."};
struct menu{
unsigned char menucount; //當前層節點數
unsigned char *str; //菜單標題
unsigned char pos;
unsigned char length;
void (*subs)(); //節點函數
struct menu *childrenmenu; //子節點
struct menu *parentmenu; //父節點
};
struct menu1{
unsigned char *str1;
unsigned char pos1;
unsigned char length1;
};
//************************************空函數************************************
//函數名稱: nullsubs
//函數說明: 無
//入口參數: 無
//出口參數: 無
//******************************************************************************
void nullsubs(void)
{
}
//******************************************************************************
//***********************************待處理函數*********************************
//函數名稱: aa
//函數說明: 實際中要替換為具體函數原型,這里只是舉例說明
//入口參數: 無
//出口參數: 無
//******************************************************************************
void aa(void)
{
clrram();
wch_disp(tab3,0x91,5);
long_delay(10000);
}
//******************************************************************************
//******************************菜單顯示內容************************************
//說明: 結構體中放的是菜單的顯示內容等參數,完成菜單功能變換,菜單返回
// 菜單指針函數、可以指向下一級菜單,也可以指向某一項選項的功能
// 實際中可以根據具體內容變換。是程序的關鍵之一。
//******************************************************************************
struct menu1 menu2[5][4] = {
{
{"系┃",0x80,2},
{"統┃",0x90,2},
{"設┃",0x88,2},
{"置┃",0x98,2}
},
{
{"時┃",0x80,2},
{"間┃",0x90,2},
{"設┃",0x88,2},
{"置┃",0x98,2}
},
{
{"日┃",0x80,2},
{"期┃",0x90,2},
{"設┃",0x88,2},
{"置┃",0x98,2}
},
{
{"背┃",0x80,2},
{"光┃",0x90,2},
{"設┃",0x88,2},
{"置┃",0x98,2}
},
{
{"其┃",0x80,2},
{"它┃",0x90,2},
{"設┃",0x88,2},
{"置┃",0x98,2}
}
};
struct menu main_menu[5];
struct menu time_menu[4];
struct menu date_menu[5];
struct menu backlight_menu[3];
struct menu other_menu[3];
struct menu main_menu[5] = {
{5,"1.時間設置",0x82,5,nullsubs,time_menu,Null},
{5,"2.日期設置",0x92,5,nullsubs,date_menu,Null},
{5,"3.背光設置",0x8a,5,nullsubs,backlight_menu,Null},
{5,"4.其它設置",0x9a,5,nullsubs,other_menu,Null},
{5,"5.返回",0x82,3,nullsubs,main_menu,main_menu}
};
struct menu time_menu[4] = {
{4,"1.時區設置",0x82,5,aa,Null,main_menu},
{4,"2.小時設置",0x92,5,aa,Null,main_menu},
{4,"3.分鐘設置",0x8a,5,aa,Null,main_menu},
{4,"4.返回",0x9a,3,nullsubs,main_menu,main_menu}
};
struct menu date_menu[5] = {
{5,"1.年份設置",0x82,5,aa,Null,main_menu},
{5,"2.月份設置",0x92,5,aa,Null,main_menu},
{5,"3.日期設置",0x8a,5,aa,Null,main_menu},
{5,"4.星期設置",0x9a,5,aa,Null,main_menu},
{5,"5.返回",0x82,3,nullsubs,main_menu,main_menu}
};
struct menu backlight_menu[3] = {
{3,"1.背光變亮",0x82,5,aa,Null,main_menu},
{3,"2.背光變暗",0x92,5,aa,Null,main_menu},
{3,"3.返回",0x8a,3,nullsubs,main_menu,main_menu}
};
struct menu other_menu[3] = {
{3,"1.通信設置",0x82,5,aa,Null,main_menu},
{3,"2.PC通信",0x92,4,aa,Null,main_menu},
{3,"3.返回",0x8a,3,nullsubs,main_menu,main_menu}
};
//******************************************************************************
//************************************全局變量**********************************
struct menu (*menupoint) = main_menu; //結構體指針,指向結構體后由內部函數指針指向功能函數
unsigned char displaystart = 0; //顯示時的第一個菜單項
unsigned char userchoose = 0; //用戶所選菜單項
unsigned char displaypoint = 0; //顯示指針
unsigned char maxitems; //同級最大菜單數
unsigned char key;
//******************************************************************************
void init_clk(void)
{
uchar i;
BCSCTL1 &= ~XT2OFF; // XT2 = HF XTAL
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG) != 0); // OSCFault flag still set?
BCSCTL2 |= SELM1; // MCLK = XT2 (safe)
}
//************************************菜單顯示**********************************
//函數名稱: void menu_disp(uchar n)
//函數說明: 顯示主菜單
//入口參數: uint n,要顯示的菜單級數號碼
//出口參數: 無
//******************************************************************************
void menu_disp(void)
{
uchar i;
clrram();
maxitems = menupoint[0].menucount;
if(userchoose < 4 && maxitems < 5)
{
for(i = 0 ;i < maxitems;i++)
{
wch_disp(menupoint[i].str,menupoint[i].pos,menupoint[i].length);
}
}
else if(userchoose < 4 && maxitems >= 5)
{
for(i = 0;i < 4;i++)
{
wch_disp(menupoint[i].str,menupoint[i].pos,menupoint[i].length);
}
}
else if(userchoose >= 4)
{
clrram();
clrram();
for(i = 0; i < maxitems - 4;i ++)
{
wch_disp(menupoint[i + 4].str,menupoint[i + 4].pos,menupoint[i + 4].length);
}
}
if(menupoint == main_menu)
{
for(i = 0; i < 4;i ++)
{
wch_disp(menu2[0][i].str1,menu2[0][i].pos1,menu2[0][i].length1);
}
}
else if(menupoint == time_menu)
{
for(i = 0; i < 4;i ++)
{
wch_disp(menu2[1][i].str1,menu2[1][i].pos1,menu2[1][i].length1);
}
}
else if(menupoint == date_menu)
{
for(i = 0; i < 4;i ++)
{
wch_disp(menu2[2][i].str1,menu2[2][i].pos1,menu2[2][i].length1);
}
}
else if(menupoint == backlight_menu)
{
for(i = 0; i < 4;i ++)
{
wch_disp(menu2[3][i].str1,menu2[3][i].pos1,menu2[3][i].length1);
}
}
else if(menupoint == other_menu)
{
for(i = 0; i < 4;i ++)
{
wch_disp(menu2[4][i].str1,menu2[4][i].pos1,menu2[4][i].length1);
}
}
con_wch_disp(menupoint[userchoose].pos,menupoint[userchoose].length);
}
//******************************************************************************
//************************************鍵盤處理**********************************
//函數名稱: key_process
//函數說明: 鍵盤處理
//入口參數: 無
//出口參數: 無
//******************************************************************************
void key_process(void)
{
switch(P1IN & 0x0f)
{
case 0x01 :
key = DOWN;
break;
case 0x02 :
key = UP;
break;
case 0x04 :
key = ENTER;
break;
case 0x08 :
key = ESC;
break;
default :
break;
}
while(P1IN & 0x0f);
P1IFG &= 0x00;
}
//******************************************************************************
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1IE = 0X0f;
_EINT();
init_clk();
init_lcdport();
init_lcd();
img_disp(tab32);
long_delay(20000);
clrram();
wch_disp(welcome_tab1,0x91,6);
wch_disp(welcome_tab2,0x8a,5);
long_delay(20000);
clrram();
menu_disp();
while(1);
}
//***********************************中斷處理函數*******************************
//函數名稱: p1
//函數說明: 完成鍵盤鍵值處理,菜單變換,屏幕刷新等功能,是程序的關鍵之一
//入口參數: 無
//出口參數: 無
//******************************************************************************
#pragma vector = PORT1_VECTOR
__interrupt void p1(void)
{
key_process();
if(key)
{
switch(key)
{
case DOWN :
userchoose++;
if(userchoose == maxitems)
{
userchoose = 0;
}
break;
case UP :
userchoose--;
if(userchoose == 255)
{
userchoose = maxitems - 1;
}
break;
case ENTER :
if(menupoint[userchoose].subs != nullsubs)
{
(*menupoint[userchoose].subs)();
}
else if(menupoint[userchoose].childrenmenu != Null)
{
menupoint = menupoint[userchoose].childrenmenu;
userchoose = 0;
displaystart = 0;
}
break;
case ESC :
if(menupoint[userchoose].parentmenu != Null)
{
menupoint = menupoint[userchoose].parentmenu;
userchoose = 0;
displaystart = 0;
}
break;
}
menu_disp();
}
}
|