stm32 - 12864液晶 - 菜单设计

更新时间:2024-01-31 01:34:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

/*************menu.h*******************/ #ifndef __MENU_H #define __MENU_H

#include \#include \#include #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();

本文来源:https://www.bwwdw.com/article/hejw.html

Top