stm3212864液晶菜单设计.docx
《stm3212864液晶菜单设计.docx》由会员分享,可在线阅读,更多相关《stm3212864液晶菜单设计.docx(21页珍藏版)》请在冰豆网上搜索。
stm3212864液晶菜单设计
/*************menu.h*******************/
#ifndef__MENU_H
#define__MENU_H
#include"stm32f10x.h"
#include"SysTick.h"
#include
#include"12864.h"
#include"AdcDisplay.h"
#include"key.h"
#include"spi_tm7705.h"
#include"eeprom.h"
typedefstructmenu//定义一个菜单
{
u8range_from,range_to;//当前显示的项开始及结束序号
u8itemCount;//项目总数
u8selected;//当前选择项
u8*menuItems[17];//菜单项目
structmenu**subMenus;//子菜单
structmenu*parent;//上级菜单,如果是顶级则为null
void(**func)();//选择相应项按确定键后执行的函数
}Menu;
voidMainDisplay(void);
voidDisplayMenu(u8line);
voidfunc(void);
voidUnitch1(void);
voidUnitch2(void);
voidUnitch3(void);
voidUnitch4(void);
voidDiaChange(void);
voidMlChange(void);
u16NumLoop(u16num,u8pm);
u8Change(u8Sval,uint8_t*title);
voidMenuInit(void);
#endif/*__MENU_H*/
/*************menu.h*******************/
/************menu.c*******************/
/****************************************
*文件名:
menu.c
*描述:
液晶菜单函数库
*实验平台:
*硬件连接----------------------------
*
*
*
*----------------------------
*库版本:
ST3.0.0
*
**********************************************************************************/
#include"menu.h"
//菜单与AD结果显示变量,0为AD,1为菜单
externu8MenuDis=0;
//typedefstructmenu//定义一个菜单
//{
//u8range_from,range_to;//当前显示的项开始及结束序号
//u8itemCount;//项目总数
//u8selected;//当前选择项
//u8*menuItems[17];//菜单项目
//structmenu**subMenus;//子菜单
//structmenu*parent;//上级菜单,如果是顶级则为null
//void(**func)();//选择相应项按确定键后执行的函数
//
//}Menu;
MenuMainMenu={//定义主菜单
0,3,4,0,//默认显示0-3项,总共4项,当前选择第0项
{
"单位设置\x10",
"直径设置\x10",
"模量设置\x10",
"关于"
}
};
MenuUnitMenu={//单位设置菜单
0,3,4,0,
{
"应变量ε",
"锁模力KN",
"锁模力Ton",
"取消"
}
};
u8UnitCh;//单位选择,0为变形量ε,1为应变量σ,2为锁模力F
MenuDiaMenu={//单位设置菜单
0,0,1,0,
{
"主999mm"
}
};
MenuMlMenu={//模量设置菜单
0,0,1,0,
{
"主999KN/mm2"
}
};
u8DiaVal;//直径数值
u8MlVal;//模量数值
//菜单与AD结果显示变量,0为AD,1为菜单
u8MenuDis;
//复位前指数
u16BaseAD[4];
//横截面积
u16mianji;
//横截直径
u16zhijing;
//模量
u16moliang;
//按键返回值
u8keyval;
uint8_t*title1="单位:
MM";
uint8_t*title2="单位:
KN/MM2";
externu16ADResult[4];//存储AD结果的数组
externuint16_tVirtAddVarTab[NumbOfVar];//eeprom
Menu*currentMenu;//当前的菜单
voidMainDisplay(void)
{
if(MenuDis==0)
AdUi();
keyval=KeyScan();
switch(keyval)
{
case0:
//什么都不干
{
Delay_ms(50);
break;
}
case1:
//向上
{
if(MenuDis==1)
{
if(currentMenu->selected==0)//到了第一项
break;
else
{
currentMenu->selected--;
DisplayMenu(currentMenu->selected);
}
}
break;
}
case2:
//向下
{
if(MenuDis==1)
{
if(currentMenu->selected==currentMenu->itemCount-1)
break;
else
{
currentMenu->selected++;
DisplayMenu(currentMenu->selected);
}
}
break;
}
case3:
//确认
{
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;
}
case4:
//取消
{
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;
}
}
//用于显示菜单项
voidDisplayMenu(u8line)//显示菜单项并设置选中的项反白
{
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);//反白显示指定行
}
voidfunc(void)
{
uint8_t*s="为人民服务";
LCD_Write_String(1,0,s);
Delay_ms(3000);
}
voidUnitch1(void)
{
UnitCh=0;
LCD_Init();
currentMenu=currentMenu->parent;
currentMenu->selected=0;
DisplayMenu(currentMenu->selected);
}
voidUnitch2(void)
{
UnitCh=1;
LCD_Init();
currentMenu=currentMenu->parent;
currentMenu->selected=0;
DisplayMenu(currentMenu->selected);
}
voidUnitch3(void)
{
UnitCh=2;
LCD_Init();
currentMenu=currentMenu->parent;
currentMenu->selected=0;
DisplayMenu(currentMenu->selected);
}
voidUnitch4(void)
{
LCD_Init();
currentMenu=currentMenu->parent;
currentMenu->selected=0;
DisplayMenu(currentMenu->selected);
}
voidDiaChange(void)
{
uint8_t*s="单位:
MM";
//测试代码
u16a=0;
inti=0;
//u16tmp1;
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);
//}
}
voidMlChange(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为减
u16NumLoop(u16num,u8pm)
{
if(pm==1)
{
if(num>=9)
num=0;
else
num=num+1;
}
else
{
if(num<=0)
num=9;
else
num=num-1;
}
returnnum;
}
//Sval代表直径或模量的默认值,返回修改后直径或模量的值
u8Change(u8Sval,uint8_t*title)
{
u16baiwei,shiwei,gewei,Dval;
//数字ascii码
//chartmpval;
//按键返回值
u8keyval=0;
//光标位置3为百位、4为十位,5为个位
u8loc=3;
//是否选中其中一位
u8clicked=0;
//光标闪烁位,是否闪烁
u8flicker=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)
{
case0:
//什么都不干
{
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;
}
case1:
//向上
{
if(clicked==0)
{
if(loc>3)
loc=loc-1;
else
loc=3;
WhiteLineInit();
White_Line(2,loc,1);
}
else
{
switch(loc)
{
case3:
{
baiwei=NumLoop(baiwei,1);
LCD_Init();
break;
}
case4:
{
shiwei=NumLoop(shiwei,1);
LCD_Init();
break;
}
case5:
{
gewei=NumLoop(gewei,1);
LCD_Init();
break;
}
default:
break;
}
}
break;
}
case2:
//向下
{
if(clicked==0)
{
if(loc<5)
loc=loc+1;
else
loc=5;
WhiteLineInit();
White_Line(2,loc,1);
}
else
{
switch(loc)
{
case3:
{
baiwei=NumLoop(baiwei,0);
LCD_Init();
break;
}
case4:
{
shiwei=NumLoop(shiwei,0);
LCD_Init();
break;
}
case5:
{
gewei=NumLoop(gewei,0);
LCD_Init();
break;
}
default:
break;
}
}
break;
}
case3:
//确认
{
if(clicked)
clicked=0;
else
clicked=1;
break;
}
case4:
//取消
{
if(clicked)
clicked=0;
else//返回主菜单
{
LCD_Init();
currentMenu=&MainMenu;
currentMenu->selected=0;
DisplayMenu(currentMenu->selected);
//返回新的数值
Dval=baiwei*100+shiwei*10+gewei;
returnDval;
}
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);
}
}
//初始化菜单:
voidMenuInit(void)
{
MainMenu.subMenus=malloc(sizeof(&MainMenu)*4);
MainMenu.subMenus[0]=&UnitMenu;//第1项没有子菜单置null,选择后程序会调用func中相应项中的函数
MainMenu.subMenus[1]=NULL;//&DiaMenu;直接执行设置函数
MainMenu.subMenus[2]=NULL;//&MlMenu;直接执行设置函数
MainMenu.subMenus[3]=NULL;
MainMenu.func=malloc(sizeof(&func)*4);
MainMenu.func[0]=&func;
MainMenu.func[1]=&DiaChange;
MainMenu.func[2]=&MlChange;//当选择了并按了确定,会执行func函数
MainMenu.func[3]=NULL;
MainMenu.parent=NULL;//表示是顶级菜单
UnitMenu.subMenus=malloc(sizeof(&UnitMenu)*4);
UnitMenu.subMenus[0]=NULL;
UnitMenu.subMenus[1]=NULL;
UnitMenu.subMenus[2]=NULL;
UnitMenu.subMenus[3]=NULL;
UnitMenu.func=malloc(sizeof(&Unitch1)*4);
UnitMenu.func[0]=&Unitch1;
UnitMenu.func[1]=&Unitch2;
UnitMenu.func[2]=&Unitch3;
UnitMenu.func[3]=&Unitch4;
UnitMenu.parent=&MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项
//DiaMenu.subMenus=malloc(sizeof(&DiaMenu)*1);
//DiaMenu.subMenus[0]=NULL;
//DiaMenu.func=malloc(sizeof(&func)*1);
//DiaMenu.func[0]=&func;
//DiaMenu.parent=&MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单项
//
//MlMenu.subMenus=malloc(sizeof(&MlMenu)*1);
//MlMenu.subMenus[0]=NULL