想用数码管模拟一个界面循环设置参数的效果,撞墙求指点!

2019-08-14 14:30发布

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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。