STM32中斷+定時(shí)器實(shí)現(xiàn)長按、短按(一)

項(xiàng)目,要實(shí)現(xiàn)長按、短按、還有多按,用按鍵來控制單片機(jī)開關(guān)機(jī),關(guān)機(jī)后進(jìn)入到睡眠低功耗,所以我將按鍵配置中斷,用中斷來喚醒睡眠,加上定時(shí)器完成長短按鍵,話不多說,開始進(jìn)入正題。(點(diǎn)擊此處黃色字體領(lǐng)取文中配套資料

單片機(jī)選擇STM32F103C8T6最小系統(tǒng)板

輕觸按鍵

在學(xué)習(xí)單片機(jī)時(shí),接觸最多的外設(shè)除了LED就是按鍵,所以按鍵的介紹就只是簡單說一下。

根據(jù)按鍵原理圖可知,GPIO引腳P0.0(PA0)、P0.1(PA1)、P5.2在沒有按鍵沒有按下時(shí)連接的是R5、R6、R8三個(gè)電阻接地線,所以在按鍵沒有按下時(shí)處于低電平,按鍵K4、K3、K2 == 0;至于二極管D2、D3是按鍵K3、K4應(yīng)用于影響按鍵K2的,不使用可以不用管。

當(dāng)按鍵K4按下時(shí),電源VDD接通經(jīng)過電阻R5到達(dá)地線GND,GPIO引腳P0.0可檢測到高電平,按鍵K4 == 1,

按鍵是高電平響應(yīng),代碼可以這這樣寫:

//#include "key.c" void KEY_Init(void) {
	GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO結(jié)構(gòu)體 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0引腳 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //輸出頻率 GPIO_Init(GPIOA, &GPIO_InitStructure); //結(jié)構(gòu)體配置完成初始化 } uint8_t KEY_Stare(void) 
{ static uint8_t key_state = 0;//按鍵狀態(tài)位 if(KEY_STATA && !key_state) { printf("key_ON\r\n");//按下按鍵 key_state = 1;
	} if(!KEY_STATA && key_state) { printf("KEY_OFF\r\n");//松開按鍵 key_state = 0;
	} return key_state;
} //#include "key.h" #define KEY_STATE	!!(GPIOA->IDR & 0x0001)//寄存器讀取按鍵狀態(tài)位 #define KEY_STATA	!!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)//標(biāo)準(zhǔn)庫讀取 void KEY_Init(void); uint8_t KEY_Stare(void);

如果讀者按鍵是低電平響應(yīng),只需要修改KEY_STATA的取反即可。

 //#include "key.c" void KEY_Init(void) {
	GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO結(jié)構(gòu)體 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0引腳 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //輸出頻率 GPIO_Init(GPIOA, &GPIO_InitStructure); //結(jié)構(gòu)體配置完成初始化 } uint8_t KEY_Stare(void) 
{ static uint8_t key_state = 0;//按鍵狀態(tài)位 if(!KEY_STATA && !key_state) {//此處修改即可 printf("key_ON\r\n");//按下按鍵 key_state = 1;
	} if(KEY_STATA && key_state) { printf("KEY_OFF\r\n");//松開按鍵 key_state = 0;
	} return key_state;
} //#include "key.h" #define KEY_STATE	!!(GPIOA->IDR & 0x0001)//寄存器讀取按鍵狀態(tài)位 #define KEY_STATA	!!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)//標(biāo)準(zhǔn)庫讀取 void KEY_Init(void); uint8_t KEY_Stare(void); 


定時(shí)器

選擇STM32F103C8T6的通用定時(shí)器TIM2。

點(diǎn)擊此處完整代碼可進(jìn)群免費(fèi)領(lǐng)?。。?!

嵌入式物聯(lián)網(wǎng)的學(xué)習(xí)之路非常漫長,不少人因?yàn)閷W(xué)習(xí)路線不對或者學(xué)習(xí)內(nèi)容不夠?qū)I(yè)而錯(cuò)失高薪offer。不過別擔(dān)心,我為大家整理了一份150多G的學(xué)習(xí)資源,基本上涵蓋了嵌入式物聯(lián)網(wǎng)學(xué)習(xí)的所有內(nèi)容。點(diǎn)擊下方鏈接,0元領(lǐng)取學(xué)習(xí)資源,讓你的學(xué)習(xí)之路更加順暢!記得點(diǎn)贊、關(guān)注、收藏、轉(zhuǎn)發(fā)哦!

the end

評論(0)