单片机:矩阵按键(行列法和线翻转法都有)

简介: 单片机:矩阵按键(行列法和线翻转法都有)

硬件部分(A2-A4和A5-A7芯片有所不同)

A2-A4


0fd5752e518a4ba79809683ac2842fbb.png

A5-A7

(考虑兼容性,推荐8-1端口依次使用P10-P17)


698efc384ac44ccd81ca510279a34c7f.png


软件部分:


deaf51b5b53748efaadd1c89f0f43956.png


行列法


#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define SMG_A_DP_PORT    P0//数码管对应端口定义
#define KEY_MATRIX_PORT  P1//矩阵按键函数端口定义
//共阴数码管输入以下值分别会显示0-F
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
                    0x7d,0x07,0x7f,0x6f,0x77,0x7c,
                    0x39,0x5e,0x79,0x71};
//延时函数                                    
void time_delay(u16 delay_time)
{
    while(delay_time--);
}
//矩阵按键函数
u8 key_matrix_ranks_scan(void)//不需要形参
{
    u8 key_value=0;//定义接收返回值,使之可读性高
    //赋值使之第一列矩阵按键为0,低电平
    KEY_MATRIX_PORT=0xf7;
    if(KEY_MATRIX_PORT!=0xf7)//此时按键按下
    {
            time_delay(1000);//消抖
        switch(KEY_MATRIX_PORT)//为真就是!=0
        {
            //只有四种情况,0x77,0xb7,0xd7,0xe7,
            //分别给固定输出结果
            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);//等待按键松开
        //赋值使之第二列矩阵按键为0,低电平
    KEY_MATRIX_PORT=0xfb;
    if(KEY_MATRIX_PORT!=0xfb)//此时按键按下
    {
            time_delay(1000);//消抖
        switch(KEY_MATRIX_PORT)
        {
            //只有四种情况,0x7b,0xbb,0xdb,0xeb,
            //分别给固定输出结果
            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);//等待按键松开
            //赋值使之第三列矩阵按键为0,低电平
    KEY_MATRIX_PORT=0xfd;
    if(KEY_MATRIX_PORT!=0xfd)//此时按键按下
    {
            time_delay(1000);//消抖
        switch(KEY_MATRIX_PORT)
        {
            //只有四种情况,0x7d,0xbd,0xdd,0xed,
            //分别给固定输出结果
            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);//等待按键松开
                //赋值使之第四列矩阵按键为0,低电平
    KEY_MATRIX_PORT=0xfe;
    if(KEY_MATRIX_PORT!=0xfe)//此时按键按下
    {
            time_delay(1000);//消抖
        switch(KEY_MATRIX_PORT)
        {
            //只有四种情况,0x7e,0xbe,0xde,0xee,
            //分别给固定输出结果
            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;
}
void main()
{
    u8 key=0;
    while(1)
    {
        key=key_matrix_ranks_scan();
        if(key!=0)
            SMG_A_DP_PORT=gsmg_code[key-1];
    }
}

a321c4cf1bf547e39855e76f9fc18291.png


线翻转法:


#include"reg52.h"
//对数据类型进行重定义
typedef unsigned char u8;
typedef unsigned int u16;
//宏定义数码管段码口
#define SMG_A_DP_PORT          P0
//宏定义矩阵按键控制口
#define KEY_MATRIX_PORT        P1
//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};    
//延时函数
void time_delay(u16 delay_time)
{
    while(delay_time--);
}
u8 key_matrix_ranks_scan(void)//线翻转法
{
    static u8 key_value=0;
    KEY_MATRIX_PORT=0x0f;//给所有行赋值0,列赋值1
  if(KEY_MATRIX_PORT!=0x0f)//判断按键是否按下
    {
        time_delay(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;
}
void main()
{
    u8 key=0;
    while(1)
    {
        key=key_matrix_ranks_scan();
        if(key!=0)
            SMG_A_DP_PORT=gsmg_code[key-1];
    }
}

5e6f5143326345158bf22a7b640ce347.png


相关文章
|
10天前
|
传感器
51单片机矩阵键盘超详解!(内含LCD1602代码)
51单片机矩阵键盘超详解!(内含LCD1602代码)
13 0
【51单片机】初学者必学的一个矩阵键盘基本项目——(读矩阵键盘的数字显示在LCD屏上)(7)
【51单片机】初学者必学的一个矩阵键盘基本项目——(读矩阵键盘的数字显示在LCD屏上)(7)
|
10天前
|
数据安全/隐私保护
【51单片机】初学者必学的一个矩阵键盘基本项目——(矩阵键盘密码锁)(8)
【51单片机】初学者必学的一个矩阵键盘基本项目——(矩阵键盘密码锁)(8)
定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”
定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”
|
10天前
|
C语言
独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”
独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”
|
10天前
|
数据安全/隐私保护
C51单片机实现矩阵键盘密码锁
C51单片机实现矩阵键盘密码锁
50 0
|
9月前
单片机按键的使用
单片机按键的使用
128 0
|
10天前
|
缓存 编译器 索引
单片机中按键检测函数详细分析经典
单片机中按键检测函数详细分析经典
95 0
|
8月前
|
缓存 芯片
STM32F0单片机快速入门四 翻转引脚
STM32F0单片机快速入门四 翻转引脚
|
9月前
|
C语言
51单片机按键
学习按键处理
88 0
51单片机按键