stm3212864液晶菜单设计.docx

上传人:b****7 文档编号:10735826 上传时间:2023-02-22 格式:DOCX 页数:21 大小:18.33KB
下载 相关 举报
stm3212864液晶菜单设计.docx_第1页
第1页 / 共21页
stm3212864液晶菜单设计.docx_第2页
第2页 / 共21页
stm3212864液晶菜单设计.docx_第3页
第3页 / 共21页
stm3212864液晶菜单设计.docx_第4页
第4页 / 共21页
stm3212864液晶菜单设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

stm3212864液晶菜单设计.docx

《stm3212864液晶菜单设计.docx》由会员分享,可在线阅读,更多相关《stm3212864液晶菜单设计.docx(21页珍藏版)》请在冰豆网上搜索。

stm3212864液晶菜单设计.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1