×
单片机 > 单片机程序设计 > 详情

矩阵键盘的51程序

发布时间:2020-05-29 发布时间:
|
//  P1口扩展4*4矩阵键盘,P1.7-P1.4作为行线,P1.3-P1.0作为列线。

//  数码管显示按键值,P0提供段码,P2.7-2.5通过74ls138,作为位码,片选数码管。

#include
void leddisplay();       // 数码管显示
unsigned char keyscan(); //键盘扫描
unsigned char keyin();   //按键值读取
void delayms(unsigned int k);
unsigned char data ledxs[8]={16,16,16,16,16,16,0,0}; // 数码管显示缓冲区
unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,0xff};
                          //共阴极代码 0-F,  全灭,全亮
void main()
{
   unsigned char i,keyword;
   delayms(200);
   while(1)
   {
     
       for(i=0;i<38;i++)   // 按下一个按键300ms后再响应下一个,不检测按键弹起  
       {
         ledxs[6]=keyword/10;
         ledxs[7]=keyword%10;
         leddisplay();        
       }  
       i=keyin();                        
       switch(i)
       {
          //case 0x0f: keyword=0;break;
          case 0x77: keyword=6;break;
          case 0x7b: keyword=7;break;
          case 0x7d: keyword=8;break;
          case 0x7e: keyword=9;break;
          case 0xb7: keyword=10;break;
          case 0xbb: keyword=11;break;
          case 0xbd: keyword=12;break;
          case 0xbe: keyword=13;break;
          case 0xd7: keyword=14;break;
          case 0xdb: keyword=15;break;
          case 0xdd: keyword=16;break;
          case 0xde: keyword=17;break;
          case 0xe7: keyword=18;break;
          case 0xeb: keyword=19;break;
          case 0xed: keyword=20;break;
          case 0xee: keyword=21;break;
          default:break;
       }
   }
}
unsigned char keyin()     //读取按键值
{
  unsigned char i;
  do
  {
    i=keyscan();         // 读取键值
    leddisplay();        // 8ms 去抖
  }
  while(i!=keyscan());   // 无键按下继续扫描
  return i;              // 有键按下返回键值
}
unsigned char keyscan()  //按键检测
{
  unsigned char i=0x0f,d;
  P1=0xff;
   
  P1=0x7f;       // 扫描第1行
  i=P1&0x0f;     // 读取列值
  d=i|0x70;      // 高4位为行号,低4位为列号
  if(i!=0x0f)
     return d;    // 返回键值

  P1=0xbf;       // 扫描第2行
  i=P1&0x0f;
  d=i|0xb0;
  if(i!=0x0f)
     return d;

  P1=0xdf;      // 扫描第3行
  i=P1&0x0f;
  d=i|0xd0;
  if(i!=0x0f)
     return d;

  P1=0xef;      // 扫描第4行
  i=P1&0x0f;
  d=i|0xe0;
  if(i!=0x0f)
     return d;

  return i;    //无键按下,返回0x0f

}
void leddisplay()
{
  P2=0xdf;
  P0=tab[ledxs[0]];
  delayms(1);
  P0=0x00;

  P2=0x5f;
  P0=tab[ledxs[1]];
  delayms(1);
  P0=0x00;

  P2=0x9f;
  P0=tab[ledxs[2]];
  delayms(1);
  P0=0x00;

  P2=0x1f;
  P0=tab[ledxs[3]];
  delayms(1);
  P0=0x00;

  P2=0xff;
  P0=tab[ledxs[4]];
  delayms(1);
  P0=0x00;

  P2=0x7f;
  P0=tab[ledxs[5]];
  delayms(1);
  P0=0x00;

  P2=0xbf;
  P0=tab[ledxs[6]];
  delayms(1);
  P0=0x00;

  P2=0x3f;
  P0=tab[ledxs[7]];
  delayms(1);
  P0=0x00;
}
void delayms(unsigned int k)  //延时 n ms
{
  while(k)
  {
  int i;
  i=110;
  while(i--);
  k=k-1;
  }
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会