一.原理
-
原理图:
-
-
注意右下角,在比赛用的IAP板子中P36与P37口分别更换成P42和P44口,写代码时也要注意。
-
-
矩阵键盘的每个跳帽如图所示,因为有右侧电阻的存在,未按下时显示高电平1,按下后由于被短路显示低电平0。再观察原理图可知,将接口分为行接口(P30-P33,记为R1-R4),以及列接口(P34-P35,P42,P44,记为C1-C4),依次判断。
-
举例:
二.应用&源码:
按下第一行第一、二、三、四列按键数码管分别显示0,1,2,3(默认为com1的数码管),按下第二行。。依次显示。。。以此类推。
#include<STC15F2K60S2.h>
unsigned char code SMG_duanma[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C1=P3^4;
sbit C2=P3^4;
sbit C3=P4^2;//注意初始化
sbit C4=P4^4;
Select_HC573(unsigned char op)
{
switch(op)
{
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 SMG_Display(unsigned char value)//点亮数码管
{
Select_HC573(6);
P0=0x01;
Select_HC573(7);
P0=value;
}
void Delay(unsigned char t)
{
while (t--);
}
void Init()//初始化矩阵键盘
{
R1=R2=R3=R4=1;
C1=C2=C3=C4=1;
}
void Simp(int k1,int k2,int k3,int k4)//本质是依次检验每一列,我懒得写就用函数封装简化了
{
if (C1==0)
{
Delay(100);
if (C1==0)
{
while (C1==0);
SMG_Display(SMG_duanma[k1]);
}
}
if (C2==0)
{
Delay(100);
if (C2==0)
{
while (C2==0);
SMG_Display(SMG_duanma[k2]);
}
}
if (C3==0)
{
Delay(100);
if (C3==0)
{
while (C3==0);
SMG_Display(SMG_duanma[k3]);
}
}
if (C4==0)
{
Delay(100);
if (C4==0)
{
while (C4==0);
SMG_Display(SMG_duanma[k4]);
}
}
}
void main()
{
while (1)
{
Init();//先初始化矩阵键盘
R1=0;//检测第一行
Simp(0,1,2,3);//检测第一行的每一列
Init();//同理,类推
R2=0;
Simp(4,5,6,7);
Init();
R3=0;
Simp(8,9,10,11);
Init();
R4=0;
Simp(12,13,14,15);
}
}