题目:
首先将J5处的跳帽接到1~2引脚,使按键s4~s19按键组成4×4的矩阵键盘。在扫描按键的过程中,发现有按键触发信号(不做去抖动),待按键松开后在数码管的第一位显示相应的数字:从左至右,从上至下,依次显示0~F。
矩阵键盘原理:逐行扫描,逐列读取。
#include "reg52.h"
sfr P4=0xc0; //定义P4的内存地址
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C4=P3^4;
sbit C3=P3^5;
sbit C2=P4^2;
sbit C1=P4^4;
//共阳极数码管
unsigned char code duan_code[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
//选择锁存器
void Select_HC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2=(P2&0x1f)|0x80;
break;
case 5:
P2=(P2&0x1f)|0xa0;
break;
case 6:
P2=(P2&0x1f)|0xc0;
break;
case 7:
P2=(P2&0x1f)|0xe0;
break;
}
}
//数码管静态显示
void SEG_KeyNum(unsigned char value)
{
Select_HC573(6); //位选
P0=0x01; //数码管第一位
Select_HC573(7); //段选
P0=value;
}
//矩阵键盘
unsigned char key_num; //键值全局变量
void ScanKeys_Multi()
{
R1=0;
R2=R3=R4=1;
C1=C2=C3=C4=1;
if(C1==0)
{
while(C1==0); //按键没有松开就等待
key_num=0;
SEG_KeyNum(duan_code[key_num]);
}
else if(C2==0)
{
while(C2==0); //按键没有松开就等待
key_num=1;
SEG_KeyNum(duan_code[key_num]);
}
else if(C3==0)
{
while(C3==0); //按键没有松开就等待
key_num=2;
SEG_KeyNum(duan_code[key_num]);
}
else if(C4==0)
{
while(C4==0); //按键没有松开就等待
key_num=3;
SEG_KeyNum(duan_code[key_num]);
}
R2=0;
R1=R3=R4=1;
C1=C2=C3=C4=1;
if(C1==0)
{
while(C1==0); //按键没有松开就等待
key_num=4;
SEG_KeyNum(duan_code[key_num]);
}
else if(C2==0)
{
while(C2==0); //按键没有松开就等待
key_num=5;
SEG_KeyNum(duan_code[key_num]);
}
else if(C3==0)
{
while(C3==0); //按键没有松开就等待
key_num=6;
SEG_KeyNum(duan_code[key_num]);
}
else if(C4==0)
{
while(C4==0); //按键没有松开就等待
key_num=7;
SEG_KeyNum(duan_code[key_num]);
}
R3=0;
R2=R1=R4=1;
C1=C2=C3=C4=1;
if(C1==0)
{
while(C1==0); //按键没有松开就等待
key_num=8;
SEG_KeyNum(duan_code[key_num]);
}
else if(C2==0)
{
while(C2==0); //按键没有松开就等待
key_num=9;
SEG_KeyNum(duan_code[key_num]);
}
else if(C3==0)
{
while(C3==0); //按键没有松开就等待
key_num=10;
SEG_KeyNum(duan_code[key_num]);
}
else if(C4==0)
{
while(C4==0); //按键没有松开就等待
key_num=11;
SEG_KeyNum(duan_code[key_num]);
}
R4=0;
R2=R3=R1=1;
C1=C2=C3=C4=1;
if(C1==0)
{
while(C1==0); //按键没有松开就等待
key_num=12;
SEG_KeyNum(duan_code[key_num]);
}
else if(C2==0)
{
while(C2==0); //按键没有松开就等待
key_num=13;
SEG_KeyNum(duan_code[key_num]);
}
else if(C3==0)
{
while(C3==0); //按键没有松开就等待
key_num=14;
SEG_KeyNum(duan_code[key_num]);
}
else if(C4==0)
{
while(C4==0); //按键没有松开就等待
key_num=15;
SEG_KeyNum(duan_code[key_num]);
}
}
void main()
{
while(1)
{
ScanKeys_Multi();
}
}