高级会员 
  
	- 积分
 - 504
 
        - 金钱
 - 504 
 
       - 注册时间
 - 2017-7-24
 
      - 在线时间
 - 117 小时
 
 
 
 | 
 
5金钱 
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] 
 |   
 
 
最佳答案
查看完整内容[请看2#楼] 
已经解决,经多次重新测试,得出结论逻辑上没有错误= =是因为我调用了后面的函数但是在被调用的函数里没有写入显示代码。 
 
 
 
 
 
 
 |