这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 急急急 关于单片机的菜单,然后是结构体的使用问题

共9条 1/1 1 跳转至

急急急 关于单片机的菜单,然后是结构体的使用问题

助工
2014-08-19 15:38:35     打赏

在网上找了一个例子,


这是对结构体的定义部分

#define MENU_SIZE 25             //菜单长度

volatile unsigned char KeyFuncIndex=0;    //存放当前的菜单索引

void (*KeyFuncPtr)();            //定义按键功能指针
//定义类型
typedef struct
{
   unsigned char KeyStateIndex;   //当前的状态索引号
   unsigned char KeyUpState;    //按下向左键时的状态索引号
   unsigned char KeyDownState;   //按下向右键时的状态索引号
   unsigned char KeyLiftState;    //按下向左键时的状态索引号
   unsigned char KeyRightState;   //按下向右键时的状态索引号
   unsigned char KeyEscState;     //按下返回键时的状态索引号
   unsigned char KeyEnterState;   //按下确定键时的状态索引号
   void (*CurrentOperate)();      //当前状态应该执行的功能操作
}  StateTab;

 




根据按键操作执行相应的菜单操作,并控制按键计数  用于调节时间,KeyFuncIndex=20的时候调节时间      KeyFuncIndex=20的时候调节日期与星期, 并调用函数Timer_Convt

void MenuOperate(void)
{
    if(key_value==ENTER)
    {KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEnterState;}
    if(key_value==ESC)
    {KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEscState;}  
    if(key_value==LEFT)
    {
      KeyFuncIndex=KeyTab[KeyFuncIndex].KeyLiftState;
      if(KeyFuncIndex==20)
        ++hour;
      if(KeyFuncIndex==19)
        ++year;
    }
    if(key_value==RIGHT)
    {
      KeyFuncIndex=KeyTab[KeyFuncIndex].KeyRightState;
      if(KeyFuncIndex==20)
        ++second;
      if(KeyFuncIndex==19)
        ++day;
    }
    if(key_value==UP)
    {KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;}
    if(key_value==DOWN)
    {
      KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDownState;
      if(KeyFuncIndex==19)
        ++week;
    }
    if(key_value==SURE)
    {
      KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDownState;
      if(KeyFuncIndex==20)
        ++minute;
      if(KeyFuncIndex==19)
        ++month;
    }   
Timer_Convt();   
  //下面是执行按键的操作 
KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
       (*KeyFuncPtr)();     //执行当前的按键操作
}

 


这部分红色有些不太明白





关键词: 单片机     菜单     结构    

高工
2014-08-19 15:48:09     打赏
2楼
应该还有一个结构体数组吧,先由不同的按键更新菜单索引号,然后最后根据索引号去执行对应的功能函数。而每个索引号对应的函数都应该在数组里定义了的。

高工
2014-08-19 16:01:25     打赏
3楼

看代码应该还有个KeyTab的数组

通过按键的值更新索引号

最后的红色语句就是调用索引号对应的函数


助工
2014-08-19 16:05:12     打赏
4楼
StateTab  KeyTab[MENU_SIZE]=
{
    {0,0,0,0,0,0,1,   (*disp_page)},      //顶层
 {1,1,1,0,0,0,2,   (*disp_page0)},    //菜单
 {2,2,2,4,3,1,5,   (*disp_page1)},       //宝典
        {3,3,3,2,4,1,6,   (*disp_page2)},       //宝典
        {4,4,4,3,2,1,7,   (*disp_page3)},
        {5,5,8,5,5,2,5,   (*disp_page1_1)},
        {6,6,16,6,6,3,6,   (*disp_page2_1)},
        {7,7,12,7,7,4,7,   (*disp_page3_1)},
        {8,8,9,8,8,5,10,   (*disp_page1_2)},
        {9,8,9,9,9,5,11,   (*disp_page1_3)},
        {10,10,10,10,10,8,10,   (*disp_page1_2_1)},
        {11,11,11,11,11,9,11,   (*disp_page1_3_1)},
        {12,12,13,12,12,7,14,   (*disp_page3_2)},
        {13,12,13,13,13,7,15,   (*disp_page3_3)},
        {14,14,14,14,14,12,14,   (*disp_page3_2_1)},
        {15,15,15,15,15,13,15,   (*disp_page3_3_1)},
        {16,16,17,16,16,6,19,   (*disp_page2_2)},
        {17,16,18,17,17,6,20,   (*disp_page2_3)},
        {18,17,18,18,18,6,21,   (*disp_page2_4)},
        {19,19,19,19,19,16,16,   (*disp_page2_2_1)},
        {20,20,20,20,20,17,17,   (*disp_page2_3_1)},
        {21,21,21,21,21,18,21,   (*disp_page2_3_2)}
};

助工
2014-08-19 16:17:12     打赏
5楼

 if(key_value==UP)
    {KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;}
这句话是不是这个意思,

假如KeyFuncIndex是3,在结构数组里的是 {3,3,3,2,4,1,6,   (*disp_page2)},       //宝典

KeyTab[KeyFuncIndex].KeyUpState=6;然后再以6为索引值找对应的那个结构数组{6,6,16,6,6,3,6,   (*disp_page2_1)},,完了就执行相应的函数KeyFuncPtr=(*disp_page2_1)},即执行(*disp_page2_1)对应的函数


助工
2014-08-19 16:19:53     打赏
6楼
看楼上,我理解对了吗

院士
2014-08-19 18:49:59     打赏
7楼

楼主 真对不起啊~~

我帮您编辑了一下代码,结果红色部分木有了……


助工
2014-08-20 08:47:14     打赏
8楼
额好吧,我还以为有人回贴讨论关于结构体在单片机菜单中的应用呢,版主

助工
2014-08-20 16:01:44     打赏
9楼

可能是我问的有问题,我应该这么问,是根据什么定义的这个结构体呢,为什么这么定义啊


共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]