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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于單片機獨立按鍵程序調試

[復制鏈接]
跳轉到指定樓層
樓主
而我改的就很多問題,按一下可能亮可能滅。
   明明也加了,消抖,如果加while(!KEY1)  的話,就沒什么問題了,這個的思路就是按鍵沒有釋放,就一直等,釋放后再做一個消抖即可。

   問題是普中的程序也沒有等待按鍵彈起的動作呀,而且彈起來后面的消抖也沒有處理,但是但是但是他們的程序就是特別好用。

單片機源程序如下:
  1. /**************************************************************************************
  2. 實驗名稱:獨立按鍵實驗
  3. 接線說明:        
  4. 實驗現象:下載程序后,按下“獨立按鍵”模塊中K1鍵,控制D1指示燈亮滅
  5. 注意事項:                                                                                                                                                                  
  6. ***************************************************************************************/
  7. #include "reg52.h"

  8. typedef unsigned int u16;        //對系統默認數據類型進行重定義
  9. typedef unsigned char u8;

  10. //定義獨立按鍵控制腳
  11. sbit KEY1=P3^1;
  12. sbit KEY2=P3^0;
  13. sbit KEY3=P3^2;
  14. sbit KEY4=P3^3;

  15. //定義LED1控制腳
  16. sbit LED1=P2^0;
  17. sbit LED2=P2^1;
  18. sbit LED3=P2^2;
  19. sbit LED4=P2^3;

  20. //使用宏定義獨立按鍵按下的鍵值
  21. #define KEY1_PRESS        1
  22. #define KEY2_PRESS        2
  23. #define KEY3_PRESS        3
  24. #define KEY4_PRESS        4
  25. #define KEY_UNPRESS        0        

  26. /*******************************************************************************
  27. * 函 數 名       : delay_10us
  28. * 函數功能                 : 延時函數,ten_us=1時,大約延時10us
  29. * 輸    入       : ten_us
  30. * 輸    出             : 無
  31. *******************************************************************************/
  32. void delay_10us(u16 ten_us)
  33. {
  34.         while(ten_us--);        
  35. }

  36. /*******************************************************************************
  37. * 函 數 名       : key_scan
  38. * 函數功能                 : 檢測獨立按鍵是否按下,按下則返回對應鍵值
  39. * 輸    入       : mode=0:單次掃描按鍵
  40.                                            mode=1:連續掃描按鍵
  41. * 輸    出             : KEY1_PRESS:K1按下
  42.                                    KEY2_PRESS:K2按下
  43.                                    KEY3_PRESS:K3按下
  44.                                    KEY4_PRESS:K4按下
  45.                                    KEY_UNPRESS:未有按鍵按下
  46. 假設我們傳的參是1,然后我的手按著按鍵不松開,
  47. 然后程序一直重復進這個函數,是不是每次都進if的判斷,
  48. 是不是每次進都會返回那個鍵值**********
  49. 假設我們傳的參是0,然后我的手按著按鍵不松開,
  50. 但是程序即使重復進這個函數,是不是每次都進不去if的判斷,
  51. 是不是就只會返回一次鍵值*************************
  52. *******************************************************************************/
  53. u8 key_scan(u8 mode)

  54. {
  55.         static u8 key=1;

  56.         if(mode)key=1;//連續掃描按鍵
  57.         if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//任意按鍵按下
  58.         {
  59.                 delay_10us(1000);//消抖
  60.                 key=0;  //
  61.                 if(KEY1==0)
  62.                         return KEY1_PRESS;
  63.                 else if(KEY2==0)
  64.                         return KEY2_PRESS;
  65.                 else if(KEY3==0)
  66.                         return KEY3_PRESS;
  67.                 else if(KEY4==0)
  68.                         return KEY4_PRESS;        
  69.         }
  70.         else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)        //無按鍵按下
  71.         {
  72.                 key=1;                        
  73.         }
  74.         return KEY_UNPRESS;               
  75. }
  76. /*******************************************************************************
  77. * 函 數 名       : main
  78. * 函數功能                 : 主函數
  79. * 輸    入       : 無
  80. * 輸    出             : 無
  81. *******************************************************************************/
  82. void main()
  83. {        
  84.         u8 key=0;

  85.         while(1)
  86.         {
  87.                    key=key_scan(0);
  88.                 if(key==KEY1_PRESS)//檢測按鍵K1是否按下
  89.                         LED1=!LED1;//LED1狀態翻轉        
  90.                 if(key==KEY2_PRESS)
  91.                         LED2=!LED2;
  92.                 if(key==KEY3_PRESS)
  93.                         LED3=!LED3;
  94.                 if(key==KEY4_PRESS)
  95.                         LED4=!LED4;
  96.         }               
  97. }
