单片机 4x4矩阵键盘

一.设初始值【P3=0xf0】,当S11被按压的时候,P3值变为【0xd0】

#include<reg52.h>
sbit du=P2^6;
sbit we=P2^7;

void delay(unsigned int x)
{
  unsigned char i;
  while(x--)
{

 for(i=0;i120;i++);

}
}
unsigned char leddata[]={ 
 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //??
                0x00  //???
 
                         };
  unsigned char array[8]={
           0xFE,
           0xFD,
           0xFB,
           0xF7,
           0xEF,
           0xDF,
           0xBF,
           0x7F}; 



   uchar KeyScan()
  {
   uchar cord_l,cord_h;  //声明列线和行线的值的存储变量
   P3 = 0xf0; //1111 0000
   if( (P3 & 0xf0) != 0xf0)
   {
    delay(5);
    if( (P3 & 0xf0)!= 0xf0)// 判断是否有按键按下
    {
       cord_l=P3 & 0xf0;   //存储列线值
       P3=cord_l | 0x0f;
       cord_h = P3 & 0xf0;
      while( (P3 & 0xf0)!= 0xf0) //松手检测
        return (cord_l +cord_h);  //返回键值码
           
  


     }
    


}   
void KeyPro()
{
  switch(KeyScan())
{
 //第一行键
  case  0xee: P0 = leddata[0];    break;
  case  0xde: P0 = leddata[1];    break;
  case  0xbe: P0 = leddata[2];    break;
  case  0x7e; P0=  leddata[3];    break;
  
  //第二行键
  case  0xed:  P0 = leddata[4];   break;
  case  0xdd; P0=  leddata[5];    break;
  case  0xbd; P0=  leddata[6];    break;
  case  0x7d; P0=  leddata[7];    break;

//第三行键
  case  0xeb; P0=  leddata[8];    break;
  case  0xdb; P0=  leddata[9];    break;
  case  0xbb; P0=  leddata[10];    break;
  case  0x7b; P0=  leddata[11];    break;

//第四行键
  case  0xe7; P0=  leddata[12];    break;
  case  0xd7; P0=  leddata[13];    break;
  case  0xb7; P0=  leddata[15];    break;
  case  0x77; P0=  leddata[16];    break;
}


}

void main()
{
  we =1;//打开位选段
  P0=0;//数码管全显示
  we=0;

  du=1while(1)
{

P1= KeyScan();

}


}


}

 

二.当S11被按下的值存储为L=0xd0(确定一列)

 

posted @ 2018-01-17 11:57  Justice-V  阅读(391)  评论(0)    收藏  举报