打印
[STM32L4]

【ST资源大分享】+ NUCLEO-L476RG之list菜单+红外控制

[复制链接]
1482|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这是我之前申请到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 ();         //刷新菜单
  }
}

整个开发工程上传到百度云(可直接编译)。链接:http://pan.baidu.com/s/1gdHKxKB 密码:e173

1.jpg (381.94 KB )

1.jpg

2.jpg (363.45 KB )

2.jpg

2-1.jpg (348.52 KB )

2-1.jpg

3.jpg (388.66 KB )

3.jpg

3-1.jpg (392.51 KB )

3-1.jpg

4.jpg (356.53 KB )

4.jpg

4-1.jpg (390.38 KB )

4-1.jpg

5.jpg (384.61 KB )

5.jpg

5-1.jpg (379.07 KB )

5-1.jpg

IMG_20151124_102022.jpg (378.82 KB )

IMG_20151124_102022.jpg

mima-1.jpg (377.98 KB )

mima-1.jpg

mima-2.jpg (368.57 KB )

mima-2.jpg

mima-3.jpg (331.44 KB )

mima-3.jpg

参数-1.jpg (377.04 KB )

参数-1.jpg

参数-2.jpg (379.82 KB )

参数-2.jpg

参数-3.jpg (343.4 KB )

参数-3.jpg
沙发
mmuuss586| | 2016-7-27 14:30 | 只看该作者
不错,好好努力;

使用特权

评论回复
板凳
那就地方iv|  楼主 | 2016-7-28 09:07 | 只看该作者
mmuuss586 发表于 2016-7-27 14:30
不错,好好努力;

谢谢

使用特权

评论回复
地板
Larm1| | 2016-8-5 14:30 | 只看该作者
好东西,谢谢楼主分享...

使用特权

评论回复
5
mypczhou| | 2016-9-5 16:20 | 只看该作者
程序中没找到HAL_TIM_IRQHandler这个函数啊!

使用特权

评论回复
6
那就地方iv|  楼主 | 2016-9-6 20:59 | 只看该作者
mypczhou 发表于 2016-9-5 16:20
程序中没找到HAL_TIM_IRQHandler这个函数啊!

我的百度云里面的工程可以直接下载编译的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

257

帖子

1

粉丝