標(biāo)題: 單片機(jī)C語(yǔ)言按鍵功能切換有問(wèn)題,沒(méi)法實(shí)現(xiàn)兩種功能的多次切換 [打印本頁(yè)]

作者: spom    時(shí)間: 2023-5-10 11:49
標(biāo)題: 單片機(jī)C語(yǔ)言按鍵功能切換有問(wèn)題,沒(méi)法實(shí)現(xiàn)兩種功能的多次切換
#include <reg51.h>        

sbit led = P1^0;        
sbit speaker= P1^1;
sbit key = P2^1;


void main()               
{
        key = a;
        if(key == 1)
        {
        unsigned int delay;
        while(1){        
                led = 1;        
                speaker = 0;
                delay = 20000;
                while(delay--);               
                led = 0;
    speaker = 1;               
                delay = 20000;
                while(delay--);        
        }        
        }
        else
        {
                led = 0;
                speaker = 0;
  }
}



作者: 624353765    時(shí)間: 2023-5-10 14:33
用函數(shù)指針啊
作者: huxiaolin    時(shí)間: 2023-5-10 15:49
不知道你要實(shí)現(xiàn)什么功能,修改While條件判斷,防止按鍵按下之后進(jìn)入死循環(huán)。

void main()               
{
        key = a;
        if(key == 1)
        {
        unsigned int delay;
        led = 1;  

        delay = 20000;
       }
        else  //這里最好不要加什么判斷,因?yàn)閱纹瑱C(jī)都是死循環(huán)的,里面的值容易和后面的進(jìn)行互鎖
       {
               // led = 0;  
               // speaker = 0;
  }
        while(led ){
                speaker = 0;
                while(delay--);
       if(delay==0)
        {
            speaker=1;
            led=0;
            delay = 20000;
               }

               }

      while(speaker )
  {

while(delay--);
       if(delay==0)
            speaker=0;
               }

}


