你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 823|回复: 3

[STM32L476] 【转】NUCLEO-L476RG之list菜单+红外控制

[复制链接]

91

主题

4603

回帖

4

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2017-5-26 09:54:49 | 显示全部楼层 |阅读模式
这是我之前申请到NUCLEO-L476RG开发板时做的一个小项目。用红外遥控可以使液晶显示多个画面,字库自己做的,可以用红外修改参数的数值并保存,有些比较重要的画面还有要求输入密码,只有密码正确才能进入,废话不多说了,看图吧。
       添加一些代码,我觉得注释还是蛮多的,详情见附件源码。
//-------------------------------------
//
// 具体菜单选项定义,定义一个结构数组
// 存储在编码区,节省内存RAM
//
//-------------------------------------
struct Option  sOption[OPTIONMETE] = {
  {0,4,13, "基本设置        ",4},    //0
  {0,18,13,"反馈设置        ",4},    //1
  {0,46,13,"高级设置        ",4},    //2
  {0,73,13,"故障诊断        ",4},    //3
  {1,OPTIONMETE-1,0,"                ",0},  //4
  {1,OPTIONMETE-1,0,"  请输入基本密码",0},  //5
  {1,OPTIONMETE-1,0,"                ",0},  //6
  {1,OPTIONMETE-1,0,"                ",0},  //7
  {2,OPTIONMETE-1,0,"关位确认        ",4},  //8
  {2,OPTIONMETE-1,0,"开位确认        ",4},  //9
  {2,OPTIONMETE-1,0,"调节死区        ",4},  //10
  {2,OPTIONMETE-1,0,"丢信动作        ",4},  //11
  {2,OPTIONMETE-1,0,"关过矩值        ",4},  //12
  {2,OPTIONMETE-1,0,"开过矩值        ",4},  //13
  {2,OPTIONMETE-1,0,"显示方向        ",4},  //14
  {2,OPTIONMETE-1,0,"现场控制        ",4},  //15
  {2,OPTIONMETE-1,0,"更改基本密码    ",6},  //16
  {2,OPTIONMETE-1,0,"恢复出厂值      ",5},  //17  
  {3,OPTIONMETE-1,1,"                ",0},  //18
  {3,OPTIONMETE-1,1,"  请输入反馈密码",0},  //19
  {3,OPTIONMETE-1,1,"                ",0},  //20
  {3,OPTIONMETE-1,1,"                ",0},  //21
  {4,OPTIONMETE-1,1,"低端微调        ",4},  //22
  {4,OPTIONMETE-1,1,"高端微调        ",4},  //23
  {4,27,1,"触点输出        ",4},    //24  
  {4,27,1,"扩展触点        ",4},    //25
  {4,OPTIONMETE-1,1,"更改反馈密码    ",6},  //26  
  {5,OPTIONMETE-1,24,"关到位          ",3},     //27
  {5,OPTIONMETE-1,24,"开到位          ",3},     //28
  {5,OPTIONMETE-1,24,"关过矩          ",3},     //29
  {5,OPTIONMETE-1,24,"开过矩          ",3},     //30
  {5,OPTIONMETE-1,24,"过  矩          ",3},     //31
  {5,OPTIONMETE-1,24,"正在关          ",3},     //32
  {5,OPTIONMETE-1,24,"正在开          ",3},     //33
  {5,OPTIONMETE-1,24,"正在运行        ",4},     //34
  {5,39,24,"中间位置        ",4},   //35
  {5,OPTIONMETE-1,24,"远方位置        ",4},     //36
  {5,OPTIONMETE-1,24,"现场位置        ",4},     //37
  {6,OPTIONMETE-1,35,"  运行到达位置  ",0},     //38
  {6,OPTIONMETE-1,35,"                ",0},     //39  
  {6,OPTIONMETE-1,35,"                ",0},     //40
  {6,OPTIONMETE-1,35,"                ",0},     //41  
  {7,OPTIONMETE-1,24,"    故障报警    ",0},     //42
  {7,OPTIONMETE-1,24,"过矩报警        ",4},     //43  
  {7,OPTIONMETE-1,24,"远方报警        ",4},     //44  
  {7,OPTIONMETE-1,24,"                ",0},     //45     
  {8,OPTIONMETE-1,2,"                ",0},  //46
  {8,OPTIONMETE-1,2,"  请输入高级密码",0},  //47
  {8,OPTIONMETE-1,2,"                ",0},  //48
  {8,OPTIONMETE-1,2,"                ",0},  //49  
  {9,OPTIONMETE-1,2,"ESD 设置        ",4},  //50
  {9,OPTIONMETE-1,2,"关闭方式        ",4},  //51
  {9,OPTIONMETE-1,2,"关闭方向        ",4},  //52
  {9,OPTIONMETE-1,2,"正反作用        ",4},  //53
  {9,OPTIONMETE-1,2,"转矩显示        ",4},  //54
  {9,OPTIONMETE-1,2,"反馈低端        ",4},  //55
  {9,OPTIONMETE-1,2,"两线控制        ",4},  //56
  {9,OPTIONMETE-1,2,"标定低信        ",4},  //57
  {9,OPTIONMETE-1,2,"标定高信        ",4},  //58
  {9,OPTIONMETE-1,2,"刹车制动        ",4},  //59  
  {9,OPTIONMETE-1,2,"停动时间        ",4},  //60
  {9,OPTIONMETE-1,2,"间断运行        ",4},  //61
  {9,OPTIONMETE-1,2,"更改高级密码    ",6},  //62  
  {9,OPTIONMETE-1,2,"基本密码查询    ",6},  //63
  {9,OPTIONMETE-1,2,"反馈密码查询    ",6},  //64
  {9,66,2,"保存出厂值      ",5},  //65  
  {10,OPTIONMETE-1,65,"                ",0},  //66
  {10,OPTIONMETE-1,65,"请输入出厂密码  ",0},  //67   
  {10,OPTIONMETE-1,65,"                ",0},  //68
  {10,OPTIONMETE-1,65,"                ",0},  //69  
  {11,OPTIONMETE-1,65,"保存出厂设置    ",6},  //70   
  {11,OPTIONMETE-1,65,"电源选项        ",4},  //71
  {11,OPTIONMETE-1,65,"远方保持        ",4},  //72  
  {12,OPTIONMETE-1,3,"方式钮位置      ",5},  //73
  {12,OPTIONMETE-1,3,"操作钮位置      ",5},  //74
  {12,OPTIONMETE-1,3,"远方打开信号    ",6},  //75
  {12,OPTIONMETE-1,3,"远方关闭信号    ",6},  //76
  {12,OPTIONMETE-1,3,"远方保持信号    ",6},  //77
  {12,OPTIONMETE-1,3,"远方自动信号    ",6},  //78  
  {12,OPTIONMETE-1,3,"远方ESD 信号    ",6},  //79
  {12,OPTIONMETE-1,3,"控制电流        ",4},  //80
  {13,OPTIONMETE-1,61,"开向始位        ",4}, //81
  {13,OPTIONMETE-1,61,"开向终位        ",4}, //82
  {13,OPTIONMETE-1,61,"开向动程        ",4}, //83
  {13,OPTIONMETE-1,61,"开向停时        ",4}, //84
  {13,OPTIONMETE-1,61,"关向始位        ",4}, //85
  {13,OPTIONMETE-1,61,"关向终位        ",4}, //86
  {13,OPTIONMETE-1,61,"关向动程        ",4}, //87
  {13,OPTIONMETE-1,61,"关向停时        ",4}, //88
  {14,OPTIONMETE-1,50,"ESD 动位        ",4}, //89  
  {14,OPTIONMETE-1,50,"ESD 有效电平    ",6}, //90   
  {14,OPTIONMETE-1,50,"ESD 超越过热    ",6}, //91
  {14,OPTIONMETE-1,50,"ESD 超越停止    ",6}, //92  
  {14,OPTIONMETE-1,50,"ESD 超越间断    ",6}, //93
  {14,OPTIONMETE-1,50,"ESD 超越过矩    ",6}, //94  
  {15,OPTIONMETE-1,56,"    两线设置    ",0}, //95  
  {15,OPTIONMETE-1,56,"有信开,无信关  ",7}, //96
  {15,OPTIONMETE-1,56,"有信关,无信开  ",7}, //97  
  {MENULEVEL-1,OPTIONMETE-1,0,"",0}        //98
};

