本章博客讲述内容为矩阵键盘
1.首先,将采用模块化编程的方式写代码
将上一章节的代码中四份代码移植到当前工程的目录中,之后在工程树中添加已经存在的文件即可如下
除此之外工程树中还需要添加(新建)关于矩阵键盘的文件
2.查看原理图
由图可知:在此原理图中没有接地模块,可以从行和列的角度来看
首先统一令 P1=0xFF;
再 P1_3=0;
之后又有 P1_7==0 P1_6==0 P1_5==0 P1_4==0
这是第一个模块,因为有十六个矩阵,所以要有四个模块来实现,依次有P1_2=0; P1_1=0; P1_0=0;
最后要返回值
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
P1=0xFF;
P1_3=0;
if(P1_7==0)
{
Delay(20);
while(P1_7==0);//检测松手
Delay(20);
KeyNumber=1;//S1
}
if(P1_6==0)
{
Delay(20);
while(P1_6==0);//检测松手
Delay(20);
KeyNumber=5;//S1
}
if(P1_5==0)
{
Delay(20);
while(P1_5==0);//检测松手
Delay(20);
KeyNumber=9;//S1
}
if(P1_4==0)
{
Delay(20);
while(P1_4==0);//检测松手
Delay(20);
KeyNumber=13;//S1
}
P1=0xFF;
P1_2=0;
if(P1_7==0)
{
Delay(20);
while(P1_7==0);//检测松手
Delay(20);
KeyNumber=2;
}
if(P1_6==0)
{
Delay(20);
while(P1_6==0);//检测松手
Delay(20);
KeyNumber=6;
}
if(P1_5==0)
{
Delay(20);
while(P1_5==0);//检测松手
Delay(20);
KeyNumber=10;
}
if(P1_4==0)
{
Delay(20);
while(P1_4==0);//检测松手
Delay(20);
KeyNumber=14;
}
P1=0xFF;
P1_1=0;
if(P1_7==0)
{
Delay(20);
while(P1_7==0);//检测松手
Delay(20);
KeyNumber=3;
}
if(P1_6==0)
{
Delay(20);
while(P1_6==0);//检测松手
Delay(20);
KeyNumber=7;
}
if(P1_5==0)
{
Delay(20);
while(P1_5==0);//检测松手
Delay(20);
KeyNumber=11;
}
if(P1_4==0)
{
Delay(20);
while(P1_4==0);//检测松手
Delay(20);
KeyNumber=15;
}
P1=0xFF;
P1_0=0;
if(P1_7==0)
{
Delay(20);
while(P1_7==0);//检测松手
Delay(20);
KeyNumber=4;
}
if(P1_6==0)
{
Delay(20);
while(P1_6==0);//检测松手
Delay(20);
KeyNumber=8;
}
if(P1_5==0)
{
Delay(20);
while(P1_5==0);//检测松手
Delay(20);
KeyNumber=12;
}
if(P1_4==0)
{
Delay(20);
while(P1_4==0);//检测松手
Delay(20);
KeyNumber=16;
}
为了使得代码更加规范,可加以下注释
3.最后在main.c函数主体中写函数来展现效果
LCD_Init();
LCD_ShowString(1,1,"MatrixKey:");
while(1)
{
KeyNum=MatrixKey();
if(KeyNum)//如果不加判断那么在下一个检测时会立马刷新为0
{
LCD_ShowNum(2,1,KeyNum,2);
}
4.效果如下:按下按键会显示出对应的数字
5.注:如果在main函数的主体中没有If语句进行判断的话在下一个检测中会立马刷新为0,所以显示为0