OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4946|回复: 2

KEY_Scan()函数在if语句中出错

[复制链接]

2

主题

3

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-8-6
在线时间
12 小时
发表于 2020-5-3 20:30:04 | 显示全部楼层 |阅读模式
3金钱
新人一个,最近在做一些小题目,卡在电压测量监控设备的显示部分,要求KEY0按键切换调整界面1的一个字符的显示,KEY1按键切换整个界面,代码先附上,给的是出错的代码,正确的代码只需要将KEY_Scan(0)的值赋给变量KEY_Scan,再进行判断即可,仿真过程中 KEY_Scan()函数出现问题,
现象:哪一个if语句在前就运行哪一个,如果KEY0按键的判断在前就无法对界面进行切换,如果KEY1判断在前就只能进行界面切换,无法设置界面1的参数,但是单个运行都是可以的

修改:每次需对按键判断时,都提前先赋值给变量,然后就可以了
困扰了我一天了,虽然自己尝试解决了,但是不知其所以然,很困扰,希望哪位知道原因的能给解释一下,不胜感激

int main(void)
{
   
    u16 adc_i;
    u8 sys_window=1;
// u8 KEY_scan;//定义一个变量来存储KEY_Scan()函数的返回值
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);      //初始化延时函数
    uart_init(115200);        //初始化串口波特率为115200
   
    LED_Init();                      //初始化LED
     LCD_Init();           //初始化LCD FSMC接口
    Adc_Init();         //初始化ADC   
    KEY_Init();                    //初始化按键
    POINT_COLOR=RED;      //画笔颜色:红色
  BACK_COLOR = BLUE;

    LCD_Clear(WHITE);
   
    while(1)
    {
            adc_i = Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值,20次取平均               
          LCD_ShowWindow_1(adc_i);            //进入程序先显示界面1,               
      sys_window = 1;
//           KEY_scan = KEY_Scan(0);                //此处是将扫描的值提前赋给变量,不然会出错
            if(((KEY_scan(0))==1)&&(sys_window==1))                        //当按键B1按下,应该关闭LED报警功能
            {
                while(sys_window)
                {
                        LCD_ShowString(339,239,200,24,24,"LED:OFF ");   
                        KEY_scan = KEY_Scan(0);
                        if(( KEY_Scan(0))==1)      //当按键B1再次按下
                        {
                            break;
                        }
                        if(( KEY_Scan(0))==2)
                        {
                            sys_window=0;                        
                            break;
                        
                        }
                }

            }
            else if((( KEY_Scan(0))==2)&&(( KEY_Scan(0))!=1))    //如果按键B2按下
            {
                    LCD_Clear(WHITE);//清屏,方便下一步切换界面,注意:非叠加方式只对选中区域有清屏效果,不能实现对整个区域的清屏
                    while(1)
                    {

                                LCD_ShowWindow_2(00,00,00); //显示界面2,默认定时时间为00-00-00
//                                KEY_scan = KEY_Scan(0);
                                if(( KEY_Scan(0))==2)    //如果按键B2再一次按下
                                {
                                        LCD_Clear(WHITE);      //清屏,方便下一步切换界面
                                        break;                            //跳出第二层while循环,进入界面1
                                }   

                                else if(( KEY_Scan(0))==3) //如果按键B3按下,应该切换到时
                             {
                                 
/*                                 
                                     if(KEY_Scan(0)==3)     //如果按键B3再次按下,应该切换到分
                                     {
                                         
                                         if(KEY_Scan(0)==3)   //如果按键B3再次按下,应该切换到秒
                                         {
                                         
                                         }
                                         
                                     }
*/                                 

                             }

                     }
             }        


    }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-5-6 01:13:59 | 显示全部楼层
别定义一个和函数名字一样的变量。。。。
回复

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2020-6-3
在线时间
17 小时
发表于 2021-8-16 22:51:32 | 显示全部楼层
这里原子哥写的这个KEY_Scan函数是一次性的,只能使用一次,按键在扫描捕捉到之后,KEY_Scan函数就马上释放了,我之前写一个按键密码程序的时候也遇到过这种情况,第二次调用KEY_Scan时返回的是0,还得我按两次键才有效
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-28 03:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表