作者: huxiaolin    時(shí)間: 2023-5-10 15:51
按鍵切換建議自己標(biāo)定幾個(gè)狀態(tài)(變量),按下之后把KeyUp==1,然后用if(KeyUp==1){
作者: huxiaolin    時(shí)間: 2023-5-10 16:07
按鍵掃描的話很多例子,在網(wǎng)上可以搜搜。
比如很簡(jiǎn)單的:
定義按鍵狀態(tài):
u8 KeyUp=0;
u8 KeyDown=0;
假設(shè)需要觸發(fā)按鈕:
int Main()
{
unsigned int delay=20000;
sbit led = P1^0;        
sbit speaker= P1^1;
sbit key = P2^1;
  /***這里是外設(shè)初始化和時(shí)鐘初始化***/
  While(1)
  {
    if(KEY==1)
    {
        KeyDown=1;
        delay=20000;
    }
   else
   {
     KeyDown=0;
    /*這里清零狀態(tài),等等*/

   }

//執(zhí)行按鍵按下的動(dòng)作
  if(KEY==1&KeyDown==1)//一般這里增加消抖會(huì)好點(diǎn)
  {
     //這里添加要用的代碼,比如設(shè)置動(dòng)作等等
    led=1;點(diǎn)燈
    speaker = 0;
    //延時(shí);
   While(delay--);
  //關(guān)燈
    led=0;點(diǎn)燈    speaker = 1;
    delay=20000;
    While(delay--);

  }

  }

}

以上邏輯用在死等延時(shí),不死等延時(shí)的話重新考慮狀態(tài)即可;



作者: spom    時(shí)間: 2023-5-10 16:19
huxiaolin 發(fā)表于 2023-5-10 15:49
不知道你要實(shí)現(xiàn)什么功能,修改While條件判斷,防止按鍵按下之后進(jìn)入死循環(huán)。

void main()               ...

做的是一個(gè)接收信號(hào)做出反應(yīng)的報(bào)警裝置,仿真上就只能使用直接連接電源做模擬了,開(kāi)關(guān)部分就是信號(hào)輸入端,開(kāi)關(guān)按下就是有故障,要求是正常情況下無(wú)反應(yīng),開(kāi)關(guān)按下led閃爍,斷開(kāi)就還原成初始態(tài)。沒(méi)要求具體使用什么傳感器,仿真的模擬上就是直接給高電平,所以也不需要消抖那些。
作者: huxiaolin    時(shí)間: 2023-5-10 16:29
spom 發(fā)表于 2023-5-10 16:19
做的是一個(gè)接收信號(hào)做出反應(yīng)的報(bào)警裝置,仿真上就只能使用直接連接電源做模擬了,開(kāi)關(guān)部分就是信號(hào)輸入端 ...

按我后面給的那版試試,不要在else里面死鎖實(shí)時(shí)狀態(tài)。
作者: spom    時(shí)間: 2023-5-10 16:57
huxiaolin 發(fā)表于 2023-5-10 16:29
按我后面給的那版試試,不要在else里面死鎖實(shí)時(shí)狀態(tài)。

已解決了,代碼如下
我把按鍵值的檢測(cè)放到while語(yǔ)句里面,然后加個(gè)return避免卡在死循環(huán)里。
#include <reg51.h>       
#define uchar unsigned char
#define uint unsigned int

sbit led = P1^0;       
sbit speaker= P1^1;
sbit key = P2^1;


void main()               
{
        key=0;
        led=0;
        speaker=0;
        {
        unsigned int delay;
        while(1){       
                if(key == 1)
                {
                led = 1;       
                speaker = 0;
                delay = 20000;
                while(delay--);               
                led = 0;
    speaker = 1;               
                delay = 20000;
                while(delay--);       
                }
                return;
        }       
        }
}

作者: huxiaolin    時(shí)間: 2023-5-10 17:11
spom 發(fā)表于 2023-5-10 16:57
已解決了,代碼如下
我把按鍵值的檢測(cè)放到while語(yǔ)句里面,然后加個(gè)return避免卡在死循環(huán)里。
#include  ...

嗯嗯,裸機(jī)的話上電是循環(huán)執(zhí)行的,在While里面。你之前那種,初始化IO外設(shè)都沒(méi)執(zhí)行完,if是做不了判斷的;揪退罊C(jī)了。然后哪個(gè)return我沒(méi)搞懂吶,加了的話應(yīng)該也沒(méi)啥用,單片機(jī)主函數(shù)沒(méi)有用到返回值的,應(yīng)該不用的
作者: spom    時(shí)間: 2023-5-10 19:47
huxiaolin 發(fā)表于 2023-5-10 17:11
嗯嗯,裸機(jī)的話上電是循環(huán)執(zhí)行的,在While里面。你之前那種,初始化IO外設(shè)都沒(méi)執(zhí)行完,if是做不了判斷的 ...

沒(méi)return的話程序會(huì)卡在循環(huán)里面,因?yàn)榭紤]到?jīng)]收到信號(hào)(開(kāi)關(guān)斷開(kāi))的時(shí)候要恢復(fù)初始狀態(tài),如果說(shuō)手動(dòng)復(fù)位的話在題目的要求上感覺(jué)不太合理。甚至說(shuō)可以手動(dòng)復(fù)位的話最開(kāi)始的那串代碼就已經(jīng)能用了。
作者: spom    時(shí)間: 2023-5-10 19:50
huxiaolin 發(fā)表于 2023-5-10 17:11
嗯嗯,裸機(jī)的話上電是循環(huán)執(zhí)行的,在While里面。你之前那種,初始化IO外設(shè)都沒(méi)執(zhí)行完,if是做不了判斷的 ...

最開(kāi)始只考慮到閃爍的部分,那時(shí)候的想法是P2^!端口有兩個(gè)狀態(tài)嘛,一個(gè)低電平就是正常情況下,高電平就是工作狀態(tài),然后0態(tài)即初始態(tài)就是else部分,
作者: lkc8210    時(shí)間: 2023-5-11 10:35
零延時(shí),零等待








歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1