欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機按鍵程序看不懂,求解惑 從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://m.raoushi.com/bbs/) Powered by Discuz! X3.1