欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: msp430 三級菜單程序 [打印本頁]

作者: luokui111    時間: 2016-3-15 17:16
標題: msp430 三級菜單程序
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();
  }
}






歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1