復制代碼
為什么這個程序就可以呢?

  1. /**************************************************************************************

  2. 實驗名稱:獨立按鍵實驗
  3. 接線說明:        
  4. 實驗現象:下載程序后,按下“獨立按鍵”模塊中K1鍵,控制D1指示燈亮滅
  5. 注意事項:                                                                                                                                                                  
  6. ***************************************************************************************/
  7. #include "reg52.h"

  8. typedef unsigned int u16;        //對系統默認數據類型進行重定義
  9. typedef unsigned char u8;

  10. //定義獨立按鍵控制腳
  11. sbit KEY1=P3^1;
  12. sbit KEY2=P3^0;
  13. sbit KEY3=P3^2;
  14. sbit KEY4=P3^3;

  15. //定義LED1控制腳
  16. sbit LED1=P2^0;

  17. //使用宏定義獨立按鍵按下的鍵值
  18. #define KEY1_PRESS        1
  19. #define KEY2_PRESS        2
  20. #define KEY3_PRESS        3
  21. #define KEY4_PRESS        4
  22. #define KEY_UNPRESS        0        

  23. /*******************************************************************************
  24. * 函 數 名       : delay_10us
  25. * 函數功能                 : 延時函數,ten_us=1時,大約延時10us
  26. * 輸    入       : ten_us
  27. * 輸    出             : 無
  28. *******************************************************************************/
  29. void delay_10us(u16 ten_us)
  30. {
  31.         while(ten_us--);        
  32. }

  33. /*******************************************************************************
  34. * 函 數 名       : key_scan
  35. * 函數功能                 : 檢測獨立按鍵是否按下,按下則返回對應鍵值
  36. * 輸    入       : mode=0:單次掃描按鍵
  37.                                            mode=1:連續掃描按鍵
  38. * 輸    出             : KEY1_PRESS:K1按下
  39.                                    KEY2_PRESS:K2按下
  40.                                    KEY3_PRESS:K3按下
  41.                                    KEY4_PRESS:K4按下
  42.                                    KEY_UNPRESS:未有按鍵按下
  43. *******************************************************************************/
  44. u8 key_scan(void)

  45. {

  46.         if(KEY1==0||KEY2==0||KEY3==0||KEY4==0)//任意按鍵按下
  47.         {
  48.                 delay_10us(1000);//消抖
  49.                 if(KEY1==0)
  50.                         return KEY1_PRESS;
  51.                 else if(KEY2==0)
  52.                         return KEY2_PRESS;
  53.                 else if(KEY3==0)
  54.                         return KEY3_PRESS;
  55.                 else if(KEY4==0)
  56.                         return KEY4_PRESS;        
  57. //                else
  58. //                        return KEY_UNPRESS;
  59.         }
  60. //        else
  61.           return KEY_UNPRESS;               
  62. }
  63. /*******************************************************************************
  64. * 函 數 名       : main
  65. * 函數功能                 : 主函數
  66. * 輸    入       : 無
  67. * 輸    出             : 無
  68. *******************************************************************************/
  69. void main()
  70. {        
  71.         u8 key=0;

  72.         while(1)
  73.         {
  74.                 if(KEY1==0||KEY2==0||KEY3==0||KEY4==0)//任意按鍵按下
  75.                 {
  76.                         key=key_scan();
  77.                   if(key==KEY1_PRESS)//檢測按鍵K1是否按下
  78.                         LED1=!LED1;//LED1狀態翻轉
  79.                         delay_10us(1000);//消抖
  80.     }                        
  81.         }               
  82. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:275826 發表于 2023-12-20 17:47 | 只看該作者
關鍵的東西被你改沒了呀
回復

使用道具 舉報

板凳
ID:161164 發表于 2023-12-20 22:57 | 只看該作者
重點

回復

使用道具 舉報

地板
ID:1064915 發表于 2023-12-21 08:48 | 只看該作者

具體說明一下,錯誤原因
回復

使用道具 舉報

5#
ID:161164 發表于 2023-12-21 09:02 | 只看該作者
joyb 發表于 2023-12-21 08:48
具體說明一下,錯誤原因

例程用了一個變量來記錄按鍵情況
并用來判斷
按過一次就不再進入
直到沒鍵按下
回復

使用道具 舉報

6#
ID:1064915 發表于 2023-12-21 10:27 | 只看該作者
lkc8210 發表于 2023-12-21 09:02
例程用了一個變量來記錄按鍵情況
并用來判斷
按過一次就不再進入

暫時沒有理解
這兩個程序用普中學習板試驗了,都能用,沒有出問題
回復

使用道具 舉報

7#
ID:1091094 發表于 2023-12-21 10:54 | 只看該作者
tyrl800 發表于 2023-12-20 17:47
關鍵的東西被你改沒了呀

是的  后來我又仔細看了  原來ELSE if部分起到的作用,還有等待按鍵彈起來的作用,按鍵不彈起就不會進入else if ,就不會再次執行key=1。
回復

使用道具 舉報

8#
ID:1091094 發表于 2023-12-21 11:01 | 只看該作者
lkc8210 發表于 2023-12-21 09:02
例程用了一個變量來記錄按鍵情況
并用來判斷
按過一次就不再進入

是的  理解得透徹,我理解了,但是沒有你這么透徹
回復

使用道具 舉報

9#
ID:1091094 發表于 2023-12-21 11:04 | 只看該作者
joyb 發表于 2023-12-21 10:27
暫時沒有理解
這兩個程序用普中學習板試驗了,都能用,沒有出問題

怎么可能,那你按久一點試一下,一直按著肯定會功能錯亂的,他會不停地進入按鍵掃描程序,導致LED的狀態會不斷翻轉的
回復

使用道具 舉報

10#
ID:1091094 發表于 2023-12-21 11:09 | 只看該作者
tyrl800 發表于 2023-12-20 17:47
關鍵的東西被你改沒了呀

是的  理解得不透徹的緣故
回復

使用道具 舉報

11#
ID:517951 發表于 2023-12-23 07:54 | 只看該作者
delay_10us(1000);//消抖 這種延時消抖方法要改進, 這個延時過程中單片機可以跑幾千幾萬條指令了.
回復

使用道具 舉報

12#
ID:1101997 發表于 2023-12-23 14:01 | 只看該作者
一般來說,這種按鍵處理程序是學生做的,在系統中,像樓上說的那樣不能死等,畢竟系統中不僅僅就一個任務,第二要做到按鍵掃描和按鍵讀取分離,一個夸張一點的例子,今天掃描到的按鍵,明天去使用也不應該有丟失或者重復的問題,也就是要做到不同模塊之間解耦合。
有的人其實沒學過幾天系統,也沒寫過幾行程序,就能斷言別人的程序如何如何,遠離他們。
多看看高手程序,讀讀數據結構和軟件工程。
回復

使用道具 舉報

13#
ID:1091094 發表于 2023-12-23 17:19 | 只看該作者
rayin 發表于 2023-12-23 07:54
delay_10us(1000);//消抖 這種延時消抖方法要改進, 這個延時過程中單片機可以跑幾千幾萬條指令了.

這還算好了,我的是
  1. if(key==0)
  2. {
  3.   delay_10us(1000);
  4.   if(key==0)
  5.     {
  6.        //執行需要的操作
  7.      }

  8. 真正的一直在死等。

  9. 如果改進的話,思路是什么,可以說說嗎?
  10.    while(key==0)
  11.       ;
  12.    delay_10us(1000);
  13. }
復制代碼
回復

使用道具 舉報

14#
ID:1091094 發表于 2023-12-23 17:25 | 只看該作者
nearsea 發表于 2023-12-23 14:01
一般來說,這種按鍵處理程序是學生做的,在系統中,像樓上說的那樣不能死等,畢竟系統中不僅僅就一個任務, ...

你說的應該是系統的思維,現在還沒接觸過系統(RTOS 什么實時系統之類的),
   但是我感覺:如果在按鍵掃描程序后面還有一些程序,如果程序的時間過長的話,那么你按鍵的時候,單片機沒有在執行這個按鍵掃描程序的話,那么你這個按鍵就無效了,相當于BUG了吧
回復

使用道具 舉報

15#
ID:1107339 發表于 2023-12-31 21:35 | 只看該作者
編程時應多考慮任務之間的協同。
回復

使用道具 舉報

16#
ID:1107339 發表于 2024-1-1 15:53 | 只看該作者
key按下后,直接等待x毫秒,然后再讀是否有數據即可,等待時間要通過測試來進行確定,一般150ms可以。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表