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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3090|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)定時(shí)器中斷掃描按鍵程序思路詳解

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


單片機(jī)定時(shí)器中斷處理按鍵思路:


STM32單片機(jī)主程序如下:
  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. }
復(fù)制代碼
簡單說一下定時(shí)器處理按鍵的思路,首先設(shè)置好TIM定時(shí)器中斷,在定時(shí)器中斷里進(jìn)行判斷是否有按鍵按下,如果沒有按鍵按下,則一直返回0;如果按鍵按下,則和上一次的按鍵狀態(tài)作比較,條件成立則返回對應(yīng)的按鍵值。比如上一次進(jìn)入定時(shí)器中斷,讀取到的按鍵返回值為0,這一次按鍵返回值是1,則最終結(jié)果返回1;如果上一次中斷按鍵返回值是0,這次是按鍵2按下,則最終結(jié)果返回2,其他按鍵同理。由于定時(shí)器中斷是每隔一定的時(shí)間進(jìn)行的,單片機(jī)采集的都是按鍵按下時(shí)候的瞬時(shí)狀態(tài),這樣就避免了抖動帶來的干擾。

定時(shí)器中斷處理按鍵代碼如下:
  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時(shí)鐘
  14.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//開啟TIM2時(shí)鐘
  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定時(shí)器初始化
  23.         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不對內(nèi)部時(shí)鐘分頻
  24.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上計(jì)數(shù)模式
  25.         TIM_TimeBaseInitStructure.TIM_Period=20-1;
  26.         TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1
  27.         TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//通用定時(shí)器沒有重復(fù)計(jì)數(shù)器,設(shè)置為0
  28.         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
  29.         
  30.         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//打開TIM2的更新中斷
  31.         
  32.         TIM_InternalClockConfig(TIM2);//選擇內(nèi)部時(shí)鐘源
  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 判斷哪個(gè)按鍵被按下
  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定時(shí)器中斷函數(shù)
  73.         *@parameter 無
  74.         *@ReturnValue 無
  75.         */
  76. void TIM2_IRQHandler(void)//TIM2定時(shí)器中斷函數(shù)
  77. {
  78.         KEY_LastState=KEY_NowState;
  79.         KEY_NowState=KEY_Numble();
  80.         
  81. //        if(KEY_LastState ==0 && KEY_NowState ==1)//按鍵按下時(shí)候觸發(fā)
  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)//按鍵松開時(shí)候觸發(fā)
  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. }
復(fù)制代碼


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

評分

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

查看全部評分

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

使用道具 舉報(bào)

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久精品 | 欧洲色综合| 综合色播 | 91久久精品国产免费一区 | 欧美日韩在线成人 | 国产亚洲成av人片在线观看桃 | 国产午夜精品视频 | 久久久久久国产精品 | 天天精品在线 | 国产精品中文 | 久久不射电影网 | 可以在线观看av的网站 | 视频1区 | 精品久久久久久久久久 | 日韩成人免费av | 亚洲成人一级片 | 久久久久久久久久久久91 | 欧美一级观看 | 成人在线免费观看av | 色婷婷狠狠 | 欧美精品在线看 | 日韩精品中文字幕一区二区三区 | 国产一区二区免费 | 欧美精品在线免费观看 | 亚洲视频免费在线播放 | 欧美日本在线观看 | 免费中文字幕日韩欧美 | 免费视频一区二区 | 日本久久一区二区三区 | 96国产精品久久久久aⅴ四区 | 亚洲最大的黄色网址 | 黄色片视频免费 | 中文字幕第一页在线 | 久久6| 日本一区二区三区四区 | 成人免费精品视频 | 成人一区二区在线 | 国产一区 日韩 | 欧美黄视频| 精品亚洲国产成av人片传媒 | 青娱乐av |