void KEY_Init(void)
{
RCC->APB2ENR|=1<<0;
RCC->APB2ENR|=1<<6;
GPIOA->CRL&=0XFFFFFFF0;
GPIOA->CRL|=0X00000008;
GPIOE->CRL&=0XFFF000FF;
GPIOE->CRL&=0X00088800;
GPIOE->ODR|=7<<2;
}
KEY_Init,设置GPIO口的状态
#ifndef __KEY__H #define __KEY__H #include "sys.h" #define KEY0 PE4(in) //输入模式 #define KEY1 PE3(in) #define KEY2 PE2(in) #define WK_UP PA0(in) #define KEY0_PRES 1 //利用case switch 语句来进行按键控制 #define KEY1_PRES 2 #define KEY2_PRES 3 #define KEY3_PRES 4 void KEY_Init(); u8 KEY_Scan(u8); #endif
u8 KEY_Scan(u8 mode) { static u8 key_up=1; // if(mode)key_up=1; // if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)) //有即可以检测,无需全都 { delay_ms(10); //去抖:按下后会有一定的抖动,会出现返回高电平的情况 key_up=0; if(KEY0==0) return 1; else if(KEY1==0) return 2; else if(KEY2==0) return 3; else if(WK_UP==1)return 4; } else if(KEY0==0&&KEY1==0&&KEY2==0&&WK_UP==1) key_up=1; return 0; }
(1)static :1静态局部变量2全局变量:本实验中只是有记忆功能,即上次返回的功能
(2)mode作用:插入调控连续按键(电视快进键)和独立按键(电源)
#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "beep.h" int main(void) { u8 key=0; delay_init(); //延时函数初始化 LED_Init(); //LED端口初始化 KEY_Init(); //初始化与按键连接的硬件接口 BEEP_Init(); //初始化蜂鸣器端口 LED0=0; //先点亮红灯 while(1) { key=KEY_Scan(0); //得到键值 if(key) { switch(key) { case WKUP_PRES: //控制蜂鸣器 BEEP=!BEEP; break; case KEY2_PRES: //控制LED0翻转 LED0=!LED0; break; case KEY1_PRES: //控制LED1翻转 LED1=!LED1; break; case KEY0_PRES: //同时控制LED0,LED1翻转 LED0=!LED0; LED1=!LED1; break; } }else delay_ms(10); } }