本文通过在proteus上搭建51单片机的矩阵键盘电路并联合keil编程软件编写的源程序进行8*8矩阵键盘仿真,进而熟悉proteus软件的仿真操作。
目录
(一)4×4矩阵键盘原理1.逐行扫描2.行列扫描
(二)8×8矩阵键盘设计1.proteus电路图设计2.程序设计3.矩阵键盘仿真效果
(三)总结
(一)4×4矩阵键盘原理
1.逐行扫描
通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下;然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
2.行列扫描
通过高四位同时输出低电平,低四位输出高电平。当低四位接收到的数据不全为高电平时,说明有按键按下;然后通过接收的数据值,判断是哪一列有按键按下。然后再反过来,高四位同时输出高电平,低四位输出低电平,然后根据高四位接收到的值判断是哪一行有按键按下,这样就能够确定是哪一个按键被按下。
(二)8×8矩阵键盘设计
1.proteus电路图设计
2.程序设计
按键检测部分 这里编写的8×8矩阵键盘检测程序是通过51单片机的P2和P3口以行列检测原理的方式进行按键的检测。
void Key_Down(void)
{
char a
=0;
P2
=0xff;
P3
=0x00;
if(P2
!=0xff)
{
delay();
if(P2
!=0xff)
{
flags
=1;
P2
=0x00;
P3
=0xff;
switch(P3
)
{
case(0Xfe): KeyValue
=1;break;
case(0Xfd): KeyValue
=2;break;
case(0Xfb): KeyValue
=3;break;
case(0Xf7): KeyValue
=4;break;
case(0Xef): KeyValue
=5;break;
case(0Xdf): KeyValue
=6;break;
case(0Xbf): KeyValue
=7;break;
case(0X7f): KeyValue
=8;break;
}
P2
=0xff;
P3
=0x00;
switch(P2
)
{
case(0Xfe): KeyValue
=KeyValue
;break;
case(0Xfd): KeyValue
=KeyValue
+8;break;
case(0Xfb): KeyValue
=KeyValue
+16;break;
case(0Xf7): KeyValue
=KeyValue
+24;break;
case(0Xef): KeyValue
=KeyValue
+32;break;
case(0Xdf): KeyValue
=KeyValue
+40;break;
case(0Xbf): KeyValue
=KeyValue
+48;break;
case(0X7f): KeyValue
=KeyValue
+56;break;
}
}
}
while((a
<20)&&(P2
!=0xff))
{
delay();
a
++;
}
flags
=0;
}
数码管显示部分
void Seg_Choose()
{
unsigned int key
=KeyValue
;
if(key
<10)
{
k1
=0;
k2
=key
;
key
=0;
}
else
{
while(key
/10!=0)
{
k2
=key
%10;
key
/=10;
k1
=key
;
}
}
}
完整程序如下
#include<reg51.h>
unsigned int KeyValue
=0;
unsigned int flags
=0;
unsigned int k1
,k2
;
unsigned char code KB
[10]={0xBF,0xB0,0xED,0xF9,0xF2,0xDB,0xDF,0xB1,0xFF,0xFB};
void Delay()
{
unsigned int i
;
for(i
=0;i
<200;i
++);
}
void Key_Down(void)
{
char a
=0;
P2
=0xff;
P3
=0x00;
if(P2
!=0xff)
{
delay();
if(P2
!=0xff)
{
flags
=1;
P2
=0x00;
P3
=0xff;
switch(P3
)
{
case(0Xfe): KeyValue
=1;break;
case(0Xfd): KeyValue
=2;break;
case(0Xfb): KeyValue
=3;break;
case(0Xf7): KeyValue
=4;break;
case(0Xef): KeyValue
=5;break;
case(0Xdf): KeyValue
=6;break;
case(0Xbf): KeyValue
=7;break;
case(0X7f): KeyValue
=8;break;
}
P2
=0xff;
P3
=0x00;
switch(P2
)
{
case(0Xfe): KeyValue
=KeyValue
;break;
case(0Xfd): KeyValue
=KeyValue
+8;break;
case(0Xfb): KeyValue
=KeyValue
+16;break;
case(0Xf7): KeyValue
=KeyValue
+24;break;
case(0Xef): KeyValue
=KeyValue
+32;break;
case(0Xdf): KeyValue
=KeyValue
+40;break;
case(0Xbf): KeyValue
=KeyValue
+48;break;
case(0X7f): KeyValue
=KeyValue
+56;break;
}
}
}
while((a
<20)&&(P2
!=0xff))
{
delay();
a
++;
}
flags
=0;
}
void Seg_Choose()
{
unsigned int key
=KeyValue
;
if(key
<10)
{
k1
=0;
k2
=key
;
key
=0;
}
else
{
while(key
/10!=0)
{
k2
=key
%10;
key
/=10;
k1
=key
;
}
}
}
int main()
{
while(1)
{
Key_Down();
Seg_Choose();
P1
=KB
[k2
];
P0
=KB
[k1
];
Delay();
}
return 0;
}
3.矩阵键盘仿真效果
按下某个按键后,会显示相对应的按键值(按键值1~64)。
(三)总结
在4×4矩阵键盘的基础上,我使用51单片机的P2口和P3口将其扩展为8×8的矩阵键盘,并编写对应的控制程序。通过proteus的仿真功能进行矩阵键盘的仿真,当有按键按下时,数码管将会显示被按下的按键的值。
参考博文: proteus pro 8.9 安装及汉化教程 矩阵键盘扫描原理(附单片机驱动程序)