13 矩阵按键

单片机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 矩阵按键)