89C52单片机矩阵键盘行列扫描程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^6;
sbit dela=P2^7;
uchar code wela_table[]={
0xFE,0xFD,0xFB,0xF7,
0xEF,0xDF,0xBF,0x7F};
uchar code dela_table[]={
0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,
0x39,0x5E,0x79,0x71};
uchar temp,num;
void Init();
void DelayMs(uchar a);
void DelayUs2(uchar b);
void KeyScan();
void Display();
/*---------------------------------------------------------------
主函数
------------------------------------------------------------------*/
void main()
{
Init();
while(1)
{
KeyScan();
Display();
}
}
/*----------------------------------初始化函数----------------------------*/
void Init()
{
num=0;
}
/*---------------------------------键盘扫描--------------------------------*/
void KeyScan()
{
/*--------------------------第一行检测--------------------------*/
P3=0xFE;
temp=P3;
temp=temp&0xF0;
if(temp!=0xF0)
{
DelayMs(250);
temp=P3;
temp=temp&0xF0;
if(temp!=0xF0)
{
switch(temp)
{
case 0x70: num=1;
break;
case 0xB0: num=2;
break;
case 0xD0: num=3;
break;
case 0xE0: num=4;
break;
}
}
while(temp!=0xF0)
{
temp=P3;
temp=temp&0xF0;
Display();
}
}
/*--------------------------第二行检测--------------------------*/
P3=0xFD;
temp=P3;
temp=temp&0xF0;
if(temp!=0xF0)
{
DelayMs(50);
temp=P3;
temp=temp&0xF0;
if(temp!=0xF0)
{
switch(temp)
{
case 0x70: num=5;break;
case 0xB0: num=6;break;
case 0xD0: num=7;break;
case 0xE0: num=8;break;
}
}
while(temp!=0xF0)
{
temp=P3;
temp=temp&0xF0;
Display();
}
}
/*--------------------------第三行检测--------------------------*/
P3=0xFB;
temp=P3;
temp=temp&0xF0;
if(temp!=0xF0)
{
DelayMs(50);
temp=P3;
temp=temp&0xF0;
if(temp!=0xF0)
{
switch(temp)
{
case 0x70: num=9;break;
case 0xB0: num=10;break;
case 0xD0: num=11;break;
case 0xE0: num=12;break;
}
}
while(temp!=0xF0)
{
temp=P3;
temp=temp&0xF0;
Display();
}
}
/*--------------------------第四行检测--------------------------*/
P3=0xF7;
temp=P3;
temp=temp&0xF0;
if(temp!=0xF0)
{
DelayMs(50);
temp=P3;
temp=temp&0xF0;
if(temp!=0xF0)
{
switch(temp)
{
case 0x70: num=13;break;
case 0xB0: num=14;break;
case 0xD0: num=15;break;
case 0xE0: num=0;break;
}
}
while(temp!=0xF0)
{
temp=P3;
temp=temp&0xF0;
Display();
}
}
}
/*----------------------------------延时函数-----------------------------*/
void DelayMs(uchar a)
{
while(a)
{
DelayUs2(245);
DelayUs2(245);
a--;
}
}
void DelayUs2(uchar b)
{
while(b)
{
b--;
}
}
/*-------------------------------显示函数------------------------------------*/
void Display()
{
P0=0xFF;
wela=1;
wela=0;
P0=dela_table[num];
dela=1;
dela=0;
P0=wela_table[5];
wela=1;
wela=0;
DelayUs2(50);
}