main.c
int main(void)
{
u8 key_value = 0;
Stm32_Clock_Init(336,8,2,7);//系统时钟初始化
LED_Init();//LED灯初始化
BEEP_Init();
KEY_Init();
while(1)
{
key_value = KEY_Scan();//获得按键值
switch(key_value)//判断按键值,并做相应的动作
{
case 1: LED0 = ~LED0; break;//KEY0按下
case 2: LED1 = ~LED1; break;//KEY1按下
case 3: BEEP = ~BEEP; break;//KEY2按下
case 4: LED0 = ~LED0; LED1 = ~LED1; break;//WAKE_UP按下
}
}
}
key.c
void KEY_Init(void)
{
RCC->AHB1ENR |= (1<<0); //使能PA口的时钟
RCC->AHB1ENR |= (1<<4); //使能PE口的时钟
GPIO_Set(GPIOA,(1<<0),0,0,0,2);//PA0输入下拉
GPIO_Set(GPIOE,((1<<2)|(1<<3)|(1<<4)),0,0,0,1);//PE2,3,4输入上拉
}
/*KEY_Scan函数有按键按下返回按键的值,没有按键按下返回0;
按键的值:KEY0=1;KEY1=2;KEY2=3;KEY_UP=4. */
u8 KEY_Scan(void)
{
static u8 key_flag=1; //按键弹起标志位为1,按下为0
if(((WAKE_UP==1)||(KEY0==0)||(KEY1==0)||(KEY2==0))&&(key_flag==1))
{
//按键刚刚处于弹起状态,但现在有按下
Delay_ms(10);//延时20ms,消除抖动
if((WAKE_UP==1)||(KEY0==0)||(KEY1==0)||(KEY2==0))
{
//确实有按键按下
key_flag = 0; //key_flag=0说明为按下状态,防止重复触发导致按下一次但报多次按下
if(KEY0==0) return 1;
if(KEY1==0) return 2;
if(KEY2==0) return 3;
if(WAKE_UP==1) return 4;
}
}
if(((WAKE_UP==0)&&(KEY0==1)&&(KEY1==1)&&(KEY2==1))&&(key_flag==0))
{
//按键处于弹起状态而且刚刚是按下状态
Delay_ms(10); //消除弹起抖动
if((WAKE_UP==0)&&(KEY0==1)&&(KEY1==1)&&(KEY2==1))
{
//确实是弹起了,将标志置1
key_flag = 1;
}
}
return 0;//没有按键按下返回0
}