标题: 单片机16矩阵键盘扫描程序,懂的拿走 [打印本页]

作者: brew9    时间: 2018-10-9 16:55
标题: 单片机16矩阵键盘扫描程序,懂的拿走
  1. #include<reg52.h>
  2. typedef unsigned int u16;
  3. typedef unsigned char u8;

  4. //定义键盘连接的端口,设置键盘编码数组
  5. #define keyboard_px P3
  6. u8 code key_tab[]={0xEE,0xDE,0xBE,0x7E,0xED,0xDD,0xBD,0x7D,0xEB,0xDB,0xBB,0x7B,0xE7,0xD7,0xB7,0x77};

  7. //延时1ms函数(晶振11.0592MHz)
  8. void delay(u16 num)
  9. {
  10.         u16 x,y;
  11.         for(x=num; x>0; x--){for(y=113; y>0; y--);}
  12. }

  13. //扫描函数,获取按键对应的索引值
  14. u8 key_scan(void)
  15. {
  16.         u8 temp1, temp2, i;

  17.         keyboard_px = 0xf0;
  18.         delay(5);

  19.         if(keyboard_px != 0xf0)
  20.         {
  21.                 delay(5);
  22.                 if(keyboard_px != 0xf0)
  23.                 {
  24.                         //获取按键编码
  25.                         temp1 = keyboard_px;
  26.                         keyboard_px = 0x0f;
  27.                         delay(5);
  28.                         temp2 = keyboard_px;
  29.                         temp1 |= temp2;
  30.                         
  31.                         //提取按键编码对应的数码管编码(或者返回i值,用于对其它数组的数值提取)
  32.                         for (i=0; i<16; i++)
  33.                         {
  34.                                 if (key_tab[i] == temp1)
  35.                                 {
  36.                                         return i;
  37.                                         break;
  38.                                 }
  39.                         }
  40.                 }
  41.         }else{
  42.                 return 0xff;
  43.         }
  44. }
复制代码

作者: SHANWAZI    时间: 2021-3-23 22:31
非常感谢提供我已经理解了您的程序思路了并且已经
作者: SHANWAZI    时间: 2021-3-23 22:38
在您的程序基础上修改以下不知道是否可以?
把行号和列号分别取出来然后再做或运算是否可以???
上程序请看 但是有一个问题貌似此时按键按下按键响应速度明显变慢了而且是跟KEY_Cnt消抖变量成正比这是什么情况呢???
void Matrix_KEY4x4_Scan_Drive()
{
        static idata uint8 temp1,temp2;
        static idata uint8 KEY_Cnt;
       
        Matrix_KEY4x4_GPIO=0x0f;
        temp1=Matrix_KEY4x4_GPIO;
       
        if(Matrix_KEY4x4_GPIO!=0x0f)
        {
                KEY_Cnt++;
                        if(KEY_Cnt>=200)
                        {
                                KEY_Cnt=0;
                                        if(Matrix_KEY4x4_GPIO!=0x0f)
                                        {
                                                        temp1=Matrix_KEY4x4_GPIO&0x0f;//取低四位或取列号
                                                        Matrix_KEY4x4_GPIO=0xf0;          //反转
                                                        temp2=Matrix_KEY4x4_GPIO&0xf0;//取高四位获取行号
                                                       
                                                        switch(temp1|temp2)
                                                        {
                                                                case(0x7e):Key_Value=0x01;break;
                                                                case(0x7d):Key_Value=0x02;break;
                                                                case(0x7b):Key_Value=0x03;break;
                                                                case(0x77):Key_Value=0x04;break;
                                                               
                                                                case(0xbe):Key_Value=0x05;break;
                                                                case(0xbd):Key_Value=0x06;break;
                                                                case(0xbb):Key_Value=0x07;break;
                                                                case(0xb7):Key_Value=0x08;break;
                                                               
                                                                case(0xde):Key_Value=0x09;break;
                                                                case(0xdd):Key_Value=0x10;break;
                                                                case(0xdb):Key_Value=0x11;break;
                                                                case(0xd7):Key_Value=0x12;break;
                                                               
                                                                case(0xee):Key_Value=0x13;break;
                                                                case(0xed):Key_Value=0x14;break;
                                                                case(0xeb):Key_Value=0x15;break;
                                                                case(0xe7):Key_Value=0x16;break;
                                                                default:break;
                                                        }
                                        }
                        }
        }
}

作者: 972803100    时间: 2021-3-24 12:56
感谢,非常清楚明白




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1