自己剛剛學STM32一個禮拜,學完了GPIO,嘗試自己寫了按鍵的檢測,最簡單的單擊,
能準確的識別每一次,再到雙擊(其實多擊邏輯一樣),長按等復用模式。
這里提一下按鍵復用的思想:其實在做產品的時候,有復用思想可以節約按鍵,降低后期產品的PCB體積大小
具體的STM32實現的功能我簡述下,剛剛入門的萌新可以看下,寫的一般。
(1)環境復用:這個簡單,就是不同環境設置不同標志量即可
(2)組合復用:這里就是通過按兩次實現一個組合的效果,當然你寫復雜了有許多組合的效果,我這個小程序主要是在220ms內連續
按下兩次,PC13口連接的LED會閃爍2.5s,間隔是50ms。
(3)時間復用:就是長按,通過按鍵時間的長短實現不同功能。(長按復位,其中STM32的復位必須先關閉中斷,再調用NVIC中的復位函數
因為復位前有個延時,會影響復位的效果)
注:如果能用TIM(定時器)檢測按鍵,實現按鍵效果,更加perfect
萌新們一定要學會自己建立STM32工程喲
0.png (35.07 KB, 下載次數: 49)
下載附件
2019-2-16 03:32 上傳
這是我的通過按鍵來實現不同功能的燈亮的實驗。
1.主要用到GPIO輸入與輸出的技術。
2.按鍵的復用功能
(1).環境復用:這個簡單,不同標志下實現不同功能,這里就不做功能實現了。
(2).組合復用:連續兩次按鍵(220ms連續按兩次),實現Led亮滅2.5s,亮滅間隔為50ms。
(3).時間切換:單次按鍵實現的Led的亮滅,長按實現STM32MicroController系統的復位。
單片機源程序如下:
- #include <STM32F10X.H>
- #include <misc.h>
- #define PC14 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_14) //獨C14按鍵的值
- #define PC15_On GPIO_SetBits(GPIOC,GPIO_Pin_15) //Set是置1
- #define PC15_Off GPIO_ResetBits(GPIOC,GPIO_Pin_15) //Reset置0
- #define PC13_Off GPIO_SetBits(GPIOC,GPIO_Pin_13) //Set是置1
- #define PC13_On GPIO_ResetBits(GPIOC,GPIO_Pin_13) //Reset置0
- u16 Led_Count=0,Button_Flag=0,time=0;
- void RCC_Configuration(void); //復位與時鐘寄存器初始化函數
- void Delay_ms(u16 n); //延時函數ms
- void GPIO_Configuration(void); //通用IO口初始化函數
- void System_Reset(void); //系統復位函數
- void Led_Show(void); //Led亮滅顯示函數
- u16 Key_Mode(u16 time); //時間復用模式
- void Group_Button(void); //組合復用模式(雙擊,多擊鼠標的檢測函數)
- int main(void)
- {
- RCC_Configuration();
- GPIO_Configuration();
- while(1)
- {
- switch(Key_Mode(100))
- {
- case 0:break;
- case 1:Led_Show();break;
- case 2:System_Reset();break;
- default:break;
- }
- Group_Button();
- }
- }
-
- void RCC_Configuration(void)
- {
- SystemInit();
- }
- void Delay_ms(u16 n)
- {
- u16 i;
- while(n--)
- {
- i=12000;
- while(i--);
- }
- }
- void GPIO_Configuration(void)
- {
- //配置按鍵輸出的工作模式,同組的同類型一次配置,同組不同類型分次配置
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOC,&GPIO_InitStructure);
-
- //配置按鍵輸入的工作模式
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOC,&GPIO_InitStructure);
-
- PC15_Off;PC13_Off;
- }
- void System_Reset(void) //系統軟件復位函數
- {
- PC13_On;
- Delay_ms(500);
- __set_FAULTMASK(1); //首先先要關閉中斷
- NVIC_SystemReset(); //在進行軟復位
- }
- u16 Key_Mode(u16 time) //獨立按鍵函數
- {
- u16 i=0;
- if(PC14 == 0)
- {
- Delay_ms(10);
- if(PC14 == 0)
- {
- while(!PC14)
- {
- Delay_ms(10);i++;
- }
- Button_Flag++;
- }
- }
- if(i == 0)
- return 0;
- else
- {
- if(i < time)
- return 1;
- else
- return 2;
- }
- }
- void Led_Show(void)
- {
- Led_Count++;
- if(Led_Count == 1)
- PC15_On;
- else
- {
- PC15_Off;Led_Count=0;
- }
- }
- void Group_Button(void) //雙擊鼠標和多擊鼠標的模塊寫出來了,后期用定時器系統能干其他的事情
- { //其實單片機是單線程,所謂的中斷無非是效率更高,其實主程序仍不能干其他事情
- u16 i=0;
- if(Button_Flag == 1)
- {
- PC13_On;Delay_ms(1);time++;
- }
- else
- {
- Button_Flag = 0;PC13_Off;
- if(time < 220 && time > 5)
- {
- time = 0;
- for(i=0;i<50;i++)
- {
- if(i%2 == 0)
- {PC13_On;Delay_ms(50);}
- else
- {PC13_Off;Delay_ms(50);}
- }
- }
- else time = 0;
- }
- }
復制代碼
所有資料51hei提供下載:
DetectKey.7z
(191.26 KB, 下載次數: 26)
2019-2-16 03:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|