一、4*4键盘矩阵

  4×4 键盘矩阵共有 16 个按键,按照“线与”的交叉连接方式排成一个矩阵,即 16 个按键分别连接在 4 行 4 列导线的交叉点上。单片机系统按键如果采用矩阵连接方式,可以节省一半的 I/O 资源。

二、仿真

1、选择元器件

  这次实验要用的元器件有:AT89C51、按钮、两个共阳极数码管。两个共阳极数码管选择位置如下:

NULNPY5C6XE4WEG.png

2、摆放模拟电路

image.png

网络标号

  上图中按键和 P2 接口之间没有直接用导线连接,而是采用具有电气特性的网络标号。在电路设计过程中,加注同一标号的导线,电路系统认为是连在一起的。在设计单片机系统或其他电子系统的电路时,由于元器件引脚较多,电路分成几个模块,元器件与元器件之间经常采用网络标号。

  首先点击下图的按钮。

image.png

  然后按 a,弹出模态框,输出以下内容,点击 OK。

image.png

  依次点击要标号的导线即可。

image.png

三、程序

  4*4 键盘矩阵的程序设计采用了 I/O 接口扫描与检测原理。按键处理过程首先让 P3 输出按键扫描数据,然后检测按键是否按下,经判断后返回与按键对应的键值。单片机的 P0 口用来控制数码管显示的数字;P2 口用来检测用户按下了哪个按键,从而进行相应的操作;P3.0 控制数码管显示的个位,P3.1 控制数码管显示的十位。

1、动态显示原理

  如果让数码管只显示个位,P3.0 输出高电平,P3.1 输出低电平,并且此时 P0 口输出个位要显示数字的二进制;十位同理。以此循环,十位数码管显示,然后回来再显示个位。这种利用 2 分时控制实现的多位数码管显示方式为动态显示。只要每个数码管显示的交替时间足够的快,由于人的视觉暂留特性,我们看到的结果是一个两位数。

2、消隐

  数码管在进行动态显示数字时,会出现显示错乱。这是数码管动态扫描显示方式造成的:当你在数码管上循环显示 1,2 时,因为人有视觉暂留,当显示完 1 后,再显示 2,如果间隔时间过短,那就会感觉 1、2 两个数字是叠加在一起显示的。如果你在两位数码管上显示,那就会两位同时显示出叠加字 —— 重影。
  如何消隐:单片机要做的是,当第一位显示完 1 后,给出信号关闭数码管,然后再第二位显示 2,就不会出现重影了。

3、代码实现

#include<reg51.h>
code unsigned char seven_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char k=56;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;

void delay(unsigned int x){while(x--);}
void display(void)
{
	//消隐
	P0=0xff;
	//获取个位
	P0=seven_seg[k%10];
	//显示个位
	P3=0x02;
	delay(500);
	P0=0xff;
	//获取十位
	P0=seven_seg[k/10];
	//显示十位
	P3=0x01;
	delay(500);
}
void main(void)
{
	while(1)
	{
		display1();
		//扫描每个端口,先将 P2.0口设为低电平,如果P2.4-6中有为低电平,则表示P2.0行有按钮被按下 
		P2=0xfe;
 		while(P2_4==0)k=0;
		while(P2_5==0)k=1;
		while(P2_6==0)k=2;
		while(P2_7==0)k=3;

		P2=0xfd;
 		while(P2_4==0)k=4;
		while(P2_5==0)k=5;
		while(P2_6==0)k=6;
		while(P2_7==0)k=7;

		P2=0xfb;
 		while(P2_4==0)k=8;
		while(P2_5==0)k=9;
		while(P2_6==0)k=10;
		while(P2_7==0)k=11;

		P2=0xf7;
 		while(P2_4==0)k=12;
		while(P2_5==0)k=13;
		while(P2_6==0)k=14;
		while(P2_7==0)k=15;
	}
}

标题:实验四(2):4*4键盘矩阵 —— AT89C51
作者:Yi-Xing
地址:http://47.94.239.232:10014/articles/2020/10/02/1601645140939.html
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!