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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3641|回復: 15
打印 上一主題 下一主題
收起左側

關于單片機獨立按鍵程序分析 純屬新手分析的理論不知道對不對歡迎指正批評

[復制鏈接]
跳轉到指定樓層
樓主
首先非常感謝前面通過請教論壇師傅關于獨立按鍵按下后等待松開例程的原理,后自己又繼續研究其程序原理并且舉一反三
根據前面的原理自己又在鼓搗敲了個程序并且配合軟件調試單步運行似乎也可行。下面上程序:
       static uchar   loo_go=1;//按鍵松開檢測變量
       static uchar  KEY_NUM=0;//鍵值變量
        void key_scan()
        {
                if(k1!= loo_go)
                {
                        if loo_go==0)
                        {
                                KYE_NUM1=1;        
                        }
                         loo_go=k1;        
                }
        }

下面為本人分析此程序過程:
1:當按按鍵沒有按下時第一個if(k1!= loo_go)不成立所以不執行后面語句直接跳出并且把看k1原本的值賦值給按鍵松開檢測變量《這個值沒有發生改變
則認為按鍵沒有按下》 loo_go=k1;
2:當按鍵第一次被按下時第一個if(k1!= loo_go)條件成立k1此時不等于1《因為按鍵被按下為0姑且k1不是1而是0而成立》后執行它后面語句
繼續判斷第二個條件if (loo_go==0)此時按鍵松開檢測變量loo_go值不等于0《上面定義時默認為1》而不執行它后面語句直接跳出到loo_go=k1;此時
把k1的值賦值給按鍵松開檢測變量loo_go《這里的時因為是按鍵被按下k1為0所以按鍵松開檢測變量loo_go也為0》后退出按鍵掃描函數
3:在這里《假設按鍵第一次被按下后沒有松開的話當主循環再次進入到按鍵掃描函數后》
4:再開始判斷第一個if(k1!= loo_go)條件此時判斷條件已經改變而是要判斷按鍵不等于0時條件成立《此時因為上一次的按鍵按下后將 loo_go賦值為0所以判斷條件被改變》如果按鍵還不松開又直接跳出到loo_go=k1;此時
把k1的值賦值給按鍵松開檢測變量loo_go《這里的時因為是按鍵被按下k1為0所以按鍵松開檢測變量loo_go也為0》后退出按鍵掃描函數
5:《假設按鍵松開當主循環再次進入到按鍵掃描函數》
6:再進入掃描函數開始判第一個if(k1!= loo_go)條件此時判斷條件已經改變而是要判斷按鍵不等于0時條件成立
此時因為按鍵被松條件成立《因為一松開就等于1所以不等于0》后繼續執行后面語句進入到第二個條件if loo_go==0)此時條件時成立的《因為第一次按下時此 loo_go賦值為0并且保存所以條件成立》繼續執行下面語句將KYE_NUM1=1;鍵值變量賦值為1,《再出來把k1賦值給按鍵松開檢測變量loo_go因為按鍵已經松開k1為1此時loo_go也等于1》完成按鍵按下后和抬起的整個過程。
7:根據上述分析過程可認為按鍵按下并沒有給KYE_NUM1=1;鍵值變量賦值為1;而是按鍵抬起后才給賦完成了按鍵按下檢測和抬起檢測而且。
如有不對的地方歡迎各位論壇老師指證批評!!!!!!!!!!!!!!!!!!!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:390416 發表于 2021-1-24 21:50 | 只看該作者
51單片機獨立鍵盤的短按+長按 http://www.zg4o1577.cn/bbs/dpj-201806-1.html
回復

使用道具 舉報

板凳
ID:213173 發表于 2021-1-25 09:04 | 只看該作者
樓主的探索精神可嘉。這個程序從邏輯上看沒有問題,但用于實際電路就會發現響應慢和容易出錯。
1.因為鍵按下loo_go只記憶了操作行為,必須等按鍵松手后才能響應按鍵功能。
2.常用的按鍵等機械開關,在翻轉瞬間觸點是抖動不穩定的,會產生噪波,持續時間幾ms。為此需要外部硬件濾波或軟件消抖。所以此函數還要進一步完善。
但軟件消抖并不是在任何使用環境都必須的。如果按鍵掃描函數放在循環周期大于10ms的主函數或中斷函數中運行就不必消抖。給你一個獨立按鍵示例,非常簡單。看懂以后可以很方便的擴展成多按鍵,組合鍵,長短按鍵。
  1. #include<reg51.h>

  2. sbit key=P3^0;
  3. sbit LED=P1^0;

  4. unsigned char Temp;
  5. unsigned char Record;

  6. void key_scan()
  7. {
  8.         unsigned char ReadData = key ^ 0x01;
  9.         Temp = ReadData & (ReadData ^ Record);
  10.         if(Temp)LED=~LED;
  11.         Record = ReadData;
  12. }

  13. void main()
  14. {
  15.         while(1)
  16.         {
  17.                 key_scan();
  18.                 //延時10ms
  19.         }
  20. }
