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

下载本文档

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

文档简介

1、stm32-12864液晶-菜单设计/*menu h*#ifndef MENU H #define MENU H#in elude "stm32f10x.h"#i nclude "SysTick.h"#in elude <stdlib.h> #i nclude "12864.h"#i nclude "AdcDis play.h"#i nclude "key.h"#in clude "sp i_tm7705.h"#in clude "ee prom.h&q

2、uot;typ edef struct menu/定义一个菜单u8 ran ge_from,ra nge_to; /当前显示的项开始及结束序号u8 itemCou nt;/ 项目总数u8 selected;/ 当前选择项u8 *me nultems17;/菜单项目struct menu *subMe nu s;/子菜单struct menu *paren t;/ 级则为nullvoid (*fu nc)();/行的函数级菜单,如果是顶选择相应项按确定键后执Me nu;void Mai nDis play(void);void DispI ayMe nu (u8 lin e);void fun

3、c(void);void Un itchl(void);void Un itch2(void);void Un itch3(void);void Un itch4(void);void DiaCha nge(void);void MlCha nge(void);u16 NumLoo p(u16 num,u8 p m); u8 Cha nge(u8 Sval,ui nt8_t* title); void Menuln it(void);#endif /* MENU H */*menu h*menu c*文件名menu.c描述:液晶菜单函数库实验平台:硬件连接库版本ST3.0.0*#in elud

4、e "me nu.h"菜单与AD结果显示变量,0为AD 1为菜单 extern u8 Men uDis=0;/typ edef struct menu /定义一个菜单/ u8 ran ge_from,ra nge_to; /开始及结束序号/ u8 itemCou nt;/当前显示的项项目总数当前选择项菜单项目 子菜单级菜单,如果是/ u8 selected;/ / u8 *me nultems17;/ struct menu *subMe nu s;/ struct menu *paren t;/顶级则为null/ void (*fu nc)();/执行的函数选择相应项按确

5、定键后/ /Me nu;Menu Mai nMenu = /0,340,默认显示选择第0项"单位设置x10","直径设置x10",定义主菜单0-3项,总共4项,当前"模量设置"关于;x10",IIMenu UnitMe nu = / 单位设置菜单0,340,IIIIIIII应变量£",锁模力KN ",锁模力Ton", 取消"u8 UnitCh;/ 单位选择,0为变形量£, 变量, 2为锁模力F1为应Menu DiaMenu = /单位设置菜单0,0,1,0,&quo

6、t;主 999 mm"Menu MlMenu = /模量设置菜单0,0,1,0,"主 999 KN/mm2" ;u8 DiaVal;/直径数值u8 MlVal;/ 模量数值/菜单与AD结果显示变量,0为AD 1为菜单 u8 Men uDis;/复位前指数u16 BaseAD4;/横截面积u16 mianji;/横截直径u16 zhiji ng;/模量u16 molia ng;/按键返回值u8 keyval;uin t8_t* title仁"uint8 t* title2="单位:单位:MM"KN/MM2"extern u16

7、 ADResult4;/exter n存储AD结果的数组uint16 tVirtAddVarTabNumbOfVar;/ee promMenu *curre ntMe nu;/ 当前的菜单void Mai nDis play(void) if (Me nuDis=0)AdUi();keyval=KeySca n();switch(keyval)case 0:/什么都不Delay_ms(50); break;case 1:/ 向上if(Me nuDis=1)if(curre ntMe nu->selected= 0)/到了第一项break;elsecurren tMe nu->sel

8、ected-;Dis playMe nu (curre ntMe nu->selected);break;case 2:/ 向下if(Me nuDis=1)if(curre ntMe nu->selectedcurre ntMe nu->itemCo un t-1)break;elsecurre ntMe nu->selected+;Dis playMe nu (curre ntMe nu->selected);break;case 3:/ 确认if(Me nuDis=O)Men uDis=1;LCDnit();Dis pl ayMe nu (curre ntMe

9、 nu->selected); elseif(curre ntMen u->subMe nu scurre ntMen u->s elected匸NULL)LCD_I ni t();curre ntMe nucurre ntMen u->subMe nu scurre ntMen u->select ed;Dis playMe nu (curre ntMe nu->selected);elseif(curre ntMe nu->fu nccurre ntMe nu->selecte d != NULL)LCDnit();curre ntMe nu

