久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 單片機C語言按鍵功能切換有問題,沒法實現兩種功能的多次切換 [打印本頁]

作者: spom    時間: 2023-5-10 11:49
標題: 單片機C語言按鍵功能切換有問題,沒法實現兩種功能的多次切換
#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    時間: 2023-5-10 14:33
用函數指針啊
作者: huxiaolin    時間: 2023-5-10 15:49
不知道你要實現什么功能,修改While條件判斷,防止按鍵按下之后進入死循環。

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

        delay = 20000;
       }
        else  //這里最好不要加什么判斷,因為單片機都是死循環的,里面的值容易和后面的進行互鎖
       {
               // 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    時間: 2023-5-10 15:51
按鍵切換建議自己標定幾個狀態(變量),按下之后把KeyUp==1,然后用if(KeyUp==1){
作者: huxiaolin    時間: 2023-5-10 16:07
按鍵掃描的話很多例子,在網上可以搜搜。
比如很簡單的:
定義按鍵狀態:
u8 KeyUp=0;
u8 KeyDown=0;
假設需要觸發按鈕:
int Main()
{
unsigned int delay=20000;
sbit led = P1^0;        
sbit speaker= P1^1;
sbit key = P2^1;
  /***這里是外設初始化和時鐘初始化***/
  While(1)
  {
    if(KEY==1)
    {
        KeyDown=1;
        delay=20000;
    }
   else
   {
     KeyDown=0;
    /*這里清零狀態,等等*/

   }

//執行按鍵按下的動作
  if(KEY==1&KeyDown==1)//一般這里增加消抖會好點
  {
     //這里添加要用的代碼,比如設置動作等等
    led=1;點燈
    speaker = 0;
    //延時;
   While(delay--);
  //關燈
    led=0;點燈    speaker = 1;
    delay=20000;
    While(delay--);

  }

  }

}

以上邏輯用在死等延時,不死等延時的話重新考慮狀態即可;



作者: spom    時間: 2023-5-10 16:19
huxiaolin 發表于 2023-5-10 15:49
不知道你要實現什么功能,修改While條件判斷,防止按鍵按下之后進入死循環。

void main()               ...

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

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

已解決了,代碼如下
我把按鍵值的檢測放到while語句里面,然后加個return避免卡在死循環里。
#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    時間: 2023-5-10 17:11
spom 發表于 2023-5-10 16:57
已解決了,代碼如下
我把按鍵值的檢測放到while語句里面,然后加個return避免卡在死循環里。
#include  ...

嗯嗯,裸機的話上電是循環執行的,在While里面。你之前那種,初始化IO外設都沒執行完,if是做不了判斷的。基本就死機了。然后哪個return我沒搞懂吶,加了的話應該也沒啥用,單片機主函數沒有用到返回值的,應該不用的
作者: spom    時間: 2023-5-10 19:47
huxiaolin 發表于 2023-5-10 17:11
嗯嗯,裸機的話上電是循環執行的,在While里面。你之前那種,初始化IO外設都沒執行完,if是做不了判斷的 ...

沒return的話程序會卡在循環里面,因為考慮到沒收到信號(開關斷開)的時候要恢復初始狀態,如果說手動復位的話在題目的要求上感覺不太合理。甚至說可以手動復位的話最開始的那串代碼就已經能用了。
作者: spom    時間: 2023-5-10 19:50
huxiaolin 發表于 2023-5-10 17:11
嗯嗯,裸機的話上電是循環執行的,在While里面。你之前那種,初始化IO外設都沒執行完,if是做不了判斷的 ...

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








歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日本在线黄色 | 羞羞的视频免费观看 | 精品欧美 | 欧美日韩不卡在线 | www久久久 | 偷拍自拍第一页 | 瑟瑟激情| 亚洲美乳中文字幕 | 亚洲一区二区三区在线免费 | 精品国产一区二区三区四区在线 | 亚洲一区二区三区四区五区中文 | 国产在线a视频 | 国产黄色一级电影 | 久久久久久久久久久久久久国产 | 亚洲成人久久久 | 久久国产婷婷国产香蕉 | 99热在线观看精品 | 亚洲二区在线 | 国产精品不卡视频 | 国产精品人人做人人爽 | 911精品国产 | 九九热在线免费观看 | 亚洲日日夜夜 | 一区二区免费看 | 久久久久久国产精品免费 | 电影午夜精品一区二区三区 | 中文字幕动漫成人 | 最新黄色在线观看 | 日韩精品 电影一区 亚洲 | 国产精品欧美一区二区三区不卡 | 亚洲vs天堂 | 国产精品综合一区二区 | 丁香色婷婷 | 国产一区二区三区四区五区加勒比 | 亚洲一区久久 | 日本亚洲欧美 | 国产不卡视频 | 亚洲视频免费 | 国产99久久精品一区二区永久免费 | 国产精品久久久久久久免费大片 | 欧美午夜精品 |