stm32 - 12864液晶 - 菜单设计
更新时间:2024-01-31 01:34:01 阅读量: 教育文库 文档下载
/*************menu.h*******************/ #ifndef __MENU_H #define __MENU_H
#include \#include \#include
#include \#include \
typedefstruct menu//定义一个菜单 {
u8 range_from,range_to; //当前显示的项开始及结束序号 u8 itemCount;//项目总数 u8 selected;//当前选择项
u8 *menuItems[17];//菜单项目 struct menu **subMenus;//子菜单
struct menu *parent;//上级菜单 ,如果是顶级则为null void (**func)();//选择相应项按确定键后执行的函数
}Menu;
void MainDisplay(void); void DisplayMenu(u8 line); void func(void); void Unitch1(void); void Unitch2(void); void Unitch3(void); void Unitch4(void); void DiaChange(void); void MlChange(void);
u16 NumLoop(u16 num,u8 pm); u8 Change(u8 Sval,uint8_t* title); void MenuInit(void);
#endif /* __MENU_H */
/*************menu.h*******************/
/************menu.c*******************/ /******************** ********************
* 文件名:menu.c
* 描述:液晶菜单函数库 * 实验平台:
* 硬件连接 ---------------------------- * * *
* ----------------------------
* 库版本:ST3.0.0 *
**********************************************************************************/
#include \
//菜单与AD结果显示变量,0为AD,1为菜单 extern u8 MenuDis=0;
//typedefstruct menu//定义一个菜单 //{
// u8 range_from,range_to; //当前显示的项开始及结束序号 // u8 itemCount;//项目总数 // u8 selected;//当前选择项
// u8 *menuItems[17];//菜单项目 // struct menu **subMenus;//子菜单
// struct menu *parent;//上级菜单 ,如果是顶级则为null // void (**func)();//选择相应项按确定键后执行的函数 //
//}Menu;
Menu MainMenu = { //定义主菜单
0,3,4,0,//默认显示0-3项,总共4项,当前选择第0项 {
\单位设置 \\x10\ \直径设置 \\x10\ \模量设置 \\x10\ \关于 \ } };
Menu UnitMenu = {//单位设置菜单 0,3,4,0, {
\应变量ε \
\锁模力KN \ \锁模力Ton\ \取消\ } };
u8 UnitCh;//单位选择,0为变形量ε,1为应变量σ,2为锁模力F
Menu DiaMenu = {//单位设置菜单 0,0,1,0, {
\主999 mm\ } };
Menu MlMenu = {//模量设置菜单 0,0,1,0, {
\主999 KN/mm2\ } };
u8 DiaVal;//直径数值 u8 MlVal;//模量数值
//菜单与AD结果显示变量,0为AD,1为菜单 u8 MenuDis; //复位前指数 u16 BaseAD[4]; //横截面积 u16 mianji; //横截直径 u16 zhijing;
//模量
u16 moliang;
//按键返回值 u8 keyval;
uint8_t* title1=\单位:MM\
uint8_t* title2=\单位:KN/MM2\
extern u16 ADResult[4];//存储AD结果的数组
extern uint16_t VirtAddVarTab[NumbOfVar];//eeprom
Menu *currentMenu;//当前的菜单
void MainDisplay(void) { if (MenuDis==0) AdUi(); keyval=KeyScan(); switch(keyval) {
case 0: //什么都不干 { Delay_ms(50); break; }
case 1://向上 { if(MenuDis==1) { if(currentMenu->selected == 0)//到了第一项 break; else { currentMenu->selected--; DisplayMenu(currentMenu->selected); } } break; }
case 2://向下 { if(MenuDis==1) { if(currentMenu->selected == currentMenu->itemCount-1) break; else { currentMenu->selected++; DisplayMenu(currentMenu->selected); }
} break; }
case 3://确认 { if(MenuDis==0) { MenuDis=1; LCD_Init(); DisplayMenu(currentMenu->selected); } else { if(currentMenu->subMenus[currentMenu->selected] !=NULL) { LCD_Init(); currentMenu = currentMenu->subMenus[currentMenu->selected]; DisplayMenu(currentMenu->selected); } else { if(currentMenu->func[currentMenu->selected] != NULL) { LCD_Init(); }
currentMenu->func[currentMenu->selected]();//执行相应的函数 currentMenu->selected=0; DisplayMenu(currentMenu->selected);//返回后恢复原来的菜单状态 } } }
break;
case 4://取消 { if(MenuDis==1) { if(currentMenu->parent!=NULL)//父菜单不为空,将显示父菜单 { LCD_Init(); currentMenu = currentMenu->parent; currentMenu->selected=0; DisplayMenu(currentMenu->selected); } else
}
}
{ MenuDis=0; //currentMenu = MainMenu; currentMenu->selected=0; LCD_Init(); AdUi(); Delay_ms(100); } } else { Clr_Scr(); Delay_ms(50);
Write_Char(0,0x30);//关闭扩展指令 //复位归零 BaseAD[0]=ADResult[0]; BaseAD[1]=ADResult[1]; BaseAD[2]=ADResult[2]; BaseAD[3]=ADResult[3]; AdUi(); } break; }
default: break;
//用于显示菜单项
void DisplayMenu(u8 line) //显示菜单项并设置选中的项反白 { inti;
line = 3-(currentMenu->range_to-line);
for(i = 0;i<4;i++) {
LCD_Write_String(i,0,currentMenu->menuItems[i+currentMenu->range_from]); }
WhiteLineInit();
White_Line(line,0,8);//反白显示指定行 }
void func(void) { uint8_t* s=\为人民服务\ LCD_Write_String(1,0,s); Delay_ms(3000); }
void Unitch1(void) { UnitCh=0; LCD_Init(); currentMenu = currentMenu->parent; currentMenu->selected=0; DisplayMenu(currentMenu->selected); }
void Unitch2(void) { UnitCh=1; LCD_Init(); currentMenu = currentMenu->parent; currentMenu->selected=0; DisplayMenu(currentMenu->selected); }
void Unitch3(void) { UnitCh=2; LCD_Init(); currentMenu = currentMenu->parent; currentMenu->selected=0; DisplayMenu(currentMenu->selected); }
void Unitch4(void) { LCD_Init(); currentMenu = currentMenu->parent; currentMenu->selected=0; DisplayMenu(currentMenu->selected); }
void DiaChange(void) {
uint8_t* s=\单位:MM\//测试代码 u16 a=0; inti=0;
//u16 tmp1;
LCD_Init();
LCD_Write_String(0,0,s);
zhijing=Change(zhijing,title1);
mianji=3.14*((zhijing/2)*(zhijing/2)); EE_WriteVariable(VirtAddVarTab[0], zhijing);
//测试代码 // for(i=0;i<99;i++) // { // a=a+1; // LCD_Write_Tri_Value(2,3,a); // Delay_ms(50); // } }
void MlChange(void) { }
uint8_t* s=\单位:KN/MM2\LCD_Init();
LCD_Write_String(0,0,s);
moliang=Change(moliang,title2);
EE_WriteVariable(VirtAddVarTab[1], moliang);
//数字按键循环,升到9后变0,降到0后变9,参数pm为加减,1为+,0为减 u16 NumLoop(u16 num,u8 pm) { if (pm==1) { if (num>=9) num=0; else num=num+1; } else {
}
if (num<=0) num=9; else num=num-1; }
return num;
//Sval代表直径或模量的默认值,返回修改后直径或模量的值 u8 Change(u8 Sval,uint8_t* title) { u16 baiwei,shiwei,gewei,Dval; // // // // // // // // //
//数字ascii码 //char tmpval; //按键返回值 u8 keyval=0;
//光标位置3为百位、4为十位,5为个位 u8 loc=3;
//是否选中其中一位 u8 clicked=0;
//光标闪烁位,是否闪烁 u8 flicker=0;
baiwei=(u16)(Sval/100);
shiwei=(u16)((Sval0)/10); gewei=(u16)((Sval0)); tmpval=(char)baiwei + 0x30; LCD_Write_Char(2,3,tmpval); tmpval=(char)shiwei + 0x30; LCD_Write_Char(2,4,tmpval); tmpval=(char)gewei + 0x30; LCD_Write_Char(2,5,tmpval);
LCD_Write_Single_Num(2,3,baiwei); LCD_Write_Single_Num(2,4,shiwei); LCD_Write_Single_Num(2,5,gewei);
LCD_Write_Tri_Value(2,3,Sval); WhiteLineInit();
White_Line(2,3,1);//反白显示指定行 while(1) {
// //
keyval=KeyScan(); switch(keyval) {
case 0: //什么都不干 { if (clicked) { if (flicker==0) { White_Line(2,loc,1); flicker=1; } else { Shut_White_Line(2,loc,1); flicker=0; } } else White_Line(2,loc,1); Delay_ms(300); break; }
case 1://向上 { if (clicked==0) { if (loc>3) loc=loc-1; else loc=3; WhiteLineInit(); White_Line(2,loc,1); } else { switch (loc) { case 3: { baiwei=NumLoop(baiwei,1);
LCD_Init();
正在阅读:
无砟轨道后张法预应力混凝土简支箱梁施工作业指导书 - 图文12-22
3月学习雷锋思想汇报05-15
H无穷滤波技术在电池荷电状态估计中的应用—开题报告11-29
尔雅学习通答案中国书法史(新版)12-24
我心爱的存钱罐作文450字07-15
门楼高支模方案(原版)12-21
幼儿园支部党建工作情况总结03-12
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 液晶
- 菜单
- 设计
- stm32
- 12864
- 幼儿教师招聘考试结构化面试答题技巧
- 5工程布置及建筑物2011.6.7
- 土木工程模拟试卷
- 备战2018年英语中考任务型阅读专题复习(含答案)
- 英雄的悲剧 悲剧的英雄
- 危废管理计划指南
- 山东现代汉族三大民系及方言分区一览表附移民 - 图文
- 电厂锅炉蒸汽温度串级控制系统设计
- 2015年呼和浩特市中考英语九年级总复习模拟题(3)(含答案)
- 大明宫简介
- 2017年电大《社会保障学》机考题库及答案
- 2018届浙江省杭州市命题比赛高考选考科目模拟测试(五)政治试题
- 中国国军标大全(GJB)汇总
- 大学英语精读Book 3 Unit 9 文字材料
- 了解新农村建设规划及旧村改造情况的调研报告
- 共小志
- 干货:如何用Minitab软件进行过程能力分析(CPCPK)
- 2018-2019-政治思想工作总结4篇-范文模板(12页)
- 高考改革新政为体育成选考科目创造空间
- 联泰:创建现代企业的7 年(D2S 商业模式)