stm32-12864液晶-菜单设计.docx_第1页
stm32-12864液晶-菜单设计.docx_第2页
stm32-12864液晶-菜单设计.docx_第3页
stm32-12864液晶-菜单设计.docx_第4页
stm32-12864液晶-菜单设计.docx_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/*menu.h*/#ifndef _MENU_H#define _MENU_H#include stm32f10x.h#include SysTick.h#include stdlib.h#include 12864.h#include AdcDisplay.h#include key.h#include spi_tm7705.h#include eeprom.htypedef struct menu/定义一个菜单 u8 range_from,range_to; /当前显示的项开始及结束序号 u8 itemCount;/项目总数 u8 selected;/当前选择项 u8 *menuItems17;/菜单项目 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 menu.h/菜单与AD结果显示变量,0为AD,1为菜单extern u8 MenuDis=0;/typedef struct menu/定义一个菜单/ u8 range_from,range_to; /当前显示的项开始及结束序号/ u8 itemCount;/项目总数/ u8 selected;/当前选择项/ u8 *menuItems17;/菜单项目/ 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为锁模力FMenu 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 BaseAD4;/横截面积u16 mianji;/横截直径u16 zhijing;/模量u16 moliang;/按键返回值u8 keyval;uint8_t* title1=单位:MM;uint8_t* title2=单位:KN/MM2;extern u16 ADResult4;/存储AD结果的数组extern uint16_t VirtAddVarTabNumbOfVar;/eepromMenu *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;elsecurrentMenu-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-subMenuscurrentMenu-selected !=NULL) LCD_Init(); currentMenu = currentMenu-subMenuscurrentMenu-selected; DisplayMenu(currentMenu-selected); else if(currentMenu-funccurrentMenu-selected != NULL) LCD_Init(); currentMenu-funccurrentMenu-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); elseMenuDis=0;/currentMenu = MainMenu;currentMenu-selected=0; LCD_Init();AdUi();Delay_ms(100);elseClr_Scr();Delay_ms(50);Write_Char(0,0x30);/关闭扩展指令/复位归零BaseAD0=ADResult0;BaseAD1=ADResult1;BaseAD2=ADResult2;BaseAD3=ADResult3;AdUi();break;default:break;/用于显示菜单项void DisplayMenu(u8 line) /显示菜单项并设置选中的项反白 int i; line = 3-(currentMenu-range_to-line); for(i = 0;i4;i+) LCD_Write_String(i,0,currentMenu-menuItemsi+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;int i=0;/u16 tmp1;LCD_Init();LCD_Write_String(0,0,s);zhijing=Change(zhijing,title1);mianji=3.14*(zhijing/2)*(zhijing/2);EE_WriteVariable(VirtAddVarTab0, zhijing);/测试代码/for(i=0;i99;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(VirtAddVarTab1, moliang);/数字按键循环,升到9后变0,降到0后变9,参数pm为加减,1为+,0为减u16 NumLoop(u16 num,u8 pm)if (pm=1)if (num=9)num=0;elsenum=num+1;elseif (num=0)num=9;elsenum=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)(Sval%100)/10);gewei=(u16)(Sval%100)%10);/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;elseShut_White_Line(2,loc,1);flicker=0;/else/White_Line(2,loc,1);Delay_ms(300);break;case 1:/向上if (clicked=0)if (loc3)loc=loc-1;elseloc=3;WhiteLineInit();White_Line(2,loc,1);elseswitch (loc)case 3:baiwei=NumLoop(baiwei,1);LCD_Init();break;case 4:shiwei=NumLoop(shiwei,1);LCD_Init();break;case 5:gewei=NumLoop(gewei,1);LCD_Init();break;default:break;break;case 2:/向下if (clicked=0)if (loc5)loc=loc+1;elseloc=5;WhiteLineInit();White_Line(2,loc,1);elseswitch (loc)case 3:baiwei=NumLoop(baiwei,0);LCD_Init();break;case 4:shiwei=NumLoop(shiwei,0);LCD_Init();break;case 5:gewei=NumLoop(gewei,0);LCD_Init();break;default:break;break;case 3:/确认 if (clicked) clicked=0; else clicked=1; break;case 4:/取消if (clicked) clicked=0;else /返回主菜单LCD_Init(); currentMenu = MainMenu;currentMenu-selected=0; DisplayMenu(currentMenu-selected);/返回新的数值Dval=baiwei*100+shiwei*10+gewei;return Dval; break;default:break; /LCD_Init();LCD_Write_String(0,0,title);Dval=baiwei*100+shiwei*10+gewei;LCD_Write_Tri_Value(2,3,Dval); Delay_ms(20); /初始化菜单:void MenuInit(void) MainMenu.subMenus = malloc(sizeof(MainMenu)*4); MainMenu.subMenus0 = UnitMenu;/第1项没有子菜单置null,选择后程序会调用func中相应项中的函数 MainMenu.subMenus1 = NULL;/DiaMenu;直接执行设置函数 MainMenu.subMenus2 = NULL;/MlMenu;直接执行设置函数 MainMenu.subMenus3 = NULL; MainMenu.func = malloc(sizeof(func)*4); MainMenu.func0 = func; MainMenu.func1 = DiaChange; MainMenu.func2 = MlChange;/当选择了并按了确定,会执行func函数 MainMenu.func3 = NULL; MainMenu.parent = NULL;/表示是顶级菜单 UnitMenu.subMenus = malloc(sizeof(UnitMenu)*4); UnitMenu.subMenus0 = NULL; UnitM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论