一种简单的单片机矩阵键盘的程序

2025-10-11 10:07:40

1、unsigned char Keycan(void) //按键扫描程序 P1.0--P1.3为行线 P1.4--P1.7为列线

{

  unsigned char rcode, ccode;

  P1 = 0xF0;      // 发全0行扫描码,列线输入

  if((P1&0xF0) != 0xF0) // 若有键按下

  {

    delay();// 延时去抖动 

    if((P1&0xF0) != 0xF0)

    {  rcode = 0xFE;         // 逐行扫描初值

    while((rcode&0x10) != 0)

    {

       P1 = rcode;         // 输出行扫描码

    if((P1&0xF0) != 0xF0) // 本行有键按下

    {

       ccode = (P1&0xF0)|0x0F;

       do{;}while((P1&0xF0) != 0xF0); //等待键释放

       return ((~rcode) + (~ccode)); // 返回键编码

    }

    else

    rcode = (rcode<<1)|0x01; // 行扫描码左移一位

    }

 }

  }  

  return 0; // 无键按下,返回值为0

}

2、void KeyDispaly(unsigned char key)

{

   switch(key)

   {

   case 0x11: display(0); break;

   case 0x21: display(1); break;

   case 0x41: display(2); break;

   case 0x81: display(3); break;

   case 0x12: display(4); break;

   case 0x22: display(5); break;

   case 0x42: display(6); break;

   case 0x82: display(7); break;

   case 0x14: display(8); break;

   case 0x24: display(9); break;

   case 0x44: display(10); break;

   case 0x84: display(11); break;

   case 0x18: display(12); break;

   case 0x28: display(13); break;

   case 0x48: display(14); break;

   case 0x88: display(15); break;

   default: break;

   }

}

3、如果Keyscan放在主函数里,得到按键编码的变量,必须也放在主函数里。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