nRF52832 — 矩阵键盘

 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 XX  作       者:ZHS(文化人)

 XX  联系方式:文章末尾Chat快问

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

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

 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

nRF52832 — 矩阵键盘_第1张图片

常用的按键操作方式有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;
}

你可能感兴趣的:(nRF52832)