//----------------------------------------
//
//  菜单上移一项函数
// 函数原形:void MenuUpOneOption (void);
// 没有参数,没有返回值
// 调用方式:void MenuUpOneOption (void);
//
//----------------------------------------
void MenuUpOneOption (void)
{
  if(MenuLevelStart())          //如果当前为表单第一项
  {
    if(Level[sOption[SelectIndex].KeyLevel][2]>=4)  //并且表单中选项数目大于等于4个
    {
      FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][1]-3; //第一行显示索引号为倒数第四项
      SelectIndex = Level[sOption[SelectIndex].KeyLevel][1];         //选择索引为表单最后一项
      SelectLine = 4;             //标记选择行为第四行
      DIS12864M();               //刷新屏幕显示
    }
    else            //如果选项数目并不大于四个
    {
      SelectIndex = Level[sOption[SelectIndex].KeyLevel][1];   //选择索引为当前表单最后一个
      SelectLine = Level[sOption[SelectIndex].KeyLevel][2];    //显示行表单数目(最后一个)
      DIS12864M();             //刷新屏幕显示
    }
  }
  else              //如果当前不是开始索引
  {
    if(SelectLine==1)           //并且已经在屏幕最上边一行
    {
      FirstLineDisIndex--;      //显示索引上移
      SelectIndex--;            //选择索引自减
      SelectLine = 1;           //选择行还是第一行
      DIS12864M ();             //刷新屏幕
    }
    else       //如果不是第一行
    {
      SelectLine--;             //选择行自减
      SelectIndex--;            //选择索引自减
      DIS12864M ();             //刷新屏幕显示
    }
  }
}
//----------------------------------------
//
//  菜单下移一项函数
// 函数原形:void MenuDownOneOption (void);
// 没有参数,没有返回值
// 调用方式:void MenuDownOneOption (void);
//
//----------------------------------------
void MenuDownOneOption (void)
{
  if(MenuLevelEnd())            //如果当前是表单最后一个索引
  {
    FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][0]; //第一行显示索引为表单第一个选项
    SelectIndex = Level[sOption[SelectIndex].KeyLevel][0];       //选择索引为表单第一个选项索引
    SelectLine = 1;              //选择行为第一行
    DIS12864M ();                //刷新显示
  }
  else           //如果不是最后的索引
  {
    if(SelectLine!=4)           //如果当前不是屏幕最底行
    {
      SelectIndex++;             //选择索引自加
      SelectLine++;              //选择行下移
      //  SetALineReverse (SelectLine);      //刷新选择行
      DIS12864M ();              //刷新显示
    }
    else          //如果是屏幕最低行
    {
      FirstLineDisIndex++;      //第一行显示下移
      SelectIndex++;            //选择索引自加
      DIS12864M();              //刷新显示
    }
  }
}
//----------------------------------------
//
//  菜单退出功能函数
// 函数原形:void MenuCancelOption (void);
// 没有参数,没有返回值
// 调用方式:void MenuCancelOption (void);
//
//----------------------------------------
void MenuCancelOption (void)
{
  if(SelectIndex != OPTIONMETE-1)  //如果不是从功能返回
  {
    if(CancelIndex_flag == 1 && sOption[SelectIndex].KeyLevel == 5) { CancelIndex_flag = 0; SelectIndex = 25;}
    else
      SelectIndex = sOption[SelectIndex].CancelIndex; //选择索引为选项返回索引   
  }
  else    //如果是从功能返回
    SelectIndex = LastIndex;//索引等于进入前保存索引
  if(Level[sOption[SelectIndex].KeyLevel][2]>=4)      //如果返回表单选项数目大于4个
  {
    if(SelectIndex > Level[sOption[SelectIndex].KeyLevel][1]-3)  //根据返回选项确定显示首项
    {
      FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][1]-3;
      SelectLine = 4-(Level[sOption[SelectIndex].KeyLevel][1]-SelectIndex);
      DIS12864M ();        //刷新显示
    }
    else  //一般显示方式
    {
      FirstLineDisIndex = SelectIndex; //第一行显示索引
      SelectLine = 1;     //选择第一行
      DIS12864M ();       //刷新菜单
    }
  }
  else   //如果返回表单选项数目不足4个
  {
    FirstLineDisIndex = Level[sOption[SelectIndex].KeyLevel][0];  //第一行显示索引为表单第一项
    SelectLine = SelectIndex - Level[sOption[SelectIndex].KeyLevel][0]+1; //选择行标志为当前选择索引对应行
    DIS12864M ();         //刷新菜单
  }
}


<
回复

使用道具 举报

91

主题

4603

回帖

4

蝴蝶豆

论坛元老

最后登录
2020-12-8
 楼主| 发表于 2017-5-26 09:55:56 | 显示全部楼层
1.jpg
回复 支持 反对

使用道具 举报

7

主题

229

回帖

0

蝴蝶豆

高级会员

最后登录
2018-9-6
发表于 2017-5-26 10:09:21 | 显示全部楼层
谢谢分享!!!
回复 支持 反对

使用道具 举报

74

主题

1368

回帖

194

蝴蝶豆

版主

最后登录
2020-5-12
发表于 2017-5-26 13:55:59 | 显示全部楼层
很经典的菜单树结构
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版