美文网首页
13 矩阵按键

13 矩阵按键

作者: aaa小菜鸡 | 来源:发表于2018-03-25 23:12 被阅读0次

    单片机STC89C52学习——13 矩阵按键

    汇总:00 单片机STC89C52学习
    参考教程:普中科技

    1 工作原理

    1.1 矩阵按键的由来

    使用较少IO口,控制较多按键 原理图

    1.2 矩阵按键扫描原理

    1. 逐行扫描
      通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
    2. 行列扫描(通常采用)
      通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,则通过接收的数据值,判断是哪一列有按键按下;然后反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是哪一行有按键按下。这样就能够确定是哪一个按键按下了。

    1.3 将矩阵按键变为独立按键

    如将S1、S5、S9、S13变为独立按键:
    P13输出低电平,相当于独立按键的GND;控制P14~P17

    2 程序:矩阵按键——LED后四位显示按下的矩阵按键

    #include "reg52.h"
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    sbit LSA = P2^2;
    sbit LSB = P2^3;
    sbit LSC = P2^4;
    
    #define GPIO_KEY P1// 矩阵键盘
    // #define GPIO_DIG P0// 数码管
    #define GPIO_LED P2// LED灯
    
    u8 keyValue = 0x00;// 全局变量
    // u8 code LEDSeg[] = {0x3f , 0x06 , 0x5b , 0x4f , 
    //                  0x66 , 0x6d , 0x7d , 0x07 , 
    //                  0x7f , 0x6f , 0x77 , 0x7c ,
    //                  0x39 , 0x5e , 0x79 , 0x71};
    
    void delay (u16 i)
    {
        while (i --);
    }
    
    void keyMat()// 行列扫描
    {
        u8 a = 0;// keil默认就是0
        GPIO_KEY = 0x0f;// 高四位低电平,低四位高电平
        if (GPIO_KEY != 0x0f)// 通过低四位判断是否按下
        {
            delay (1000);// 消抖
            if (GPIO_KEY != 0x0f)// 再次判断
            {
                GPIO_KEY = 0x0f;// 保险起见,可以再赋一次值
                // keyValue = keyValue | GPIO_KEY;// 记录低四位...不能这样记录
                switch (GPIO_KEY)
                {
                    case 0x07:
                        keyValue = 0; break;
                    case 0x0b:
                        keyValue = 1; break;
                    case 0x0d:
                        keyValue = 2; break;
                    case 0x0e:
                        keyValue = 3; break;
                }
                GPIO_KEY = 0xf0;
                // keyValue = keyValue | GPIO_KEY;// 记录高四位...不能这样记录
                switch (GPIO_KEY)
                {
                    case 0x70:
                        keyValue = keyValue; break;
                    case 0xb0:
                        keyValue += 4; break;
                    case 0xd0:
                        keyValue += 8; break;
                    case 0xe0:
                        keyValue += 12; break;
                }
                while ((a < 50) && (GPIO_KEY != 0xf0))// 松开才继续,或者超时
                {
                    delay(1000);
                    a ++;
                }   
            }
        }   
    }
    
    void main()
    {
        // LSA = 0; LSB = 0; LSC = 0;
        while (1)
        {
            keyMat();
            GPIO_LED = ~keyValue;// 在LED上显示     
        }
    }
    

    效果:按下矩阵按键后,相应的LED灯亮

    相关文章

      网友评论

          本文标题:13 矩阵按键

          本文链接:https://www.haomeiwen.com/subject/heikcftx.html