復制代碼

回復

使用道具 舉報

地板
ID:592807 發表于 2021-1-25 09:19 | 只看該作者
       static uchar   loo_go=1;//按鍵松開檢測變量
       static uchar  KEY_NUM=0;//鍵值變量
        void key_scan()
        {
                if(k1!= loo_go)
                {
                        if (loo_go==0)(這里缺個括號,給你補上)
                        {
                                KYE_NUM1=1;        
                        }
                         loo_go=k1;        
                }
        }if (loo_go==0)表示loo_go代表按下按鍵。
loo_go的定義是static uchar   loo_go=1;
也就是說開機后loo_go = 1;

k1 !=  1,表示按下按鍵那進入if(k1!= loo_go)判斷后
if (loo_go==0)這個判斷你仍然無法進入,而是直接執行下一條代碼loo_go=k1 ;

如此時不松開按鍵的話if(k1!= loo_go)這條判斷你也無法被再次觸發
因為此時loo_go=k1 = 0;
松開按鍵后if(k1!= loo_go)再次被觸發if (loo_go==0)也被觸發,完成KYE_NUM1=1 賦值。


這個如果非要說什么缺點就是必須要等按鍵松開才能觸發相應的功能,以及必須進入兩次以上按鍵掃描代碼才能完成賦值
還有就是有些按鍵按下后它的電平變化不是穩定的gnd或者vcc而是波浪形的,最好幾個延時防止誤觸發

回復

使用道具 舉報

5#
ID:871393 發表于 2021-1-25 12:48 | 只看該作者
我個人不建議把讀取按鍵狀態的函數宏定義成k1這種像變量名一樣的形式,
會讓人誤解k1是個變量, 好像由賦值語句獲取的,
這樣就會誤認為每次使用k1需要先k1=read(pin)賦一個新值,
而實際上卻是#define k1 read(pin), 很容易誤會,


我一般寫成#define read_k1() read(pin),
用的時候也是if(read_k1() == 0){}
讓讀者明白這句話是個函數過程, 而不是變量
回復

使用道具 舉報

6#
ID:232366 發表于 2021-1-26 14:57 | 只看該作者
77599585 發表于 2021-1-25 12:48
我個人不建議把讀取按鍵狀態的函數宏定義成k1這種像變量名一樣的形式,
會讓人誤解k1是個變量, 好像由賦值 ...

感謝糾正
回復

使用道具 舉報

7#
ID:232366 發表于 2021-1-26 15:02 | 只看該作者
黃youhui 發表于 2021-1-25 09:19
static uchar   loo_go=1;//按鍵松開檢測變量
       static uchar  KEY_NUM=0;//鍵值變量
       ...

感謝回復糾正后續會多加學習
回復

使用道具 舉報

8#
ID:232366 發表于 2021-1-26 15:06 | 只看該作者
wulin 發表于 2021-1-25 09:04
樓主的探索精神可嘉。這個程序從邏輯上看沒有問題,但用于實際電路就會發現響應慢和容易出錯。
1.因為鍵按 ...

非常感謝指正和耐心回復 和糾正!回復慢了一點因為前面帖子突然找不到的被不知道移哪去了
回復

使用道具 舉報

9#
ID:702386 發表于 2021-1-26 17:22 | 只看該作者
wulin 發表于 2021-1-25 09:04
樓主的探索精神可嘉。這個程序從邏輯上看沒有問題,但用于實際電路就會發現響應慢和容易出錯。
1.因為鍵按 ...

感謝分享。這種方法真的簡潔又好用。Record相當于記錄按鍵的狀態,按下后直到松開的整個區間都是1。Temp相當于一個trigger,只在按下后的第一次掃描時是1,確保一次按鍵周期內只執行一次動作。
回復

使用道具 舉報

