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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機定時器中斷掃描按鍵程序思路詳解

[復制鏈接]
跳轉到指定樓層
樓主
在使用按鍵的時候,為了消除按鍵抖動帶來的干擾,必須要對按鍵進行消抖處理。其中最常采用的方法是延時法,就是通過讓單片機等待一定的時間后,再進行按鍵狀態判斷。這種方法將導致主程序卡死,cpu在進行無意義的循環等待,為了提高單片機的工作效率,可以采用定時器中斷處理按鍵,可以很好的解決delay延時阻塞主程序的問題,并且可以很簡單的設置按下觸發或者是松手觸發。
制作出來的實物圖如下:


單片機定時器中斷處理按鍵思路:


STM32單片機主程序如下:
  1. int main()
  2. {        
  3. uint8_t i,temp=0;
  4. OLED_Init();
  5. Key_Init();//按鍵初始化
  6. OLED_ShowString(1,1,"KEY:");
  7. while(1)
  8. {
  9. i=KEY_ValueReturn();//獲取按鍵返回值
  10. if(i){temp=i;}
  11. OLED_ShowNum(1,5,temp,2);//顯示按鍵返回值
  12. if(i==2)//如果按鍵2按下,變量vol++
  13. {
  14. vol++;
  15. i=0;
  16. }
  17. if(i==3)//如果按鍵3按下,變量vol--
  18. {
  19. vol--;
  20. i=0;
  21. }
  22. OLED_ShowNum(4,1,vol,3);//顯示變量vol
  23. }
  24. }
復制代碼
簡單說一下定時器處理按鍵的思路,首先設置好TIM定時器中斷,在定時器中斷里進行判斷是否有按鍵按下,如果沒有按鍵按下,則一直返回0;如果按鍵按下,則和上一次的按鍵狀態作比較,條件成立則返回對應的按鍵值。比如上一次進入定時器中斷,讀取到的按鍵返回值為0,這一次按鍵返回值是1,則最終結果返回1;如果上一次中斷按鍵返回值是0,這次是按鍵2按下,則最終結果返回2,其他按鍵同理。由于定時器中斷是每隔一定的時間進行的,單片機采集的都是按鍵按下時候的瞬時狀態,這樣就避免了抖動帶來的干擾。

定時器中斷處理按鍵代碼如下:
  1. #include "stm32f10x.h"
  2. #include "delay.h"

  3. uint8_t KEY_Num,KEY_Value;
  4. static uint8_t KEY_LastState,KEY_NowState;

  5. uint8_t TEST_i;
  6. /****
  7.         *@brief 初始化按鍵
  8.         *@parameter 無
  9.         *@ReturnValue 無
  10.         */
  11. void Key_Init(void)
  12. {
  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 開啟GPIOB時鐘
  14.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//開啟TIM2時鐘
  15.         
  16.         GPIO_InitTypeDef GPIO_InitStructure;//GPIO初始化
  17.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
  18.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  19.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  20.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  21.         
  22.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//TIM2定時器初始化
  23.         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不對內部時鐘分頻
  24.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上計數模式
  25.         TIM_TimeBaseInitStructure.TIM_Period=20-1;
  26.         TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1
  27.         TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//通用定時器沒有重復計數器,設置為0
  28.         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
  29.         
  30.         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//打開TIM2的更新中斷
  31.         
  32.         TIM_InternalClockConfig(TIM2);//選擇內部時鐘源
  33.         
  34.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷分組
  35.         
  36.         NVIC_InitTypeDef NVIC_InitStructure;
  37.         NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
  38.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  39.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
  40.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
  41.         NVIC_Init(&NVIC_InitStructure);
  42.         
  43.         TIM_Cmd(TIM2,ENABLE);
  44. }

  45. uint8_t Test_return(void)
  46. {
  47.         return TEST_i;
  48. }
  49. /****
  50.         *@brief 判斷哪個按鍵被按下
  51.         *@parameter 無
  52.         *@ReturnValue 無
  53.         */
  54. uint8_t KEY_Numble(void)
  55. {
  56.         uint8_t i=0;
  57.         if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0) { i=1; }
  58.         if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==0) { i=2; }
  59.         if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0) { i=3; }
  60.         if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0) { i=4; }
  61.         TEST_i=i;
  62.         return i;
  63. }

  64. uint8_t KEY_ValueReturn(void)
  65. {
  66.         uint8_t i;
  67.         i=KEY_Value;
  68.         KEY_Value=0;
  69.         return i;
  70. }

  71. /****
  72.         *@brief //TIM2定時器中斷函數
  73.         *@parameter 無
  74.         *@ReturnValue 無
  75.         */
  76. void TIM2_IRQHandler(void)//TIM2定時器中斷函數
  77. {
  78.         KEY_LastState=KEY_NowState;
  79.         KEY_NowState=KEY_Numble();
  80.         
  81. //        if(KEY_LastState ==0 && KEY_NowState ==1)//按鍵按下時候觸發
  82. //        {
  83. //                KEY_Value=1;
  84. //        }
  85. //        if(KEY_LastState ==0 && KEY_NowState ==2)
  86. //        {
  87. //                KEY_Value=2;
  88. //        }
  89. //        if(KEY_LastState ==0 && KEY_NowState ==3)
  90. //        {
  91. //                KEY_Value=3;
  92. //        }
  93. //        if(KEY_LastState ==0 && KEY_NowState ==4)
  94. //        {
  95. //                KEY_Value=4;
  96. //        }
  97.         
  98.         if(KEY_LastState ==1 && KEY_NowState ==0)//按鍵松開時候觸發
  99.         {
  100.                 KEY_Value=1;
  101.         }
  102.         if(KEY_LastState ==2 && KEY_NowState ==0)
  103.         {
  104.                 KEY_Value=2;
  105.         }
  106.         if(KEY_LastState ==3 && KEY_NowState ==0)
  107.         {
  108.                 KEY_Value=3;
  109.         }
  110.         if(KEY_LastState ==4 && KEY_NowState ==0)
  111.         {
  112.                 KEY_Value=4;
  113.         }
  114.         
  115.         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
  116. }
復制代碼


Keil代碼下載: 定時器處理按鍵.7z (212.21 KB, 下載次數: 25)

評分

參與人數 2黑幣 +62 收起 理由
catlu + 12
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区在线观看 | 国产色网站 | 国产精品久久久久永久免费观看 | 欧美黑人一级爽快片淫片高清 | 黄色av网站免费看 | 欧美人妇做爰xxxⅹ性高电影 | 国产日韩在线观看一区 | 亚洲久久 | 日韩欧美在线观看 | 日韩欧美在线不卡 | 亚洲综合色视频在线观看 | 国产一级视频在线 | 国产精品国产三级国产aⅴ无密码 | 午夜精品一区二区三区在线视频 | 亚洲大片一区 | 韩日精品一区 | 亚洲有码转帖 | 国产一区不卡 | 亚洲精品一区二区三区免 | 亚洲www | 凹凸日日摸日日碰夜夜 | 国产成人精品一区二三区在线观看 | 91精品入口蜜桃 | 久久久不卡网国产精品一区 | 天天色天天 | 久久九九99| 在线国产一区二区三区 | 亚洲视频在线看 | 中文字幕亚洲欧美 | 欧美激情一区 | julia中文字幕久久一区二区 | 五月花丁香婷婷 | 欧美日产国产成人免费图片 | 91色视频在线观看 | 国产在线h | 国产1页 | 国产日韩一区二区三免费 | 色综合久 | 99久久国产综合精品麻豆 | 九九视频网 | 色噜噜狠狠色综合中国 |