|
在使用按鍵的時(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í)物圖如下:
51hei圖片_20221208190228.jpg (278.78 KB, 下載次數(shù): 45)
下載附件
2022-12-8 19:02 上傳
單片機(jī)定時(shí)器中斷處理按鍵思路:
屏幕截圖(364).png (35.46 KB, 下載次數(shù): 53)
下載附件
2022-12-8 16:57 上傳
STM32單片機(jī)主程序如下:
- int main()
- {
- uint8_t i,temp=0;
- OLED_Init();
- Key_Init();//按鍵初始化
- OLED_ShowString(1,1,"KEY:");
- while(1)
- {
- i=KEY_ValueReturn();//獲取按鍵返回值
- if(i){temp=i;}
- OLED_ShowNum(1,5,temp,2);//顯示按鍵返回值
- if(i==2)//如果按鍵2按下,變量vol++
- {
- vol++;
- i=0;
- }
- if(i==3)//如果按鍵3按下,變量vol--
- {
- vol--;
- i=0;
- }
- OLED_ShowNum(4,1,vol,3);//顯示變量vol
- }
- }
復(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í)器中斷處理按鍵代碼如下:
- #include "stm32f10x.h"
- #include "delay.h"
- uint8_t KEY_Num,KEY_Value;
- static uint8_t KEY_LastState,KEY_NowState;
- uint8_t TEST_i;
- /****
- *@brief 初始化按鍵
- *@parameter 無
- *@ReturnValue 無
- */
- void Key_Init(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 開啟GPIOB時(shí)鐘
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//開啟TIM2時(shí)鐘
-
- GPIO_InitTypeDef GPIO_InitStructure;//GPIO初始化
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
-
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//TIM2定時(shí)器初始化
- TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不對內(nèi)部時(shí)鐘分頻
- TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上計(jì)數(shù)模式
- TIM_TimeBaseInitStructure.TIM_Period=20-1;
- TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1
- TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//通用定時(shí)器沒有重復(fù)計(jì)數(shù)器,設(shè)置為0
- TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
-
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//打開TIM2的更新中斷
-
- TIM_InternalClockConfig(TIM2);//選擇內(nèi)部時(shí)鐘源
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷分組
-
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
- NVIC_Init(&NVIC_InitStructure);
-
- TIM_Cmd(TIM2,ENABLE);
- }
- uint8_t Test_return(void)
- {
- return TEST_i;
- }
- /****
- *@brief 判斷哪個(gè)按鍵被按下
- *@parameter 無
- *@ReturnValue 無
- */
- uint8_t KEY_Numble(void)
- {
- uint8_t i=0;
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0) { i=1; }
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==0) { i=2; }
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0) { i=3; }
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0) { i=4; }
- TEST_i=i;
- return i;
- }
- uint8_t KEY_ValueReturn(void)
- {
- uint8_t i;
- i=KEY_Value;
- KEY_Value=0;
- return i;
- }
- /****
- *@brief //TIM2定時(shí)器中斷函數(shù)
- *@parameter 無
- *@ReturnValue 無
- */
- void TIM2_IRQHandler(void)//TIM2定時(shí)器中斷函數(shù)
- {
- KEY_LastState=KEY_NowState;
- KEY_NowState=KEY_Numble();
-
- // if(KEY_LastState ==0 && KEY_NowState ==1)//按鍵按下時(shí)候觸發(fā)
- // {
- // KEY_Value=1;
- // }
- // if(KEY_LastState ==0 && KEY_NowState ==2)
- // {
- // KEY_Value=2;
- // }
- // if(KEY_LastState ==0 && KEY_NowState ==3)
- // {
- // KEY_Value=3;
- // }
- // if(KEY_LastState ==0 && KEY_NowState ==4)
- // {
- // KEY_Value=4;
- // }
-
- if(KEY_LastState ==1 && KEY_NowState ==0)//按鍵松開時(shí)候觸發(fā)
- {
- KEY_Value=1;
- }
- if(KEY_LastState ==2 && KEY_NowState ==0)
- {
- KEY_Value=2;
- }
- if(KEY_LastState ==3 && KEY_NowState ==0)
- {
- KEY_Value=3;
- }
- if(KEY_LastState ==4 && KEY_NowState ==0)
- {
- KEY_Value=4;
- }
-
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
- }
復(fù)制代碼
Keil代碼下載:
定時(shí)器處理按鍵.7z
(212.21 KB, 下載次數(shù): 25)
2022-12-8 18:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|