10、->funccurrentMenu->selected();/执行相应的函数curre ntMe nu->selected=O;DisplayMe nu (curre ntMe nu->selected);/返叵后恢复原来的菜单状态break;case 4:/ 取消if(Me nuDis=1)if(curre ntMe nu->pare nt!=NULL)/父菜单不为空,将显示父菜单Write_Char(0,0x30);/关闭扩展指LCD_I nit();curre ntMe nucurre ntMe nu->parent;curren tMe nu->

11、;selected=0;Dis playMe nu (curre ntMe nu->selected);elseMen uDis=O;/curre ntMe nu = MainMenu; curre ntMe nu->selected=O; LCDnit();AdUi();Delay_ms(100); else Clr_Scr();Delay_ms(50);/复位归零BaseAD0=ADResult0;BaseAD1=ADResult1;BaseAD2=ADResult2;BaseAD3=ADResult3;AdUi(); break; default: break;/用于显示采单

12、项void Dis pl ayMe nu(u8 line) / 显示菜单项并设置选中的项反白int i;line = 3-(curre ntMen u->ra nge_to-li ne);for(i = 0;i<4;i+)LCD_Write_Stri ng(i,O,curre ntMe nu->me nulte msi+curre ntMe nu->ra nge_from);WhiteLi nel nit();反白显示指定行White_Li ne(li ne,0,8);/ void fun c(void)uint8_t* s="为人民服务"LCD_W

13、rite_Stri ng(1,0,s);Delay_ms(3000); void Un itch1(void)Uni tCh=O;LCDni t();curre ntMe nu = curre ntMe nu->parent;curre ntMe nu->selected=O;Dis pl ayMe nu (curre ntMe nu->selected); void Un itch2(void)Uni tCh=1;LCD_I ni t();curre ntMe nu = curre ntMe nu->parent;curre ntMe nu->selected=

14、0;Dis pl ayMe nu (curre ntMe nu->selected); void Un itch3(void)Uni tCh=2;LCD_I ni t();curre ntMe nu = curre ntMe nu->parent;curre ntMe nu->selected=0;Dis pl ayMe nu (curre ntMe nu->selected); void Un itch4(void)LCD_I ni t();curre ntMe nu = curre ntMe nu->parent;curre ntMe nu->selec

15、ted=0;Dis pl ayMe nu (curre ntMe nu->selected); 单位:MM"void DiaCha nge(void) ui nt8_t* s="/测试代码u16 a=0;int i=0;/u16 tmp1;LCDni t();LCD_Wnte_Stri ng(O,O,s);zhiji ng=Cha nge(zhiji ng,title1);mianji=3.14*(zhiji ng/2)*(zhiji ng/2);EE_WriteVariable(VirtAddVarTab0, zhiji ng);/测试代码for(i=0;iv99;

16、i+)a=a+1;LCD_Write_Tn_Value(2,3,a);Delay_ms(50);/ void MlCha nge(void)uint8_t* s=" 单位:KN/MM2"LCD_I ni t();LCD_Write_Stri ng(0,0,s);molia ng=Cha nge(molia ng,title2);EE_WriteVariable(VirtAddVarTab1,molia ng);/数字按键循环,升到9后变0,降到0后变9, 参数pm为加减,1为+ , 0为减u16 NumLoo p(u16 num,u8 pm)if (pm=1)if (nu

17、m>=9)n um=0;elsenum=n um+1;elseif (nu m<=0) n um=9;elsenum=n um-1;return num;/Sval代表直径或模量的默认值,返回修改后 直径或模量的值u8 Cha nge(u8 Sval,ui nt8_t* title)u16 baiwei,shiwei,gewei,Dval;/数字ascii 码/char tmp val;/按键返回值u8 keyval=0;/光标位置3为百位、4为十位,5为个位u8 loc=3;中一位/是否选中其u8 clicked=0;/光标闪烁位,是否闪烁u8 flicker=0;baiwei=

