实验三 按键输入
注意输入模式的设置,按下时为高电平设置为下拉模式,按下时为低电平设置为上拉模式,这样输入时,上拉模式的得到高点平,下拉模式得到低电平,具体原理还不是很懂
按键IO输入初始化参考代码:
void KEY_Init(){
//这里初始化key0(PE4),key1(PE3),key_up(PA0)
//key0连续控制灯,key1控制蜂鸣器,key_up控制输入模式
//先初始化IO,需要注意这次三个引脚的模式设置不同,key0和1设置为下拉输入,key_up设置为上拉输入
GPIO_InitTypeDef GPIO_InitStructure;//GPIO参初始化的第二个结构体参数
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//GPIOE的时钟使能操作
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA的时钟使能操作
//参数的设计可以参考gpio初始化的函数有效性检测
//keu0引脚的设置,输入模式不需要设置速度
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//设置为上拉输入模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//设置GPIO的第4引脚
GPIO_Init(GPIOE,&GPIO_InitStructure);//第一个参数为GPIO信息,第二个参数的结构体需要自定义
//key1引脚的设置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//设置为上拉输入模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_Init(GPIOE,&GPIO_InitStructure);//第一个参数为GPIO信息,第二个参数的结构体需要自定义
//key_up引脚的设置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//设置为下拉输入模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_Init(GPIOA,&GPIO_InitStructure);//第一个参数为GPIO信息,第二个参数的结构体需要自定义
}
按键扫描参考代码,可以根据mode设置电平触发或者下降沿触发:
u8 KEY_Scan(u8 mode){
//两种模式,mode=1设置为连续检测,否则为不连续检测
//检测有优先级,0没有键按下,1key0按下,2key1按下,3key_up按下
u8 key0=GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4);
u8 key1=GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3);
u8 key_up=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
static key_state=1; //标志按键抬起
if(mode==1){
key_state=1;
}
if(key_state&&(key0==0||key1==0||key_up==1)){
delay_ms(10);
key_state=0;
if(key0==0) return 1;
else if(key1==0) return 2;
else if(key_up==1) return 3;
}else if(key0==1&&key1==1&&key_up==0) key_state=1;
return 0;
}
主函数功能设计:
int main(){
LED_Init();
delay_init();
BEEP_Init();
KEY_Init();
u8 key=0,key0=0,key1=0,key_up=0;
u8 mode=1;
while(1){
//实验三,设置key0按下即灯亮,再按下即灯灭 key1 按下即蜂鸣器响起,再按下即关闭
key=KEY_Scan(mode);//设置key_up的模式为不连续
if(key==3){
key_up+=1;//key_up按下
if(key_up%2==0) mode=1;
else mode=0;
}else if(key==2){
key1+=1;//key1按下
if(key1%2==0) GPIO_ResetBits(GPIOB,GPIO_Pin_8);//蜂鸣器关闭
else GPIO_SetBits(GPIOB,GPIO_Pin_8);//响起
}else if(key==1){
key0+=1;
if(key0%5==0) GPIO_ResetBits(GPIOB,GPIO_Pin_5);//灯亮
else GPIO_SetBits(GPIOB,GPIO_Pin_5);//灯灭
}
}
}