蓝桥基础之硬件配置(二)——按键配置

~QQ:3020889729

~小蔡

按键初始化配置

第一步·按键硬件了解:

按键的了解:按键1到4都是有着上拉电阻(R31到R34),所以呢,它们就都属于低电平有效——即,按下,按键处电平为低
电平——然后通过引脚读取电平高低就可以得到按键是否按下了。

按键部分

按键引脚的了解:
N K1到N K4分别由PA0和PA8,PB1和PB2控制(也就是按键按下后由受这些引脚读取按键是否按下的状态)。

按键的读取引脚
第二步·IO口配置

详——见代码
void KEY_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;//IO口初始化参数结构体
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);//时钟使能
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置为上拉输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化函数
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;//配置相同就只需要更改参数引脚就可以了
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

第三步·读取按键按下的函数

//按键的状态读取——宏定义
#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define KEY3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define KEY4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)

#define KEY1_DOWN 1     //按键返回值的宏定义
#define KEY2_DOWN 2
#define KEY3_DOWN 3
#define KEY4_DOWN 4

u8 key_scan_flag=0;//按键扫描一次的扫描标志
u8 key_scan_delay=5;//按键扫描的周期时间
u8 key_down=0;//按键按下标志
//上边控制扫描的参数,是用来消除按键抖动——按下之后5秒扫一次,还在按下状态就读取当前按键的返回值
//具体是放在中断部分的——后边有解释
u8 key_scan(void)
{
	static u8 key_up=1;//按键弹起标志
	if(key_up&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//判断是否有按键按下
	{
		key_down=1;//按键按下标志
		if(key_scan_flag)
		{
			key_scan_flag=0;//等待下一次按键读取/扫描
			key_scan_delay=5;//扫描等待时长重新定义
			
			key_up=0;
			if(KEY1==0) return KEY1_DOWN;//返回KEY1按下的按键值
			if(KEY2==0) return KEY2_DOWN;
			if(KEY3==0) return KEY3_DOWN;
			if(KEY4==0) return KEY4_DOWN;
			
		}
	}
	else if(key_up==0&&KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)//判断按键是否都弹起
	{
		key_up=1;//弹起置弹起状态为1
		key_down=0;//按键未按下标志
	}
	return 0;
}

按键读取可能出现的问题

① 按下按键后,可能出现抖动,得到的不是正确的按键状态——这时候就需要消抖:
而消抖,靠的就是等待一段时间(5ms到10ms)来再次判断状态使得读取值有效。(在中断中去实现)
【但是,我在测试时,好像考虑按下弹起(也就是第二个问题)后,在这里的这个消抖意义不是很大,当然可能是硬件原
因,最好还是消抖吧。】
extern u8 key_scan_flag;//按键扫描一次的扫描标志
extern u8 key_scan_delay;//按键扫描的周期时间
extern u8 key_down;//按键按下标志

void SysTick_Handler(void)
{
TimingDelay--;
if(--key_scan_delay==0&&key_down==1)//按键扫描一次
		key_scan_flag=1;
}

②按键是否弹起——多次响应按键:
这个问题就需要设置一个标志位,确保没按下的没按下时可以被按下读取,而在按下状态时,按键就不能再被读取了。
else if(key_up==0&&KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)//判断按键是否都弹起
		key_up=1;//弹起置弹起状态为1

结束

这就是简单的按键初始化配置,希望对大家有所帮助——对于比赛之后,如果还是有很大的兴趣,在使用其他开发板时,配
置方法都是大同小异的——一般都是,先去查看原理图,再开始配置。
发布了6 篇原创文章 · 获赞 6 · 访问量 3116
展开阅读全文
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览