0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于51单片机的矩阵键盘设计

CHANBAEK 来源: 透析之眼 作者: AdamChen 2023-10-31 17:47 次阅读

独立按键,一个按键需要占用一个I/O口,如果需要16个按键,那么就会 占用16个I/O口,占据MCS-51系列单片机一半的I/O口。

理论基础

为了解决I/O这个问题,设计出了矩阵键盘,下图是一个4*4的矩阵键盘原理图。

按键按照4*4的格局进行摆放,组成4行4列,将按键的同行或同列连接在一起,分别连接到P1口。

图片

怎么才能识别是哪个按键被按下呢?

以上图的S1为例,当按键被按下S1导通,P17与P13导通,可以通过判断P17与P13端口的电平是否一致,判断按键是否被按下。

可以先设置P13(检测端口)电平为高电平,假设P17(驱动端口)为低电平,当按键按下,按键导通,读取P13的电平可以读到低电平。

(1)设置驱动端口电平为高电平(1)或者低电平(0);

(2)判断检测端口电平是否与驱动端口的电平一致;

实践演练

P2口连接8个LED(如下图所示),P1口连接为4*4的矩阵键盘(如前面的矩阵键盘所示),当按键被按下时,P2口的LED点亮,点亮的LED与按键的键值一致。

图片

写代码逻辑代码先确定S1功能的实现,然后以S1写其他的按键的代码。

假设设置P17为驱动端口,设置P13为检测端口。初始化时P17口与P13检测口初始状态均为0,然后设置P17口为1,检测P13是否变为高电平,当变为高电平时,说明有按键被按下,代码如下。

#include "reg52.h"


sbit driver_key1 = P1^7;
sbit snesor_key1 = P1^3;


void main() {


    P2=0xff;    //初始化P2口,P2口原有的数据影响
    P1=0;     //清空P1口,防止原有数据影响
    while(1) {
        char num=0; //设置键值
        driver_key1 = 1;   //驱动端口电平为1,驱动开始
        if(snesor_key1==1) //判断检测端口是否为1,如果为1则按键被按下。
            num = 1;        //设置键值


        driver_key1 = 0;   //驱动端口电平为0,驱动结束
        P2 =~num;
        //由于I/O为低电平时,才可以被点亮。
        //1的值换成二进制00000001,其余七个led被点亮第一个不亮,
        //需要第一个led被点亮需要将1取反,二进制数变为1111 1110,第一个led亮。
    }
}

使用上述代码,烧录程序后。LED灯不亮,按下按键S1,LED1也没有亮。这是由于按键按下时,P17驱动端的高电平,会被P13检测端的低电平拉成低电平,检测端口检测不到高电平。

将代码修改为初始化时P17口与P13检测口初始状态均为1,然后设置P17口为0,检测P13是否变为低电平,当变为低电平时,说明有按键被按下,修改代码如下。

void main() {
    P2=0xff;    //初始化P2口,P2口原有的数据影响
    P1=0xff;     //P1口置1,防止原有数据影响
    while(1) {
         char num=0; //设置键值
        driver_key1 = 0;   //驱动端口电平为0,驱动开始
        if(snesor_key1==0) //判断检测端口是否为1,如果为1则按键被按下。
            num = 1;        //设置键值


        driver_key1 = 1;   //驱动端口电平为0,驱动结束
        P2 =~num;
        //由于I/O为低电平时,才可以被点亮。
        //1的值换成二进制00000001,其余七个led被点亮第一个不亮,
        //需要第一个led被点亮需要将1取反,二进制数变为1111 1110,第一个led亮。
    }
}

编译烧录程序,当按下S1时,可以实现LED1被点亮。

将按键检测代码独立拉出来写成函数,实现16个按键,按压时对应的led被点亮,代码如下。

#include "reg52.h"


sbit driver_key1 = P1^7;
sbit driver_key2 = P1^6;
sbit driver_key3 = P1^5;
sbit driver_key4 = P1^4;




sbit snesor_key1 = P1^3;
sbit snesor_key2 = P1^2;
sbit snesor_key3 = P1^1;
sbit snesor_key4 = P1^0;


