C51编程5-输入电平(矩阵键盘)

发布者:和谐相处最新更新时间:2022-06-22 来源: eefocus关键字:C51  编程  输入电平  矩阵键盘 手机看文章 扫描二维码
随时随地手机看文章

独立按键,一个按键需要占用一个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)对同一个功能可以写成函数,需要时进行函数调用,看代码时更有逻辑性。

关键字:C51  编程  输入电平  矩阵键盘 引用地址:C51编程5-输入电平(矩阵键盘)

上一篇:C51编程4-输入电平(独立按键)
下一篇:C51编程6-双向I/O口与准双向I/O口

推荐阅读最新更新时间:2024-11-20 10:50

蓝宙电子:八岁的小朋友可以这样编程控制小汽车
商场里的玩具五花八门,小汽车总是放在一个比较显眼的位置,它不仅吸引小朋友的目光,很多家长也非常喜欢,有时候买回去家长比孩子还玩得多。随着年龄的增长,小孩子越来越有自己的思想,很多小朋友想让玩具汽车按照自己的想法动起来。而现在市面上的大部分玩具汽车程序已经固化,无法更改,所以很难满足这一要求,今年的CITE2015上,蓝宙电子也带来自己新款智能汽车,满足八岁的小朋友编程控制汽车表演特技。   关于这款小车的性能,蓝宙电子副总经理廉德富告诉与非网记者,“八岁的小朋友会操作电脑就可以编程控制这辆小车,可以完成五大特技表演:极速漂移、自动避障、直道超车、蛇形绕弯和倒车入库。而且我们的编程采用卡片式编程,手机就可以实现控制,直接将功能模块
[嵌入式]
浅谈用单片机控制SG90舵机(原理+编程)
SG90舵机(模拟舵机) 一、日常吐槽额~~~~~~,在开始今天的主题之前,占用大家一些时间。容我骂街一番,$##%%%$%#$#$$%^艹……………….,哎呀妈呀,骂的有点喘不过来了,额~呸,是言(文明人,文明人)。 可能就奇了怪了,你不好好码字,骂什么街呢!说来惭愧,上边被骂的人就是笔者自己。今天在调试程序的时候,对,就这个鬼舵机,怎么都不转!!!检查硬件---检查程序---百度,如此反复N小时。始终找不到问题所在,程序呢,怎么看,怎么美!硬件呢,怎么看,怎么帅!说是急,那是快,电闪雷鸣,刀光剑影,啪,一个数字1摔在脸上,于是乎,快速打开课本,啪~啪~啪,数字0、1,大脑瓜子一拍,哎呀,一定是这错误了!快速拿起闪闪发光的鼠标,
[单片机]
浅谈用单片机控制SG90舵机(原理+<font color='red'>编程</font>)
stm32 编程的收获,有关C语言(在stm32 公交报站中的收获)
1. char * msg = { //以下内容请自行修改 { 乘客您好,欢迎乘坐 }, { 2 路 }, //车次,采用单个数字变读(1读作幺)模式,读后恢复正常模式 { 公交车,本路车由 }, { 开往 }, { ,前门上车,后门下车,本车无人售票,请自备零钱 }, { 车辆起动,请站稳扶好 }, { 车辆转弯,请注意安全 }, { 前方到站 }, { 下车的乘客后门请 }, { 车站到了,请您带好随身物品,从后门下车,谢谢您的乘坐,再见 }, { 始发站 }, { 终点站 }, { soundk }, { 到了 } }; 指针数组:指针的数组。 在字符串定义的时候使用指针; 调用的时候 v
[单片机]
mini2440裸机编程------IIS
这段时间做了IIS的试验。被这个试验也折腾了很久。总的来讲IIS还是一个相对简单的通信协议。 s3c2440一共有5个引脚用于IIS:IISDO、IISDI、IISSCLK、IISLRCK和CDCLK。前两个引脚用于数字音频信号的输出和输入,另外三个引脚都与音频信号的频率有关。 要用好IIS,就要把信号频率设置正确。下面介绍这几个时钟: fs:采样频率。fs不是任意设置的,一般基于不同的应用场合和听觉效果,设置不同的几个固定的值,如8kHz、16kHz、22.05kHz、44.1kHz、48kHz、96kHz等。通常,在wav文件的头部中, 会给出该文件的fs。 IISSCLK:串行时钟,每一个时钟信号传送一位音频
[单片机]
基于PLC可编程控制器的楼梯照明自动化电路设计
采用PLC可编程控制器对楼梯照明进行自动化管理,是较理想化的楼梯公共照明方式。它有以下两个特点: 1、上楼或下楼只需按一下按钮,则楼梯各层照明灯可依次点亮,熄灭,每层照明时间10s,也可根据具体情况重新设定时间,可大大节约电能。 2、同一时刻有几户人家上楼或下楼时,楼梯照明灯仍能依次点亮,熄灭,所需电费将平均分摊,先结束使用照明的用户其电度表随之停止计量电费,负担合理。
[工业控制]
英特尔携手谷歌云打造端到端可编程平台
英特尔携手谷歌云打造端到端可编程平台 谷歌云C3虚拟机在私人预览版中率先采用定制款英特尔IPU和第四代英特尔至强可扩展处理器 近日,谷歌云宣布成功部署全新C3机器系列虚拟机,该平台充分利用英特尔软、硬件产品的综合优势,是打造端到端可编程平台的重要里程碑。此次谷歌云C3机器系列虚拟机的私人预览版采用第四代英特尔®至强®可扩展处理器,以及与英特尔联合设计的全新英特尔®基础设施处理器(IPU)E2000。 得益于其独特的架构方式,C3机器实例的性能相较于上一代C2实例实现了高达20%的性能提升,可有效支持数据密集型工作负载。同时,谷歌云C3虚拟机亦为未来将基础设施处理器(IPU)集成至数据中心奠定了基础,从而在加速云基
[网络通信]
英特尔携手谷歌云打造端到端可<font color='red'>编程</font>平台
JTAG推出有助于PCB测试和系统内编程的工具
JTAG Technologies推出有助于加速并简化基于IEEE 1149.x标准的边界扫描的工具JTAG ProVision,该工具可帮助工程师用最少的时间实现系统内编程。 ProVision的应用程序向导有助于用户准备测试和系统编程应用程序。图形化工具可简化设计数据的管理,JTAG Technologies的为测试而设计(DFT)的分析软件可监视覆盖范围。 该工具创建了一套测试和系统内编程方案,分析设计的边界扫描和非边界扫描部分。JTAG Technologies的器件建模方法为控制非扫描簇提供所需信息。该工具还可处理各类复杂目标,可实现从单板的单个或多个测试到复杂的多板测试。 JTAG ProVision将在四月中旬
[新品]
2007年度调查揭开嵌入式市场的真相!
嵌入式市场发展趋势的年度同比肯定会引起你的注意。人们在考虑Linux?不对。品牌忠诚度?也不是。那么,到底人们关注的是什么呢? 《Embedded Systems Design》进行了一次非常全面的年度市场调查。你们可能已经知道了这个消息,因为你已经参加了这次调查。事实上,已经有四位读者成为我们随机抽签的中奖者。 这个调查是在全球范围内进行的,大部分是通过电子邮件在今年年初进行的。调查被发给本刊物(美国版本和欧洲版本)和《EE Times》(《电子工程专辑》姊妹刊物)的部分订阅者以及我们举行的嵌入式系统研讨会(Embedded Systems Conferences)的部分出席者,超过1,000位嵌入式系统设计工程师对调查进行
[焦点新闻]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多开源项目推荐
换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved