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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3909|回復: 22
收起左側

關于單片機C語言按鍵程序問題

[復制鏈接]
ID:777834 發表于 2020-9-7 21:39 來自觸屏版 | 顯示全部樓層 |閱讀模式
大家好呀,為何定義a=1時,下面if判斷a==0時,程序才能進去的,可為何定義a=1時,程序也能進得來的呢?想不通
IMG_20200907_213156.jpg
回復

使用道具 舉報

ID:332444 發表于 2020-9-7 22:11 | 顯示全部樓層
斷章取義?當按鈕沒按下時又賦值0因此可以通過判斷。
回復

使用道具 舉報

ID:777834 發表于 2020-9-7 22:30 來自觸屏版 | 顯示全部樓層
xianfajushi 發表于 2020-9-7 22:11
斷章取義?當按鈕沒按下時又賦值0因此可以通過判斷。

能詳細的說下嗎,謝謝
回復

使用道具 舉報

ID:511890 發表于 2020-9-8 00:38 | 顯示全部樓層
應該是變量名沖突或者靜態局部變量的問題吧。
一種可能是還有一個變量a的優先級優先于你設置的那個靜態變量。
另一種可能是這個靜態變量已經在別的地方被初始化過一次了,所以在這里,這個變量已經不能被再次初始化。相當于這條語句無用。
       不明白這里為啥要用static,一般情況下的局部變量如果沒有必要的話,最好讓程序本身去處理,而不用加上static。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:213173 發表于 2020-9-8 06:37 | 顯示全部樓層
這段按鍵代碼中位變量a不論初始定義為1或0,初次調用an_jian()時只要S1沒有按下就執行else a=0;,由于a是靜態變量,再次調用an_jian()時a值不變。假設先按住S1不放再加電,就執行不了LED1=~LED1;,必須松手以后再次按下才能執行LED1=~LED1;。但通常從加電到操作按鍵,an_jian()已經被調用了無數遍。這就是樓主感覺a不論初始定義為1或0都能正常工作的原因。
這段代碼的合理寫法:
void an_jian()
{
        static bit a=0;
        if(S1==0)
        {
                delays_2ms(15);
                if(S1==0 && a==0)
                {
                        a=1;
                        LED1=~LED1;
                }
        }
        else
        {
                a=0;
        }
}
回復

使用道具 舉報

ID:777834 發表于 2020-9-8 08:03 來自觸屏版 | 顯示全部樓層
幻劍心 發表于 2020-9-8 00:38
應該是變量名沖突或者靜態局部變量的問題吧。
一種可能是還有一個變量a的優先級優先于你設置的那個靜態變 ...

您好,謝謝您的回復先,不加static不行,試過了,沒有松手檢測
回復

使用道具 舉報

ID:777834 發表于 2020-9-8 08:25 來自觸屏版 | 顯示全部樓層
wulin 發表于 2020-9-8 06:37
這段按鍵代碼中位變量a不論初始定義為1或0,初次調用an_jian()時只要S1沒有按下就執行else a=0;,由于a是靜 ...

您好,首先謝謝你的回復,應該就是這樣的了,現在我在想可以在這個原基礎上改長按與短按的程序嗎,比如短按LED1亮,長按LED2亮,網上有用while(S1==0)作計數累加的,大于某個數就是長按,短于某個數就是短按,但是有個問題就是不松開就就不能執行其它的程序了,您看能不能改下,或寫下程序,我驗證下,謝謝啦,不能用定時中斷哦,我想看用其它的方法可不可以做到,謝謝啦
回復

使用道具 舉報

ID:213173 發表于 2020-9-8 11:34 | 顯示全部樓層
jianuli 發表于 2020-9-8 08:25
您好,首先謝謝你的回復,應該就是這樣的了,現在我在想可以在這個原基礎上改長按與短按的程序嗎,比如短 ...

給你一個簡單的長短按鍵示例參考,延時函數相當于其它應用程序所占時間,按鍵時間長短不影響其它程序運行,端口根據實際電路自行定義。
#include <reg51.H>
#define uchar unsigned char
#define uint unsigned int

sbit LED1=P3^0;                                        //LED1端口定義
sbit LED2=P3^1;                                        //LED2端口定義
sbit key =P3^2;                                        //開關端口定義       

/****1ms延時子程序(12MHz)****/
void delayms(uint k)
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=125;j>0;j--);
}
/******按鍵掃描程序*******/
void keyscan()
{
        static bit sign=0;                //長按標志
        static uint count=0;                //消抖、長短識別計數變量                       

        if(key==0)                                        //檢測按鍵如果按下
        {
                count++;
                if(count>500)
                        count=501;
                if(count==500)                        //長按0.5s                       
                {
                        sign=1;                          //長按標志置1
                        LED2=~LED2;
                }
        }
        else                                                //按鍵抬起
        {
                if(count>=10 && sign==0)//短按
                        LED1=~LED1;       
                count=0;                                //計數清0
                sign=0;                                //長按標志置清0
        }
}

