找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4498|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)按鍵程序看不懂,求解惑 從if(temp != 0)開始就看不懂了

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:724177 發(fā)表于 2020-5-7 15:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#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;//按鍵按下標(biāo)志位置1
            KeyNum=temp;//按鍵賦值 下一步等待釋放            
    }
    else
    {
        KeyOnFlag = 0;
    }
    if((KeyNum!=0)&&(KeyOnFlag==0))
    {
        temp = KeyNum;
        KeyNum = 0;
        return temp;
    }
    else
    {
        return 0;
    }
}
從if(temp != 0)開始就看不懂了,這個(gè)是按鍵控制子程序,求解答

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:517466 發(fā)表于 2020-5-7 16:55 | 只看該作者
從前面的代碼可以看出來,temp!=0,表示有按鍵被按下了,temp=1,表示按鍵1被按下,temp=2,表示按鍵2被按下。temp=0,表示沒有按鈕被按下。
回復(fù)

使用道具 舉報(bào)

板凳
ID:639106 發(fā)表于 2020-5-7 17:00 | 只看該作者
if(temp != 0) 是如果temp不等于0
回復(fù)

使用道具 舉報(bào)

地板
ID:311846 發(fā)表于 2020-5-7 17:09 | 只看該作者
有按鍵按下則改變temp的值,沒有則為0,三個(gè)按鍵對(duì)應(yīng)1-3,那么
if(temp != 0)//則表示按鍵有效,有按鍵按下不等于0,進(jìn)入判斷
    {
            KeyOnFlag=1;//按鍵按下標(biāo)志位置1
            KeyNum=temp;//按鍵賦值 下一步等待釋放            
    }
    else
    {
        KeyOnFlag = 0;//如果按鍵按下那么就進(jìn)入上面的程序,按鍵賦值給了KeyNum,KeyNum就保存了剛才的按鍵值,然后釋放了按鍵就會(huì)進(jìn)入此,將標(biāo)志位改為0
    }
    if((KeyNum!=0)&&(KeyOnFlag==0))//如果按鍵按下了,KeyNum就保存了按鍵值,那么就等于0,KeyOnFlag==0就是按鍵按下后釋放了按鍵他才等于0,則是有按鍵按下并釋放了就進(jìn)入此判斷
    {
        temp = KeyNum;//這里給他賦值temp,將按鍵值重新賦值給局部變量,局部變量每次進(jìn)入函數(shù)會(huì)清0
        KeyNum = 0;//讀取按鍵值后,將全局變量重新賦值為0,防止重復(fù)執(zhí)行
        return temp;//返回按鍵值
    }
    else
    {//如果沒按鍵按下就返回0
        return 0;
    }
}
夠詳細(xì)了吧!
回復(fù)

使用道具 舉報(bào)

5#
ID:724177 發(fā)表于 2020-5-7 20:52 | 只看該作者
權(quán)威人物 發(fā)表于 2020-5-7 17:09
有按鍵按下則改變temp的值,沒有則為0,三個(gè)按鍵對(duì)應(yīng)1-3,那么
if(temp != 0)//則表示按鍵有效,有按鍵按 ...

首先非常萬分感謝前輩仔細(xì)回答我的問題,其次我還有點(diǎn)疑問。按照你的思路如果有按鍵按下就會(huì)執(zhí)行KeyOnFlag=1;KeyNum=temp; else后面的語句( KeyOnFlag = 0)不就直接跳過了么,為啥說按鍵釋放了就執(zhí)行 KeyOnFlag = 0。其次 if((KeyNum!=0)&&(KeyOnFlag==0))我自己感覺本身不是矛盾了么,為什么會(huì)同時(shí)滿足?如果 KeyNum!=0,那么不就是KeyOnFlag==1,本人剛接觸c語言,單片機(jī),不是太懂,求解惑,謝謝
回復(fù)

使用道具 舉報(bào)

6#
ID:311846 發(fā)表于 2020-5-8 10:07 | 只看該作者
電子小白啊 發(fā)表于 2020-5-7 20:52
首先非常萬分感謝前輩仔細(xì)回答我的問題,其次我還有點(diǎn)疑問。按照你的思路如果有按鍵按下就會(huì)執(zhí)行KeyOnFla ...

唉!看來你程序運(yùn)行都不知道,你按鍵釋放了,程序還在跑動(dòng),是不是就可以進(jìn)入KeyOnFlag = 0了?那么 if((KeyNum!=0)&&(KeyOnFlag==0))這條件不就滿足了嗎?
回復(fù)

使用道具 舉報(bào)

7#
ID:70069 發(fā)表于 2020-5-8 10:22 | 只看該作者
設(shè)KEY3=0      
temp=3         
keyonflag=1   
keynum=3   
條件不滿足  
return 0         
設(shè)第二次進(jìn)入掃描
KEY1 KEY2 KEY3都是1
temp=0
keyonflag=0
keynum=3
此時(shí)滿足條件
temp=3
return temp=3
這段代碼就是如果KEYON=0檢測上升沿觸發(fā)。KEYON=1檢測下降沿觸發(fā)
回復(fù)

使用道具 舉報(bào)

8#
ID:724177 發(fā)表于 2020-5-9 15:12 | 只看該作者
benclee 發(fā)表于 2020-5-8 10:22
設(shè)KEY3=0      
temp=3         
keyonflag=1   

啊,原來是這樣,謝謝前輩指點(diǎn)。頭文件設(shè)置KEYON=0。原來時(shí)一直掃描調(diào)用的
回復(fù)

使用道具 舉報(bào)

9#
ID:724177 發(fā)表于 2020-5-9 15:15 | 只看該作者
權(quán)威人物 發(fā)表于 2020-5-8 10:07
唉!看來你程序運(yùn)行都不知道,你按鍵釋放了,程序還在跑動(dòng),是不是就可以進(jìn)入KeyOnFlag = 0了?那么 if(( ...

啊,我終于懂了,我的問題出在以為只會(huì)調(diào)用一次這個(gè)子程序,謝謝前輩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表