标题: 单片机按键程序看不懂,求解惑 从if(temp != 0)开始就看不懂了 [打印本页]

作者: 电子小白啊    时间: 2020-5-7 15:40
标题: 单片机按键程序看不懂,求解惑 从if(temp != 0)开始就看不懂了
#include "bsp_key.h"

unsigned char KeyNum=0;
bit KeyOnFlag=0;

void keyDelayUs2x(unsigned char t)
{   
while(--t);
}

unsigned char keyScan(void)
{
    unsigned char temp = 0;

    if(KEY1 == KEY_ON)
    {
        keyDelayUs2x(100);
        if(KEY1 == KEY_ON)
        {
            temp = 1;        
        }   
    }
    else if(KEY2 == KEY_ON)
    {
        keyDelayUs2x(100);
        if(KEY2 == KEY_ON)
        {
            temp = 2;        
        }   
    }
    else if(KEY3 == KEY_ON)
    {
        keyDelayUs2x(100);
        if(KEY3 == KEY_ON)
        {
            temp = 3;        
        }   
    }
    else
    {
        temp = 0;
    }
    if(temp != 0)
    {
            KeyOnFlag=1;//按键按下标志位置1
            KeyNum=temp;//按键赋值 下一步等待释放            
    }
    else
    {
        KeyOnFlag = 0;
    }
    if((KeyNum!=0)&&(KeyOnFlag==0))
    {
        temp = KeyNum;
        KeyNum = 0;
        return temp;
    }
    else
    {
        return 0;
    }
}
从if(temp != 0)开始就看不懂了,这个是按键控制子程序,求解答


作者: suncat0504    时间: 2020-5-7 16:55
从前面的代码可以看出来,temp!=0,表示有按键被按下了,temp=1,表示按键1被按下,temp=2,表示按键2被按下。temp=0,表示没有按钮被按下。
作者: gqzjl    时间: 2020-5-7 17:00
if(temp != 0) 是如果temp不等于0
作者: 权威人物    时间: 2020-5-7 17:09
有按键按下则改变temp的值,没有则为0,三个按键对应1-3,那么
if(temp != 0)//则表示按键有效,有按键按下不等于0,进入判断
    {
            KeyOnFlag=1;//按键按下标志位置1
            KeyNum=temp;//按键赋值 下一步等待释放            
    }
    else
    {
        KeyOnFlag = 0;//如果按键按下那么就进入上面的程序,按键赋值给了KeyNum,KeyNum就保存了刚才的按键值,然后释放了按键就会进入此,将标志位改为0
    }
    if((KeyNum!=0)&&(KeyOnFlag==0))//如果按键按下了,KeyNum就保存了按键值,那么就等于0,KeyOnFlag==0就是按键按下后释放了按键他才等于0,则是有按键按下并释放了就进入此判断
    {
        temp = KeyNum;//这里给他赋值temp,将按键值重新赋值给局部变量,局部变量每次进入函数会清0
        KeyNum = 0;//读取按键值后,将全局变量重新赋值为0,防止重复执行
        return temp;//返回按键值
    }
    else
    {//如果没按键按下就返回0
        return 0;
    }
}
够详细了吧!
作者: 电子小白啊    时间: 2020-5-7 20:52
权威人物 发表于 2020-5-7 17:09
有按键按下则改变temp的值,没有则为0,三个按键对应1-3,那么
if(temp != 0)//则表示按键有效,有按键按 ...

首先非常万分感谢前辈仔细回答我的问题,其次我还有点疑问。按照你的思路如果有按键按下就会执行KeyOnFlag=1;KeyNum=temp; else后面的语句( KeyOnFlag = 0)不就直接跳过了么,为啥说按键释放了就执行 KeyOnFlag = 0。其次 if((KeyNum!=0)&&(KeyOnFlag==0))我自己感觉本身不是矛盾了么,为什么会同时满足?如果 KeyNum!=0,那么不就是KeyOnFlag==1,本人刚接触c语言,单片机,不是太懂,求解惑,谢谢
作者: 权威人物    时间: 2020-5-8 10:07
电子小白啊 发表于 2020-5-7 20:52
首先非常万分感谢前辈仔细回答我的问题,其次我还有点疑问。按照你的思路如果有按键按下就会执行KeyOnFla ...

唉!看来你程序运行都不知道,你按键释放了,程序还在跑动,是不是就可以进入KeyOnFlag = 0了?那么 if((KeyNum!=0)&&(KeyOnFlag==0))这条件不就满足了吗?

作者: benclee    时间: 2020-5-8 10:22
设KEY3=0      
temp=3         
keyonflag=1   
keynum=3   
条件不满足  
return 0         
设第二次进入扫描
KEY1 KEY2 KEY3都是1
temp=0
keyonflag=0
keynum=3
此时满足条件
temp=3
return temp=3
这段代码就是如果KEYON=0检测上升沿触发。KEYON=1检测下降沿触发
作者: 电子小白啊    时间: 2020-5-9 15:12
benclee 发表于 2020-5-8 10:22
设KEY3=0      
temp=3         
keyonflag=1   

啊,原来是这样,谢谢前辈指点。头文件设置KEYON=0。原来时一直扫描调用的
作者: 电子小白啊    时间: 2020-5-9 15:15
权威人物 发表于 2020-5-8 10:07
唉!看来你程序运行都不知道,你按键释放了,程序还在跑动,是不是就可以进入KeyOnFlag = 0了?那么 if(( ...

啊,我终于懂了,我的问题出在以为只会调用一次这个子程序,谢谢前辈




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1