RT,没买显示屏,用的是数码管,目前显示基本没有问题,但是想模拟一个类似界面的效果;我的思路是这样的,有错误,求指教:
1、定义的MenuNum去监控界面状态,界面用函数来区分;
2、构建Menu_Manager();函数来管理和调用其它函数,里面就一个参数就是MenuNum,依靠这个参数的加减去调用其他函数,用switch case语句;
3、Menu_Main是主界面,作用是显示数据,等待键值,以及主界面里键值的操作,比如按下key0,显示-63,按下key1显示26,按下wk_up进入Menu_1界面函数;
4、若干函数界面,测试是将数据存进flash,但是Menu_1,就存在问题,调试值的大小没问题,但是再按下wk_up去往里写入的时候出错,自此不再读取键值且没有示数;
目标是按wk_up键进入界面1,按KEY0/KEY1调试值的大小,再按wk_up键完成写入并进入下一个函数;
但现象是按wk_up键进入界面1,按KEY0/KEY1调试值的大小,再按wk_up键没有值显示,并且键值无法读取。(经过LED测试得到的)
求大神指点一二,我的思路哪里有问题?还是语法逻辑问题?
[mw_shl_code=c,true]#include "menu.h"
#include "SMG.h"
#include "key.h"
#include "led.h"
#include "delay.h"
#include "stmflash.h"
#include "stdio.h"
#define TempHL_SAVE_ADDR 0X08020000
#define TempLL_SAVE_ADDR 0X08020002
int TempHL;
int TempLL;
int databuf; //缓存读取的数据用来比较的,若数据变了则写入,若没变,则不写入
signed data;
signed humidity; //定义湿度
signed temperature; //定义温度
int MenuNum; //初始化菜单界面到主界面
u8 key; //定义键值
void MENU_Init(void)
{
humidity=35;
temperature=26;
data=temperature;
MenuNum=1;
Get_MenuNum(MenuNum); //将menunum值传递到数码管函数里,提供显示的数据
}
void Menu_Main(void)
{
DisPlayNum(data); //显示数据
key=KEY_Scan(0); //等待键值
switch(key) //等待按键
{
case KEY0_PRES: //KEY0键 下
LED0=!LED0;
data=humidity-98; //显示湿度
break;
case KEY1_PRES: //KEY1键 上
LED1=!LED1;
data=temperature; //显示温度
break;
case WKUP_PRES: //SET键
MenuNum=MenuNum+1;
Get_MenuNum(MenuNum);
Menu_Manager();
break;
default:
delay_ms(5);
}
}
void Menu_TemperatureHighLine(void) //设置温度报警上线
{
STMFLASH_Read(TempHL_SAVE_ADDR,(u16*)TempHL,2); //从flash中读出16位datatemp数据
if(TempHL==NULL)
TempHL=40;
data=TempHL;
databuf=TempHL;
while(MenuNum==2)
{
key=KEY_Scan(0); //等待键值
DisPlayNum(data);
switch(key) //等待按键且按键选择模块
{
case KEY0_PRES: //KEY0键 下
LED0=!LED0;
if(data>-40) //判定是否超出范围,若否,则执行操作,若是,则不动
{
TempHL=TempHL-1; //设置值减1
data=TempHL;
}
else
data=TempHL;
break;
case KEY1_PRES: //KEY1键 上
LED1=!LED1;
if(data<85) //判定是否超出范围,若否,则执行操作,若是,则不动
{
TempHL=TempHL+1; //设置值减1
data=TempHL;
}
else
data=TempHL;
break;
case WKUP_PRES: //SET键
if(data!=databuf)
STMFLASH_Write(TempHL_SAVE_ADDR,(u16*)TempHL,1); //将16位datatemp写入flash
MenuNum=MenuNum+1;
Get_MenuNum(MenuNum);
//Menu_Manager();
break;
default: delay_ms(5);
}
}
Menu_Manager();
}
void Menu_TemperatureLowLine(void) //温度报警下线
{
STMFLASH_Read(TempLL_SAVE_ADDR,(u16*)TempLL,1); //从flash中读出16位datatemp数据
if(TempLL==NULL)
TempLL=20;
data=TempLL;
databuf=TempLL;
while(MenuNum==3)
{
key=KEY_Scan(0); //等待键值
switch(key) //等待按键且按键选择模块
{
case KEY0_PRES: //KEY0键 下
if(data>-40&&data<85) //判定是否超出范围,若否,则执行操作,若是,则不动
{
TempLL=TempLL-1; //设置值减1
data=TempLL;
}
else
data=TempLL;
break;
case KEY1_PRES: //KEY1键 上
if(data>-40&&data<85) //判定是否超出范围,若否,则执行操作,若是,则不动
{
TempLL=TempLL+1; //设置值减1
data=TempLL;
}
else
data=TempLL;
break;
case WKUP_PRES: //SET键
if(data!=databuf)
STMFLASH_Write(TempLL_SAVE_ADDR,(u16*)TempLL,1); //将16位datatemp写入flash
MenuNum=MenuNum+1;
Get_MenuNum(MenuNum);
Menu_Manager();
break;
default: ;
}
}
Menu_Manager();
}
void Menu_Manager(void)
{
switch(MenuNum)
{
case 1: Menu_Main();
break;
case 2: Menu_TemperatureHighLine();
break;
default:MenuNum=1;
}
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>