STM32单片机4*4矩阵键盘相关代码

       矩阵键盘是我们学习32单片机中十分常见的模块。对于我们掌握32单片机的基本要求有很大的帮助。其核心原理是利用键盘按键按下时产生的电位变化来判断是否按下以及利用行列电平变化来得到按键在矩阵键盘位置的思路。本文简述其使用的相关代码。

        硬件结构

 STM32单片机4*4矩阵键盘相关代码_第1张图片

         要使用矩阵键盘,需要先了解矩阵键盘的硬件结构。其共有16个按键和8个引脚,每个引脚控制一行或一列,8个引脚,4个控制行,4个控制列。对于电线的排布,每个引脚分别连接一行的4个按键的一端,而按键的另一端则连接控制列的引脚。当某个按键被按下时,会连接两个引脚,引起电平变化,从而得到按键的具体位置。

软件思路

        根据4*4矩阵键盘的结构,每个按键两端分别连接一个行引脚和列引脚,而当按键按下的瞬间,按键会接通按键的两端,因此一个按键按下时会将两个行列引脚连接起来,而每个引脚控制不同的行或列,因此根据对应引脚的变化即可得出按下了哪个按键。而我们可以进行两次判断,第一次将4个行对应的引脚设置为上拉输入模式,列的4个引脚设置为低电平推挽输出,这样当按键按下时,行列相接,行对应的引脚在与列对应的低电平相连时会变为低电平,从而返回0,由此我们可以根据哪一行对应的引脚状态变为0来判断按下的按键处于哪一行。这时我们再将列对引脚应的4个引脚设置为上拉输入,行对应的4个引脚设置为低电平推挽输出,这样我们便可以得到是哪一列的按键按下,根据两次判断出按键所在的行和列便可以得到按键按下的具体位置。

        具体实现的步骤为:

1、配置行列控制引脚

        即选择8个引脚来控制4个行和列,这里注意需要选择能够作为IO口的引脚,STM32上有许多引脚的默认功能并不是作为IO口,因此需要先查阅STM32的接口配置表,来选择这8个引脚。这里选用的是PB8~PB15,这8个引脚在默认状态下均为IO口状态,并且为连续的引脚,在配置时更加方便。

        配置代码如下:

    GPIOB->CRH&=0X00000000;
	GPIOB->CRH|=0X88883333;
	
	PBout(8)=0;
	PBout(9)=0;
	PBout(10)=0;
	PBout(11)=0;
	//GPIOB->ODR=0;
	GPIOB->ODR|=1<<12;
	GPIOB->ODR|=1<<13;
	GPIOB->ODR|=1<<14;
	GPIOB->ODR|=1<<15;

         首先对PB口的寄存器进行初始化配置,将低4位配置为推挽输出并置为低电平输出,高4位配置为上拉输入。这种配置状态下当按键按下时,高 4 位会有以为变为低电平,从而判断按键处于哪一行。

2、行判断函数

    if(PBin(12)==0){delay_ms(20);a=1;flag=1;/*printf("1");*/}
    if(PBin(13)==0){delay_ms(20);a=2;flag=1;/*printf("2");*/}
	if(PBin(14)==0){delay_ms(20);a=3;flag=1;/*printf("3");*/}
	if(PBin(15)==0){delay_ms(20);a=4;flag=1;/*printf("4");*/}

        根据哪一行对应的引脚变为0来记录按键处在的对应行,这里利用一个无符号8位变量a来保存所的行的位置,同时利用一个初始值为0的变量置为1来标志按键已经按下。

3、配置列引脚的初始状态

	if(flag){
	GPIOB->CRH&=0X00000000;
	GPIOB->CRH|=0X33338888;
		
	PBout(12)=0;
	PBout(13)=0;
	PBout(14)=0;
	PBout(15)=0;
	//GPIOB->ODR=0;
	GPIOB->ODR|=1<<8;
	GPIOB->ODR|=1<<9;
	GPIOB->ODR|=1<<10;
	GPIOB->ODR|=1<<11;
	
	output(a);
	}

         将列对引脚应的4个引脚设置为上拉输入,行对应的4个引脚设置为低电平推挽输出然后进入列判断函数。

4、列判断函数并输出

void output(u8 a){
	
	if(PBin(8)==0){delay_ms(20);printf("%u\n",1+(a-1)*4);/*printf("1");*/}
	if(PBin(9)==0){delay_ms(20);printf("%u\n",2+(a-1)*4);/*printf("2");*/}
	if(PBin(10)==0){delay_ms(20);printf("%u\n",3+(a-1)*4);/*printf("3");*/}
	if(PBin(11)==0){delay_ms(20);printf("%u\n",4+(a-1)*4);/*printf("4");*/}
}

        这里编写了一个单独的函数用判断列,其作用为通过输入1,2,3,4来得到对应的列位置。其中1,2,3,4分别代表第一行,第二行,第三行和第四行。根据引脚的电平变化得到按下按键对应的列位置,在结合输入的行位置,从而计算出按键对应的数值,分别为1到16.并输出到屏幕上。

        至此,矩阵键盘就完成了相关配置,现在按下按键串口上就会显示出对应的数字,即输出当前按键所在的位置。以上便为4*4矩阵键盘的使用方法及相关代码。如有问题欢迎一起讨论。

你可能感兴趣的:(32单片机,stm32,计算机外设,单片机)