找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1836|回复: 0
打印 上一主题 下一主题
收起左侧

msp430 三级菜单程序

[复制链接]
跳转到指定楼层
楼主
ID:109048 发表于 2016-3-15 17:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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();
  }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表