char key_scan() {
    char num =0;
    driver_key1 = 0;
    if(snesor_key1==0)
        num = 1;
    if(snesor_key2==0)
        num = 2;
    if(snesor_key3==0)
        num = 3;
    if(snesor_key4==0)
        num = 4;
    driver_key1 = 1;


    driver_key2 = 0;
    if(snesor_key1==0)
        num = 5;
    if(snesor_key2==0)
        num = 6;
    if(snesor_key3==0)
        num = 7;
    if(snesor_key4==0)
        num = 8;
    driver_key2 = 1;


    driver_key3 = 0;
    if(snesor_key1==0)
        num = 9;
    if(snesor_key2==0)
        num = 10;
    if(snesor_key3==0)
        num = 11;
    if(snesor_key4==0)
        num = 12;
    driver_key3 = 1;


    driver_key4 = 0;
    if(snesor_key1==0)
        num = 13;
    if(snesor_key2==0)
        num = 14;
    if(snesor_key3==0)
        num = 15;
    if(snesor_key4==0)
        num = 16;
    driver_key4 = 1;
    return num;


}


void main() {


    P2=0xff;    //初始化P2口,P2口原有的数据影响
    P1=0xff;     //清空P1口,防止原有数据影响
    while(1) {
        char num =0;
        num = key_scan();
        P2 =~num;
        //由于I/O为低电平时,才可以被点亮。
        //1的值换成二进制00000001,其余七个led被点亮第一个不亮,
        //需要第一个led被点亮需要将1取反,二进制数变为1111 1110,第一个led亮。


    }
}

总结:

(1)独立按键使用简单,如果项目中需要多个独立按键就会很浪费I/O资源;

(2)矩阵键盘通过判断按键两端的I/O是否一致,判断按键是否被按下;

(3)按键按下时,驱动端口的高电平会被检测端口的低电平拉低;

(4)对同一个功能可以写成函数,需要时进行函数调用,看代码时更有逻辑性。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43978

    浏览量

    620862
  • 51单片机
    +关注

    关注

    269

    文章

    5649

    浏览量

    120701
  • 矩阵键盘
    +关注

    关注

    7

    文章

    204

    浏览量

    31135
  • 独立按键
    +关注

    关注

    1

    文章

    44

    浏览量

    11464
收藏 人收藏

    评论

    相关推荐

    51单片机矩阵键盘控制设计

    51单片机矩阵键盘控制设计
    发表于 05-30 11:33

    51单片机矩阵键盘c语言1602密码锁

    51单片机矩阵键盘c语言密码锁.....全是c语言最基础写的,学过的都看得懂,包含1602,24c02,矩阵
    发表于 11-08 20:20

    51单片机矩阵键盘和数码管实现计算器

    51单片机矩阵键盘和数码管实现计算器,,,最简单的c语言写的,保定看得懂
    发表于 11-08 20:23

    stc89c51单片机矩阵键盘扫描 精选资料分享

    c51单片机矩阵键盘扫描实现代码
    发表于 07-20 06:00

    51单片机矩阵键盘C程序主程序

    51单片机矩阵键盘C程序主程序1:void main(){uchar i,j,ki=0;j=0;while(1){i=key();//键盘
    发表于 07-20 06:01

    51单片机矩阵键盘c语言程序

    51单片机矩阵键盘c语言程序,c51单片机实现矩阵
    发表于 07-21 09:20

    基于51单片机矩阵键盘电子密码锁

    基于51单片机矩阵键盘电子密码锁,使用矩阵键盘输入四位密码,有错误和正确提示音。
    发表于 07-21 11:23 113次下载

    51单片机矩阵键盘的原理图

    51单片机矩阵键盘的原理图
    发表于 12-30 11:32 65次下载

    基于AT89C51单片机矩阵键盘电子琴

    方案介绍AT89C51单片机矩阵键盘电子琴通过16个按键弹奏16种音调;数码管根据按键显示。
    发表于 12-15 17:08 6次下载

    基于89C51单片机矩阵键盘反转扫描源程序

    基于89C51单片机矩阵键盘反转扫描源程序
    发表于 05-15 11:02 2次下载

    基于89C51单片机矩阵键盘简易计算器源程序

    基于89C51单片机矩阵键盘简易计算器源程序
    发表于 05-15 11:01 20次下载

    基于89C51单片机矩阵键盘密码锁源程序

    基于89C51单片机矩阵键盘密码锁源程序
    发表于 05-15 11:01 0次下载

    基于89C51单片机矩阵键盘行列扫描源程序

    基于89C51单片机矩阵键盘行列扫描源程序
    发表于 05-15 11:00 1次下载

    基于89C51单片机矩阵键盘中断扫描源程序

    基于89C51单片机矩阵键盘中断扫描源程序
    发表于 05-15 11:00 2次下载

    51单片机矩阵键盘扫描程序

    51单片机矩阵键盘扫描程序
    发表于 05-17 17:20 4次下载