STM32的按鍵檢測相對比較簡單,首先按部就班的初始化連接的到的i/o,然后寫一個按鍵掃描函數(shù),這個和51單片機的差不多。
以下是一個比較典型的例子:
利用按鍵控制LED:
key.h文件
#ifndef__KEY_H
#define__KEY_H
#include"sys.h“
#defineKEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//讀取按鍵0
#defineKEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//讀取按鍵1
#defineKEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//讀取按鍵2
#defineKEY3 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//讀取按鍵3(WK_UP)
#defineKEY_UP 4
#defineKEY_LEFT 3
#defineKEY_DOWN 2
#defineKEY_RIGHT 1
void KEY_Init(void);//IO初始化
u8 KEY_Scan(u8); //按鍵掃描函數(shù)
#endif
key.c文件
void KEY_Init(void)//IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
//初始化KEY0-->GPIOA.13,KEY1-->GPIOA.15 上拉輸入
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//PE2~4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設置成上拉輸入
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;初始化 WK_UP-->GPIOA.0 下拉輸入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//PA0設置成輸入,默認下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
}
u8 KEY_Scan(u8mode)
{ static u8 key_up=1;//按鍵按松開標志
if(mode)key_up=1;//支持連按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))
{
delay_ms(10);//去抖動
key_up=0;
if(KEY0==0)return KEY_RIGHT;
else if(KEY1==0)return KEY_DOWN;
else if(KEY2==0)return KEY_LEFT;
else if(KEY3==1)return KEY_UP;
}elseif(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;
return0;// 無按鍵按下
}
main.c文件
int main(void)
{
u8 t;
delay_init(); //延時函數(shù)初始化
LED_Init(); //LED端口初始化
KEY_Init(); //初始化與按鍵連接的硬件接口
BEEP_Init(); //初始化蜂鳴器端口
LED0=0; //先點亮紅燈
while(1) {
t=KEY_Scan(0); //得到鍵值
if(t){
switch(t) {
caseKEY_UP: //控制蜂鳴器
BEEP=!BEEP;
break;
caseKEY_LEFT: //控制LED0翻轉(zhuǎn)
LED0=!LED0;
break;
caseKEY_DOWN: //控制LED1翻轉(zhuǎn)
LED1=!LED1;
break;
caseKEY_RIGHT: //同時控制LED0,LED1翻轉(zhuǎn)
LED0=!LED0;
LED1=!LED1;
break;
}
}else delay_ms(10);
}
}