找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3747|回复: 8
打印 上一主题 下一主题
收起左侧

单片机按键程序看不懂,求解惑 从if(temp != 0)开始就看不懂了

[复制链接]
跳转到指定楼层
楼主
ID:724177 发表于 2020-5-7 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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)开始就看不懂了,这个是按键控制子程序,求解答

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:517466 发表于 2020-5-7 16:55 | 只看该作者
从前面的代码可以看出来,temp!=0,表示有按键被按下了,temp=1,表示按键1被按下,temp=2,表示按键2被按下。temp=0,表示没有按钮被按下。
回复

使用道具 举报

板凳
ID:639106 发表于 2020-5-7 17:00 | 只看该作者
if(temp != 0) 是如果temp不等于0
回复

使用道具 举报

地板
ID:311846 发表于 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;
    }
}
够详细了吧!
回复

使用道具 举报

5#
ID:724177 发表于 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语言,单片机,不是太懂,求解惑,谢谢
回复

使用道具 举报

6#
ID:311846 发表于 2020-5-8 10:07 | 只看该作者
电子小白啊 发表于 2020-5-7 20:52
首先非常万分感谢前辈仔细回答我的问题,其次我还有点疑问。按照你的思路如果有按键按下就会执行KeyOnFla ...

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

使用道具 举报

7#
ID:70069 发表于 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检测下降沿触发
回复

使用道具 举报

8#
ID:724177 发表于 2020-5-9 15:12 | 只看该作者
benclee 发表于 2020-5-8 10:22
设KEY3=0      
temp=3         
keyonflag=1   

啊,原来是这样,谢谢前辈指点。头文件设置KEYON=0。原来时一直扫描调用的
回复

使用道具 举报

9#
ID:724177 发表于 2020-5-9 15:15 | 只看该作者
权威人物 发表于 2020-5-8 10:07
唉!看来你程序运行都不知道,你按键释放了,程序还在跑动,是不是就可以进入KeyOnFlag = 0了?那么 if(( ...

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

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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