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);
}