目标
通过89C51的P1口连接4*4的矩阵键盘,P0和P2口连接八位数码管。开始运行后,按下矩阵按键后数码管上显示出对应的键值,从左向右依次排列。当数码管显示满八位数字后,再有字符输入时整体字符向左平移,输入字符从最右端挤入。
Proteus布线
用P0口的低四位P0.0-P0.3来连接矩阵键盘的行线,用P0口的高四位P0.4-P0.7来连接矩阵键盘的列线。我是按照下图这样来给矩阵键盘分配键值的。
矩阵键盘判断按键值的原理和步骤:
(1)令P0=“11110000”,当无按键按下时,P0保持不变。每个键盘的左端口为低电平,右端口为高电平。一旦有按键按下,按键部位的导线连通,该按键的左端口会被上拉成高电平。这一行的行线对应的P0.0-P0.3端口的电平就会变成高电平。此时便可以通过P0口的端口值(总共分为11110001、11110010、11110100、11111000四种情况)来判断被按下的按键属于第几行。
(2)在判断完行之后。立刻令P0=“00001111”,此时每个键盘的左端口为高电平,右端口为低电平。由于按键部位的导线已经连通,该按键的右端口会被上拉成高电平。这一列的列线对应的P0.4-P0.7端口的电平就会变成高电平。此时便可以通过P0口的端口值(总共分为00011111、00101111、01001111、10001111四种情况)来判断被按下的按键属于第几列。
实现过程
1、首先,编写我们最核心的键值判断函数
就按照刚才讲过的原理和步骤,用judge_number()函数实现如下:
uint judge_number()
{
uint hang=0,lie=0;
//判断行
switch(P1)//"11110000"
{
case 0x0f1:{
hang=0;break;}
case 0x0f2:{
hang=1;break;}
case 0x0f4:{
hang=2;break;}
case 0x0f8:{
hang=3;break;}
default :{
hang=0; }
}
//判断列
P1=0x0f;//"00001111"
switch(P1