找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2268|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

msp430 三級菜單程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:109048 發(fā)表于 2016-3-15 17:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
uchar welcome_tab1[] = {"系統(tǒng)初始化中"};
uchar welcome_tab2[] = {"請稍等..."};
uchar tab3[] = {"處理中..."};

struct menu{
  unsigned char menucount;   //當(dāng)前層節(jié)點(diǎn)數(shù)
  unsigned char *str; //菜單標(biāo)題
  unsigned char pos;
  unsigned char length;
  void (*subs)();     //節(jié)點(diǎn)函數(shù)
  struct menu *childrenmenu; //子節(jié)點(diǎn)
  struct menu *parentmenu;   //父節(jié)點(diǎn)
};

struct menu1{
  unsigned char *str1;
  unsigned char pos1;
  unsigned char length1;
};

//************************************空函數(shù)************************************
//函數(shù)名稱:    nullsubs
//函數(shù)說明:    無
//入口參數(shù):    無
//出口參數(shù):    無
//******************************************************************************
void nullsubs(void)
{
}
//******************************************************************************


//***********************************待處理函數(shù)*********************************
//函數(shù)名稱:    aa
//函數(shù)說明:    實(shí)際中要替換為具體函數(shù)原型,這里只是舉例說明
//入口參數(shù):    無
//出口參數(shù):    無
//******************************************************************************
void aa(void)
{
  clrram();
  wch_disp(tab3,0x91,5);
  long_delay(10000);
}
//******************************************************************************

//******************************菜單顯示內(nèi)容************************************
//說明:    結(jié)構(gòu)體中放的是菜單的顯示內(nèi)容等參數(shù),完成菜單功能變換,菜單返回
//          菜單指針函數(shù)、可以指向下一級菜單,也可以指向某一項(xiàng)選項(xiàng)的功能
//          實(shí)際中可以根據(jù)具體內(nèi)容變換。是程序的關(guān)鍵之一。
//******************************************************************************
struct menu1 menu2[5][4] = {
  {
  {"系┃",0x80,2},
  {"統(tǒng)┃",0x90,2},
  {"設(shè)┃",0x88,2},
  {"置┃",0x98,2}
  },

  {
  {"時(shí)┃",0x80,2},
  {"間┃",0x90,2},
  {"設(shè)┃",0x88,2},
  {"置┃",0x98,2}
  },

  {
  {"日┃",0x80,2},
  {"期┃",0x90,2},
  {"設(shè)┃",0x88,2},
  {"置┃",0x98,2}
  },

  {
  {"背┃",0x80,2},
  {"光┃",0x90,2},
  {"設(shè)┃",0x88,2},
  {"置┃",0x98,2}
  },

  {
  {"其┃",0x80,2},
  {"它┃",0x90,2},
  {"設(shè)┃",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.時(shí)間設(shè)置",0x82,5,nullsubs,time_menu,Null},
  {5,"2.日期設(shè)置",0x92,5,nullsubs,date_menu,Null},
  {5,"3.背光設(shè)置",0x8a,5,nullsubs,backlight_menu,Null},
  {5,"4.其它設(shè)置",0x9a,5,nullsubs,other_menu,Null},
  {5,"5.返回",0x82,3,nullsubs,main_menu,main_menu}
};

struct menu time_menu[4] = {
  {4,"1.時(shí)區(qū)設(shè)置",0x82,5,aa,Null,main_menu},
  {4,"2.小時(shí)設(shè)置",0x92,5,aa,Null,main_menu},
  {4,"3.分鐘設(shè)置",0x8a,5,aa,Null,main_menu},
  {4,"4.返回",0x9a,3,nullsubs,main_menu,main_menu}
};

struct menu date_menu[5] = {
  {5,"1.年份設(shè)置",0x82,5,aa,Null,main_menu},
  {5,"2.月份設(shè)置",0x92,5,aa,Null,main_menu},
  {5,"3.日期設(shè)置",0x8a,5,aa,Null,main_menu},
  {5,"4.星期設(shè)置",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.通信設(shè)置",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;  //結(jié)構(gòu)體指針,指向結(jié)構(gòu)體后由內(nèi)部函數(shù)指針指向功能函數(shù)
unsigned char displaystart = 0; //顯示時(shí)的第一個(gè)菜單項(xiàng)
unsigned char userchoose = 0;   //用戶所選菜單項(xiàng)
unsigned char displaypoint = 0; //顯示指針
unsigned char maxitems;         //同級最大菜單數(shù)
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)
}

//************************************菜單顯示**********************************
//函數(shù)名稱:    void menu_disp(uchar n)
//函數(shù)說明:    顯示主菜單
//入口參數(shù):    uint n,要顯示的菜單級數(shù)號碼
//出口參數(shù):    無
//******************************************************************************
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);
}
//******************************************************************************

//************************************鍵盤處理**********************************
//函數(shù)名稱:    key_process
//函數(shù)說明:    鍵盤處理
//入口參數(shù):    無
//出口參數(shù):    無
//******************************************************************************
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);
}

//***********************************中斷處理函數(shù)*******************************
//函數(shù)名稱:    p1
//函數(shù)說明:    完成鍵盤鍵值處理,菜單變換,屏幕刷新等功能,是程序的關(guān)鍵之一
//入口參數(shù):    無
//出口參數(shù):    無
//******************************************************************************
#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();
  }
}

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表