矩阵按键行列扫描法与反转扫描法:原理、代码实现

您所在的位置:网站首页 51单片机线反转法 矩阵按键行列扫描法与反转扫描法:原理、代码实现

矩阵按键行列扫描法与反转扫描法:原理、代码实现

2024-07-17 09:49| 来源: 网络整理| 查看: 265

 #define KEY_MATRIX_PORT P1

//行列选中法:

unsigned char key_matrix_ranks_scan(void) {     unsigned char key_value=0;

    KEY_MATRIX_PORT=0xf7;//给第一列赋值0     if(KEY_MATRIX_PORT!=0xf7)//判断第一列按键是否按下     {         delay_10us(1000);//消抖         switch(KEY_MATRIX_PORT)//保存第一列按键按下后的键值             {             case 0x77: key_value=1;break;             case 0xb7: key_value=5;break;             case 0xd7: key_value=9;break;             case 0xe7: key_value=13;break;         }     }     while(KEY_MATRIX_PORT!=0xf7);//等待按键松开              KEY_MATRIX_PORT=0xfb;//给第二列赋值0,其余全为1     if(KEY_MATRIX_PORT!=0xfb)//判断第二列按键是否按下     {         delay_10us(1000);//消抖         switch(KEY_MATRIX_PORT)//保存第二列按键按下后的键值             {             case 0x7b: key_value=2;break;             case 0xbb: key_value=6;break;             case 0xdb: key_value=10;break;             case 0xeb: key_value=14;break;         }     }     while(KEY_MATRIX_PORT!=0xfb);//等待按键松开              KEY_MATRIX_PORT=0xfd;//给第三列赋值0,其余全为1     if(KEY_MATRIX_PORT!=0xfd)//判断第三列按键是否按下     {         delay_10us(1000);//消抖         switch(KEY_MATRIX_PORT)//保存第三列按键按下后的键值             {             case 0x7d: key_value=3;break;             case 0xbd: key_value=7;break;             case 0xdd: key_value=11;break;             case 0xed: key_value=15;break;         }     }     while(KEY_MATRIX_PORT!=0xfd);//等待按键松开              KEY_MATRIX_PORT=0xfe;//给第四列赋值0,其余全为1     if(KEY_MATRIX_PORT!=0xfe)//判断第四列按键是否按下     {         delay_10us(1000);//消抖         switch(KEY_MATRIX_PORT)//保存第四列按键按下后的键值             {             case 0x7e: key_value=4;break;             case 0xbe: key_value=8;break;             case 0xde: key_value=12;break;             case 0xee: key_value=16;break;         }     }     while(KEY_MATRIX_PORT!=0xfe);//等待按键松开          return key_value;         }

//线反转法:

unsigned char key_matrix_flip_scan(void) {     static unsigned char key_value=0;

    KEY_MATRIX_PORT=0x0f;//给所有行赋值0,列全为1     if(KEY_MATRIX_PORT!=0x0f)//判断按键是否按下     {         delay_10us(1000);//消抖         if(KEY_MATRIX_PORT!=0x0f)         {             //测试列             KEY_MATRIX_PORT=0x0f;             switch(KEY_MATRIX_PORT)//保存行为0,按键按下后的列值                 {                 case 0x07: key_value=1;break;                 case 0x0b: key_value=2;break;                 case 0x0d: key_value=3;break;                 case 0x0e: key_value=4;break;             }             //测试行             KEY_MATRIX_PORT=0xf0;             switch(KEY_MATRIX_PORT)//保存列为0,按键按下后的键值                 {                 case 0x70: key_value=key_value;break;                 case 0xb0: key_value=key_value+4;break;                 case 0xd0: key_value=key_value+8;break;                 case 0xe0: key_value=key_value+12;break;             }             while(KEY_MATRIX_PORT!=0xf0);//等待按键松开             }     }     else         key_value=0;             return key_value;         }



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3