void main()
{
        while(1)
        {
                keyscan();
                //其它任務
                delayms(1);//控制主循環周期約1ms
        }
}

回復

使用道具 舉報

ID:777834 發表于 2020-9-8 12:39 來自觸屏版 | 顯示全部樓層
wulin 發表于 2020-9-8 11:34
給你一個簡單的長短按鍵示例參考,延時函數相當于其它應用程序所占時間,按鍵時間長短不影響其它程序運行 ...

好的,謝謝啦,有空我驗證下,到時回復你
回復

使用道具 舉報

ID:777834 發表于 2020-9-8 14:33 來自觸屏版 | 顯示全部樓層
wulin 發表于 2020-9-8 11:34
給你一個簡單的長短按鍵示例參考,延時函數相當于其它應用程序所占時間,按鍵時間長短不影響其它程序運行 ...

您好呀,剛剛按你的程序試了下,發現短按時可以正常開與關,長按后,就死機一樣了,短按與長按都不行了,您看看是哪里的問題,謝謝啦
回復

使用道具 舉報

ID:777834 發表于 2020-9-8 14:34 來自觸屏版 | 顯示全部樓層
wulin 發表于 2020-9-8 11:34
給你一個簡單的長短按鍵示例參考,延時函數相當于其它應用程序所占時間,按鍵時間長短不影響其它程序運行 ...

圖片貼不上來
回復

使用道具 舉報

ID:328014 發表于 2020-9-8 15:15 | 顯示全部樓層

回帖上圖的方法:http://www.zg4o1577.cn/bbs/dpj-134340-1.html

手機版 點照相機按鈕可以直接上圖
回復

使用道具 舉報

ID:213173 發表于 2020-9-8 15:41 | 顯示全部樓層

這個程序雖然非常簡單,本著負責任的態度我還是用仿真軟件驗證無誤才發出的。你說長按后,就像死機一樣。我再次用TX-1C實驗板驗證,只改了端口定義,確定沒有任何問題。你仔細檢查你的硬件電路有沒有問題。為防止直接發代碼出錯,用專用代碼文字模式發。
  1. #include <reg51.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit LED1=P1^0;                 //LED1端口定義
  5. sbit LED2=P1^1;                 //LED2端口定義
  6. sbit key =P3^4;                 //開關端口定義        

  7. /****1ms延時子程序(11.0592MHz)****/
  8. void delayms(uint k)
  9. {
  10.         uint i,j;
  11.         for(i=k;i>0;i--)
  12.                 for(j=110;j>0;j--);
  13. }
  14. /******按鍵掃描程序*******/
  15. void keyscan()
  16. {
  17.         static bit sign=0;       //長按標志
  18.         static uint count=0;     //消抖、長短識別計數變量                        
  19.        
  20.         if(key==0)               //檢測按鍵如果按下
  21.         {
  22.                 count++;
  23.                 if(count>500)
  24.                         count=501;
  25.                 if(count==500)   //長按0.5s                        
  26.                 {
  27.                         sign=1;  //長按標志置1
  28.                         LED2=~LED2;
  29.                 }
  30.         }
  31.         else                         //按鍵抬起
  32.         {
  33.                 if(count>=10 && sign==0)//短按
  34.                         LED1=~LED1;        
  35.                 count=0;                   //計數清0
  36.                 sign=0;                   //長按標志置清0
  37.         }
  38. }

  39. void main()
  40. {
  41.         while(1)
  42.         {
  43.                 keyscan();
  44.                 //其它任務
  45.                 delayms(1);//控制主循環周期約1ms
  46.         }
  47. }
復制代碼




回復

使用道具 舉報

ID:123289 發表于 2020-9-8 15:44 | 顯示全部樓層
如果你能弄清楚,靜態變量在單片機中是如何存儲的,它放在哪里,你就明白。
主要是你對變量在單片機中是如何存儲的,未弄清楚。
回復

使用道具 舉報

ID:777834 發表于 2020-9-8 18:48 來自觸屏版 | 顯示全部樓層
yzwzfyz 發表于 2020-9-8 15:44
如果你能弄清楚,靜態變量在單片機中是如何存儲的,它放在哪里,你就明白。
主要是你對變量在單片機中是如 ...

您好,因為剛開始學單片機,所以很多知識點還沒弄懂,又因為是自學的,身邊沒人指導,所以很簡單的問題也要很久才能理解。
回復

