STM32的按键检测相对比较简单,首先按部就班的初始化连接的到的i/o,然后写一个按键扫描函数,这个和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); //按键扫描函数 #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(); //延时函数初始化 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翻转 LED0=!LED0; break; caseKEY_DOWN: //控制LED1翻转 LED1=!LED1; break; caseKEY_RIGHT: //同时控制LED0,LED1翻转 LED0=!LED0; LED1=!LED1; break; } }else delay_ms(10); } }
|