nrf 52832 键盘
扫描二维码
随时随地手机看文章
写在前面:因为项目内需要用到机械的矩阵按键,所以这里整理一下有关矩阵按键的一些知识~温故而知新。
一、矩阵按键的工作原理:
常用的按键操作方式有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;
}