最经典的单片机矩阵扫描程序C语言

/******************************************************************************************
  键盘3*4扫描程序
  入口参数:
  出口参数:
  键码:ee de be,7e,ed,dd,bd,7d,eb,db,bb,7b
         0  1  2  3  4  5  6  7  8  9  a  b
 *********************************************************************************************/
 void delay(uchar d);
uchar KeyV()
{  uchar readKey,a;
   P2=0xf8;                  //确定行列位置
   if(P2==0xf8)
     return(keynum);              //无键按下返回0
   if(P2==0xf8)              //再次判断。目的是确保检测正确
     return(keynum);
   else
    { delay(0);              //调用延时函数 ,目的是去前沿键抖。
      for(a=0;a<3;a++)       //以下为经典的计算键值(判断闭合键所在的位置)
        { P2=_cror_(0xfb,a);
          if(P24==0) break;
          if(P25==0) break;
          if(P26==0) break;
          if(P27==0) break;
        } 
    readKey=P2;                  //取得键值
    for(;P2!=0xf8;P2=0xf8) ; //等待键松开,目的是去后沿键抖
    flag=1;
 return(readKey);                                //带键值返回主调函数
  }
}
/*****************************************************************************************
 计算返回数字键值模块,好让后面的程序调用的时候直接判断按键
 可以执行其他的分支
*******************************************************************************************/
uchar keycode(void)
{ uchar key_code;
  while(1)
  {
  key_code=KeyV();
 switch(key_code)
 {
   case 0xee:keynum=0;break;
   case 0xde:keynum=1;break;
   case 0xbe:keynum=2;break;
   case 0x7e:keynum=3;break;
   case 0xed:keynum=4;break;
   case 0xdd:keynum=5;break;
   case 0xbd:keynum=6;break;
   case 0x7d:keynum=7;break;
   case 0xeb:keynum=8;break;
   case 0xdb:keynum=9;break;
   case 0xbb:keynum=0x0A;break;
   case 0x7b:keynum=0x0B;break;
   default:break;
   }
     return(keynum);
   }
 }

 

 


#include


unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99, //0~4
       0x92,0x82,0xF8,0x80,0x90, //5~9
       0x88,0x83,0xA7,0xA1,0x86,0x8E}; //A~F

void KeyScan();
void delay10ms(unsigned char time);
void Dispaly(unsigned char k);

unsigned char key,temp;

void main() //主程序
{
 while(1)
 {
  KeyScan();
 }
}

void KeyScan() //按键扫描子程序
{
 P1=0xFF;
 P1_3=0;
 temp=P1;
 temp&=0xF0;
 if(temp !=0xF0)
 {
  delay10ms(1);
  temp=P1;
  temp&=0xF0;
  if(temp !=0xF0)
  {
   temp=P1;
   temp&=0xF0;

   switch(temp)
   {
   case 0x70:
    key=1;break;
   case 0xB0:
    key=2;break;
   case 0xD0:
    key=3;break;
   }
   Dispaly(key);
  }
 }

 P1=0xFF;
 P1_2=0;
 temp=P1;
 temp&=0xF0;
 if(temp !=0xF0)
 {
  delay10ms(1);
  temp=P1;
  temp&=0xF0;
  if(temp !=0xF0)
  {
   temp=P1;
   temp&=0xF0;

   switch(temp)
   {
   case 0x70:
    key=4;break;
   case 0xB0:
    key=5;break;
   case 0xD0:
    key=6;break;
   }
   Dispaly(key);
  }
 }

 P1=0xFF;
 P1_1=0;
 temp=P1;
 temp&=0xF0;
 if(temp !=0xF0)
 {
  delay10ms(1);
  temp=P1;
  temp&=0xF0;
  if(temp !=0xF0)
  {
   temp=P1;
   temp&=0xF0;

   switch(temp)
   {
   case 0x70:
    key=7;break;
   case 0xB0:
    key=8;break;
   case 0xD0:
    key=9;break;
   }
   Dispaly(key);
  }
 }

 P1=0xFF;
 P1_0=0;
 temp=P1;
 temp&=0xF0;
 if(temp !=0xF0)
 {
  delay10ms(1);
  temp=P1;
  temp&=0xF0;
  if(temp !=0xF0)
  {
   temp=P1;
   temp&=0xF0;

   switch(temp)
   {
   case 0x70:
    key=14;break;
   case 0xB0:
    key=0;break;
   case 0xD0:
    key=15;break;
   }
   Dispaly(key);
  }
 }
}

//延时程序
void delay10ms(unsigned char time)
{
 unsigned char a,b,c;
 for(a=0;a  for(b=0;b<10;b++)
   for(c=0;c<120;c++)
   ;
}

void Dispaly(unsigned char k) //显示程序
{
 P0=table[k];
 P2_1=0;
}
 

你可能感兴趣的:(最经典的单片机矩阵扫描程序C语言)