单片机学习——矩阵键盘(自用)
原理及思路:
对于矩阵键盘,我们只能逐行扫描,然后读取列的信号。
例如一个4x4的矩阵,应对每一行分别赋0,然后扫描列的信号,加入某一列中出现0,则为对应行列的键盘被按下。此时,应定义一个全局变量,给矩阵行列上的每一个按键赋予一个独立的号码,当扫描到某一行某一列的动作后,把对应的编号输出,我们就知道哪个按键触发了。
软件部分:
#include "reg52.h"
unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x80,
0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
unsigned char key_num;
sfr P4=0xc0; //52单片机无P4位,则需定义P4的地址
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C4=P3^4;
sbit C3=P3^4;
sbit C2=P4^2;
sbit C1=P4^4;//分别定义C1-C4、R1-R4端的端口
void selectHC573(unsigned char n)
{
switch(n)
{
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;
}
}//通过138译码器选择需要使用的寄存器
void displaykeynum(unsigned char value)
{
selectHC573(6);
P0=0x01;
selectHC573(7);
P0=value;
}
void scankey()
{
R1=0;//扫描第一行
R2=R3=R4=1;
C1=C2=C3=C4=1;
if(C1==0)//分别对第一行的第一二三四列进行扫描
{
while(C1==0);
key_num=0;//若c1为0则代表按下的键为C1R1,输出代表C1R1的0值
displaykeynum(SMG_duanma[key_num]);
}
else if(C2==0)
{
while(C2==0);
key_num=1;
displaykeynum(SMG_duanma[key_num]);
}
if(C3==0)
{
while(C3==0);
key_num=2;
displaykeynum(SMG_duanma[key_num]);
}
if(C4==0)
{
while(C4==0);
key_num=3;
displaykeynum(SMG_duanma[key_num]);
}
R2=0;
R1=R3=R4=1;
C1=C2=C3=C4=1;
if(C1==0)
{
while(C1==0);
key_num=4;
displaykeynum(SMG_duanma[key_num]);
}
else if(C2==0)
{
while(C2==0);
key_num=5;
displaykeynum(SMG_duanma[key_num]);
}
if(C3==0)
{
while(C3==0);
key_num=6;
displaykeynum(SMG_duanma[key_num]);
}
if(C4==0)
{
while(C4==0);
key_num=7;
displaykeynum(SMG_duanma[key_num]);
}
R3=0;
R2=R1=R4=1;
C1=C2=C3=C4=1;
if(C1==0)
{
while(C1==0);
key_num=8;
displaykeynum(SMG_duanma[key_num]);
}
else if(C2==0)
{
while(C2==0);
key_num=9;
displaykeynum(SMG_duanma[key_num]);
}
if(C3==0)
{
while(C3==0);
key_num=10;
displaykeynum(SMG_duanma[key_num]);
}
if(C4==0)
{
while(C4==0);
key_num=11;
displaykeynum(SMG_duanma[key_num]);
}
R4=0;
R2=R3=R1=1;
C1=C2=C3=C4=1;
if(C1==0)
{
while(C1==0);
key_num=12;
displaykeynum(SMG_duanma[key_num]);
}
else if(C2==0)
{
while(C2==0);
key_num=13;
displaykeynum(SMG_duanma[key_num]);
}
if(C3==0)
{
while(C3==0);
key_num=14;
displaykeynum(SMG_duanma[key_num]);
}
if(C4==0)
{
while(C4==0);
key_num=15;
displaykeynum(SMG_duanma[key_num]);
}
}
void main()
{
while(1)
{
scankey();
}
}
懂完了