51单片机矩阵键盘
行列扫描法
①所有的行线置高电平,依次对列线进行扫描。
②将第一列置低电平,P1.0=0
③若检测到行线P1.4=0,则K0键被按下。
同理若P1.5=0,则K4被按下。
Pertues仿真图
C程序
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[]=
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};
void Delay400us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 181;
while (--i);
}
void main()
{
uchar TMP,NUM;
P1=0xF0; //行线置低电平,列线置高电平
TMP=P1;
if((TMP&P1)!=0xF0)
//如果列线为低电平,则说明有键按下
Delay400us();
while((TMP&P1)!=0xF0)
{
P1=0xFE; //第一列置低电平
TMP=P1;
switch(TMP)
{
case 0xEE:NUM=0;
break;
case 0xDE:NUM=4;
break;
case 0xBE:NUM=8;
break;
case 0x7E:NUM=12;
break;
}
P1=0xFD; //第二列置低电平
TMP=P1;
switch(TMP)
{
case 0xED:NUM=1;
break;
case 0xDD:NUM=5;
break;
case 0xBD:NUM=9;
break;
case 0x7D:NUM=13;
break;
}
P1=0xFB; //第三列置低电平
TMP=P1;
switch(TMP)
{
case 0xEB:NUM=2;
break;
case 0xDB:NUM=6;
break;
case 0xBB:NUM=10;
break;
case 0x7B:NUM=14;
break;
}
P1=0xF7; //第四列置低电平
TMP=P1;
switch(TMP)
{
case 0xE7:NUM=3;
break;
case 0xD7:NUM=7;
break;
case 0xB7:NUM=11;
break;
case 0x77:NUM=15;
break;
}
P2=~table[NUM];
//查表得对应的键码,给数码管显示
}
}