10#
ID:412460 發表于 2021-1-27 12:18 | 只看該作者
  • static uchar  loo_go =1;    //按鍵狀態保存  
  • static uchar  key_value =0;  
  • static uchar  cnt = 0;      //去抖動  
  • void key_scan()  
  • {  
  •     uchar val_temp = 0;  
  •     val_temp = k1;              //使用臨時變量先保存IO狀態,因為IO是隨時可變的,不可控吧!  
  •                                 //例如:loo_go = val_temp;  之前的語句執行的過程中,IO剛好變了會有什么后果?   
  •     if(val_temp != loo_go)  
  •     {  
  •         if(++cnt >= 4)   //假如8ms掃描一次按鍵 32ms防抖時間很好,這是個經驗值吧  
  •         {  
  •             cnt = 0;  
  •             if(0 == loo_go)  
  •             {  
  •                 key_value = 1;   //松開鍵值  
  •             }  
  •             else  
  •             {  
  •                 key_value = 2;   //按下鍵值  
  •             }  
  •             loo_go = val_temp;  
  •         }  
  •     }  
  •     else  
  •     {  
  •         cnt = 0;  
  •     }  
  • }  

評分

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

查看全部評分

回復

使用道具 舉報

11#
ID:332444 發表于 2021-1-28 12:44 | 只看該作者
那么喜歡分析真好學,丟一個給你玩玩: void main()         //主函數 {   unsigned char aa=0,xd=0;         unsigned int i=0;         bit k=0; //        zdsz();         while(1)         {                 if(!k&&++xd==0&&k1==0)k=1;                 if(k&&++xd==0&&k2==0)k=0;                 if(k&&++i==0)                         QuDong595(aa++);         } }
回復

使用道具 舉報

12#
ID:332444 發表于 2021-1-28 12:48 | 只看該作者

回復

使用道具 舉報

13#
ID:232366 發表于 2021-1-28 14:06 來自觸屏版 | 只看該作者
DKC_LIN_123 發表于 2021-1-27 12:18
  • static uchar  loo_go =1;    //按鍵狀態保存  
  • static uchar  key_value =0;  [/bac ...

  • 感謝回復和建議
    回復

    使用道具 舉報

    14#
    ID:232366 發表于 2021-1-28 14:08 來自觸屏版 | 只看該作者
    xianfajushi 發表于 2021-1-28 12:44
    那么喜歡分析真好學,丟一個給你玩玩: void main()         //主函數 {   unsigned char aa=0,xd=0;         unsign ...

    感謝回復  和建議!
    回復

    使用道具 舉報

    15#
    ID:332444 發表于 2021-1-28 15:32 | 只看該作者
    因為今天剛好回復有關2個按鍵問題,本案例不待按鍵釋放.
    回復

    使用道具 舉報

    16#
    ID:232366 發表于 2021-1-28 18:15 來自觸屏版 | 只看該作者
    xianfajushi 發表于 2021-1-28 15:32
    因為今天剛好回復有關2個按鍵問題,本案例不待按鍵釋放.

    不知您的意思是?
    回復

    使用道具 舉報

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

    本版積分規則

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

    Powered by 單片機教程網

    快速回復 返回頂部 返回列表
    主站蜘蛛池模板: 国产精品久久久免费 | 一级毛片视频在线 | 在线成人免费视频 | 久久久免费电影 | 中文字幕黄色大片 | 一区二区成人 | 性高湖久久久久久久久 | 国产在线视频一区二区董小宛性色 | 欧美午夜精品久久久久免费视 | 中文字幕国产视频 | 亚洲第一天堂 | 日韩午夜电影在线观看 | 精品国产一区二区三区久久久蜜月 | 日韩 欧美 综合 | 国产美女特级嫩嫩嫩bbb片 | 久久精品一 | 日本二区 | 国产精品久久久久久福利一牛影视 | 久久亚洲国产精品 | 久久国产精品精品国产色婷婷 | 男人的天堂久久 | 午夜二区 | 中文字幕一区二区三区精彩视频 | 成人高清在线 | 伊人网一区 | 二区av| 成人免费在线观看 | 视频国产一区 | www精品美女久久久tv | 国产婷婷 | 日韩在线不卡 | 精品在线一区 | 在线婷婷 | 黑人精品欧美一区二区蜜桃 | 日本福利在线 | 亚洲国产精品va在线看黑人 | www.国产 | 国产 日韩 欧美 在线 | 国产99久久久久 | 亚洲第一视频网 | 91在线免费视频 |