18、(u16)(Sval/100);shiwei=(u16)(Sval%100)/10); gewei=(u16)(Sval%100)%10);/t mpval=(char)baiwei + 0x30; LCD_Write_Char(2,3,tm pval); t mpval=(char)shiwei + 0x30;LCD_Write_Char(2,4,tm pval); t mpval=(char)gewei + 0x30;LCD_Write_Char(2,5,tm pval);/LCD_Wnte_Si ngle_Num(2,3,baiwei);/LCD_Wnte_Si ngle_Num(2,4

19、,shiwei);LCD_Write_Si ngle_Num(2,5,gewei);LCD_Write_Tri_Value(2,3,Sval);WhiteLi nel nit();White_Li ne(2,3,1);/反白显示指定行while(1)keyval=KeySca n();switch(keyval)case 0:/什么都不if (clicked)if (flicker=0)White_Li ne(2,loc,1); flicker=1;else Shut_White_Li ne(2,loc,1); flicker=0;/else/White_Li ne(2,loc,1);Dela

20、y_ms(300); break;case 1:/ 向上if (clicked=0)if (loc>3) loc=loc-1;elseloc=3;WhiteLi nel nit();White_Li ne(2,loc,1);else switch (loc)case 3:baiwei=NumLoop(baiwei,1);LCD_I nit(); break;case 4:shiwei=NumLo op( shiwei,1);LCD_I nit(); break;case 5: gewei=NumLo op (gewei,1);LCDni t();break;default:break;

21、break;case 2:/ 向下if (clicked=0)if (loc<5) loc=loc+1;elseloc=5;WhiteLi nel nit();White_Li ne(2,loc,1); elseswitch (loc)case 3: baiwei=NumLo op (baiwei,0);LCDni t();break;case 4: shiwei=NumLo op (shiwei,0);LCD_I ni t();break;case 5:gewei=NumLo op (gewei,0);LCDni t();break;default:break;break;case 3

22、:/ 确认 if (clicked) clicked=0;elseclicked=1; break;case 4:/ 取消 if (clicked)clicked=0;else II返回主菜单LCDnit();curre ntMe nu = & Mai nMenu;curren tMe nu->selected=0;Dis playMe nu (curre ntMe nu->selected);/返回新的数值Dval=baiwei*100+shiwei*10+gewei; return Dval;break;default:break;IILCD_I ni t();LCD_

23、Write_Stri ng(0,0,title);Dval=baiwei*100+shiwei*10+gewei;LCD_Write_Tn_Value(2,3,Dval);Delay_ms(20);/初始化菜单:void Men ul nit(void)Mai nMen u.subMe nus=malloc(sizeof(&Mai nMe nu)*4);MainMenu.subMenus0= &UnitMenu;/ 第 1项没有子菜单置null,选择后程序会调用func 中相应项中的函数Mai nMen u.subMe nus1 = NULL;/ &DiaMe nu;直

24、接执行设置函数Mai nMen u.subMe nus2 = NULL;/&MIMe nu; 直 接执行设置函数Mai nMen u.subMe nus3 = NULL;MainMen u.f unc = malloc(sizeof(&fun c)*4);Mai nMen u.fu nc0 = &func;Mai nMe nu.fu nc1 = & DiaCha nge;MainMenu.func2= &MlChange;/ 当选择了并按了确定,会执行func函数Mai nMen u.fu nc3 = NULL;Mai nMen u. pare nt = NULL;/表示是顶级菜单Un itMe nu.subMe nus malloc(sizeof(&Un itMe nu)*4); Un itMe nu.subMe nusO = NULL; Uni tMe nu.subMe nus1 = NULL; Un itMe n

温馨提示

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

评论

0/150

提交评论