STMF103学习笔记(三)——按键输入

实验三 按键输入

注意输入模式的设置,按下时为高电平设置为下拉模式,按下时为低电平设置为上拉模式,这样输入时,上拉模式的得到高点平,下拉模式得到低电平,具体原理还不是很懂
按键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);//灯灭
		}

	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值