使用道具 舉報

ID:777834 發表于 2020-9-8 18:55 來自觸屏版 | 顯示全部樓層
wulin 發表于 2020-9-8 15:41
這個程序雖然非常簡單,本著負責任的態度我還是用仿真軟件驗證無誤才發出的。你說長按后,就像死機一樣。 ...

您好,我再重寫一遍看看
回復

使用道具 舉報

ID:777834 發表于 2020-9-8 20:16 來自觸屏版 | 顯示全部樓層
wulin 發表于 2020-9-8 15:41
這個程序雖然非常簡單,本著負責任的態度我還是用仿真軟件驗證無誤才發出的。你說長按后,就像死機一樣。 ...

您好呀,是我自己寫錯了,不好意思啊,我寫成左邊這樣的,寫成右邊的才對,現在程序可以完美運行了,絲毫不影響其它程序的執行,能說說原理嗎,就是不太明白怎樣與while那里結合執行,謝謝啦,有點麻煩你了
IMG_20200908_200434.jpg
回復

使用道具 舉報

ID:89515 發表于 2020-9-8 22:02 來自觸屏版 | 顯示全部樓層
這樣做,程序太大。按鍵會卡卡的!!!而且不符合肖抖原理。學習下就好。
回復

使用道具 舉報

ID:777834 發表于 2020-9-8 22:09 來自觸屏版 | 顯示全部樓層
mengzhixinheng 發表于 2020-9-8 22:02
這樣做,程序太大。按鍵會卡卡的!!!而且不符合肖抖原理。學習下就好。

您好,是的,就當學習,如果while(1)中還有延時,那按鍵基本動不了,剛才試過,哈哈,如果while(1)中沒有延時的話就運行的很完美
回復

使用道具 舉報

ID:89515 發表于 2020-9-9 10:25 來自觸屏版 | 顯示全部樓層
jianuli 發表于 2020-9-8 22:09
您好,是的,就當學習,如果while(1)中還有延時,那按鍵基本動不了,剛才試過,哈哈,如果while(1)中沒有 ...

運行完美?你想多了,這樣寫,要運行完美,你必須精確控制每個函數的運行時間,做到嚴格的消抖。不然實際應用肯定不保險的!非要不用定時器中斷的話,你得學習一下程序輪詢的方法,不過相信我,不加時間片更麻煩。我感覺沒意義。
回復

使用道具 舉報

ID:146782 發表于 2020-9-9 10:35 | 顯示全部樓層
變量應該定義成局部變量
回復

使用道具 舉報

ID:777834 發表于 2020-9-9 12:19 來自觸屏版 | 顯示全部樓層
mengzhixinheng 發表于 2020-9-9 10:25
運行完美?你想多了,這樣寫,要運行完美,你必須精確控制每個函數的運行時間,做到嚴格的消抖。不然實際 ...

嗯,這樣寫法當作學習,謝謝指導
回復

使用道具 舉報

ID:777834 發表于 2020-9-28 22:08 來自觸屏版 | 顯示全部樓層
wulin 發表于 2020-9-8 15:41
這個程序雖然非常簡單,本著負責任的態度我還是用仿真軟件驗證無誤才發出的。你說長按后,就像死機一樣。 ...

您好呀,在這個程度基礎上想改按鍵釋放延時時間怎樣改,謝謝啦,指導一下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频二区 | 欧美精品在线免费 | 国产福利在线视频 | 另类在线 | 成人免费黄色片 | 国产探花在线精品一区二区 | 日本在线一区二区三区 | 韩日一区二区三区 | 国产大毛片 | 国产精品成人一区二区 | 伊人亚洲 | 伊人狠狠操 | 精品一区二区三区四区外站 | 玖玖在线免费视频 | 国产一区二区av | 美女黄18岁以下禁止观看 | 精产国产伦理一二三区 | 久久av一区 | 国产小视频在线 | 超碰91在线 | 亚洲精品久 | 999re5这里只有精品 | 国产成人小视频 | 久久久久国产一区二区三区 | 欧美精品在线免费观看 | 欧美中国少妇xxx性高请视频 | 超碰在线亚洲 | 久久精品国产久精国产 | 欧美日韩在线观看一区二区三区 | 国产小视频自拍 | 亚洲网址在线观看 | 久久久久久国产 | 亚洲精品高清视频在线观看 | 国产日韩一区二区 | 久久视频精品 | 国产福利免费视频 | 亚洲 欧美 日韩在线 | 日韩精品成人 | 视频在线h| 成人免费一区二区三区视频网站 | 日韩中文字幕一区二区 |