nRF52832 — 矩阵键盘

 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 XX  作       者:文化人

 XX  联系方式:

 XX  版权声明:原创文章,欢迎评论和转载~转载时能告诉我一声就最好了

 XX  要说的话:作者水平有限,难免有不足之处,恳请指正!

 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

写在前面:因为项目内需要用到机械的矩阵按键,所以这里整理一下有关矩阵按键的一些知识~温故而知新。

一、矩阵按键的工作原理:

常用的按键操作方式有IO口按键、AD按键、触摸按键、滑触按键等,在使用IO口按键,且按键数量较多的时候,为了减少IO的占用,通常将按键设计为矩阵形式。矩阵式结构的按键显示比直接法要复杂一些,识别也要复杂一些,上图中,行线通过电阻接正电源,并将行线作为输入脚,列线作为输出脚,当按键没有按下时,所有的输入脚都是高电平,代表无按键按下;一旦有按键按下,则输入脚就会被拉低,所以通过读取输入脚的电平状态,就可以知道是否有按键按下。

二、矩阵按键的识别方法:

1、逐行扫描法、逐列扫描法(最常用);

2、高低电平翻转法;

3、行列扫描法;

三、行列扫描法的工作原理:

1、编程使行线作为输入脚(初始化为输入低),列线作为输出脚(初始化为输出高);

2、扫描所有行线输入脚,如果某个脚为高电平,则说明有按键按下,延时去抖,再次读取该脚,如果电平还是高则进入下一步,否则返回重新判断;

3、开始扫描按键位置,逐列扫描,分别拉高列线输出脚,当拉高其中一列时,其他列都拉低为低电平,读取输入脚的电平获取按键值;

4、然后根据上面得到的行列计算出按键值;

四、行列扫描法代码实现:

第一种直接实现,比较粗糙:

uint32_t Matrix_Key_Scan(void)
{
	uint8_t outNum = 0;
	uint8_t inNum = 0;
	uint32_t ret = 0;
	
	bool tmp = false;
	for(inNum = 0; inNum < matrixkey_in_num; inNum++)
	{
		if(nrf_gpio_pin_read(matrixkey_in_num[inNum]))
		{
			nrf_delay_ms(30);
			if(nrf_gpio_pin_read(matrixkey_in_num[inNum]))
			{
				for(outNum = 0; outNum < matrixkey_out_num; outNum++)
				{
					Set_MATRIX_OUTPUT_IO(outNum);
					tmp = Read_Matrix_INPUT_IO(inNum);
					if(tmp)
						ret |= p_matrix_lookup[outNum+inNum*matrixkey_out_num];
				}
			}
		}
	}
	return ret;
}

第二种比较精炼:

uint32_t Matrix_Key_Scan(void)
{
	uint8_t outNum = 0;
	uint8_t inNum = 0;
	uint32_t ret = 0;
	
	bool tmp = false;
	for(outNum = 0; outNum < matrixkey_out_num; outNum++)
	{
		Set_MATRIX_OUTPUT_IO(outNum);
		nrf_delay_ms(30);
		for(inNum = 0; inNum < matrixkey_in_num; inNum++)
		{
			tmp = Read_Matrix_INPUT_IO(inNum);
			if(tmp)
				ret |= p_matrix_lookup[outNum+inNum*matrixkey_out_num];
		}
	}
	return ret;
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文化人Sugar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值