51单片机外设之——按键的检测(带有标志位的按键识别法)

发布者:灵感之翼最新更新时间:2018-06-22 来源: eefocus关键字:51单片机  外设  按键的检测  标志位  按键识别法 手机看文章 扫描二维码
随时随地手机看文章

前面提到了独立按键的扫描方法(延时,消抖的方法),可见这种方法很大程度上可以实现按键的准确扫描。但是仔细一看,可以发现,它有一个缺点——存在while语句的松手检测! 
试想,倘若我们一直按着按键不松手,那我们的程序毫无疑问的一直卡在了while语句的松手检测上。这在很多场合是并不适用的。 
对于独立按键的博文中所提到的配合数码管显示的实例中,由于我们数码管显示函数display() 位于主函数中,假如我们按键长时间按下,一定会存在数码管不能显示的情况。所以接下来给出一种不需要while松手检测的按键扫描——带有标志位的按键识别(在矩阵键盘同样适用,这里以独立键盘为例)。

首先附上原理图: 
这里写图片描述 
用跳帽连接排针 J5 的2脚与3脚,将键盘设置为独立按键(只有S4~S7有效)。此时,S4~S7一端分别与P3^3~P3^0相连,另一端连向GND。

其核心代码如下,以按下 S4 为例:

sbit s4 = P3^3;

uchar key_flag = 0;                             //首先定义按键的标志位,并初始化为0

void key_scan()                                 //按键扫描函数

{

    if((s4 == 0) && (!key_flag))                //如果有键按下,则条件成立(有键按下,则s4为0;而 !key_flag为1)

    {

        delay10ms();                            //延时消抖

        key_flag = 1;                           //把标志位置为1

        if(s4 == 0)                             //如果确定有键按下

        {                      

            dspbuf[0]++;                        //进行事件处理(数码管显示值加1)

        }

    }

    else if(s4 != 0)                            //未按下按键

    {

        key_flag = 0;

    }

}

其中: 
代码“key_flag = 1”的作用是:下次即便按键没有松手,程序跑完一圈之后,也不会再满足if((s4 == 0) && (!key_flag))的条件;同样,亦不会满足else if(s4 != 0)的条件,那么key_flag 不会被赋为0。综合以上情况,一次按键只会进行一次处理。当按键被释放后,以后的扫描则会满足else if(s4 != 0)的条件,那么key_flag 会被赋为0,则可以进行接下来的按键扫描了,如此反复……

综上所述,这样的按键处理,让程序减少了while的松手检测,这对于程序是十分有利的。试想,单片机有那么多的程序要处理,但是却因为按键而卡在一个地方,这确实有点得不偿失了。 
而在单片机程序执行的过程中,我们也要尽可能的少用delay()等延时函数,因为在延时的过程中,单片机基本上没有什么工作。但是这段时间对于单片机而言,也是比较宝贵的。所以在接下来的一篇博文,将介绍另一种不需要延时消抖的按键扫描方式。

未完待续……


关键字:51单片机  外设  按键的检测  标志位  按键识别法 引用地址:51单片机外设之——按键的检测(带有标志位的按键识别法)

上一篇:51单片机外设之——矩阵键盘(传统法一)
下一篇:stc89c51单片机矩阵键盘扫描

推荐阅读最新更新时间:2024-03-16 16:06

51单片机交通灯程序设计
采用51单片机作为系统的MCU,基本完成控制两组交通指示灯交替亮 每个街口有左拐、直行及行人三种指示灯。直行灯每个灯有红、黄、绿三种颜色。自行车与汽车共用左拐和直行灯。 首先东西向直行绿灯和行人灯亮1分钟,左转灯亮30秒,黄灯亮5秒(同时南北向红灯亮95秒),然后东西向红灯亮95秒钟(同时首先南北向直行绿灯和行人灯亮1分钟,左转灯亮30秒,黄灯亮5秒),然后东西向的绿灯亮,依次类推。 每次绿灯亮的时候,对应的行人灯亮。 60S/30S/5S/60S/30S/5S 东西道 绿和行人/左转/黄/红/红/红 南北道 红/红/红/绿和行人/左转/黄 行人灯亮的时候有声音提示盲人能通过。 突发交通事故的时候能够紧急全红灯。 在有重要人物通过
[单片机]
Microchip推出新型8单片机,集成独立于内核外设
电子网消息,Microchip Technology Inc.(美国微芯科技公司)日前宣布,PIC18系列产品线又新增了两款8位单片机(MCU)产品。这些单片机将控制器区域网(CAN)总线与大量独立于内核的外设(CIP)结合使用,不但增强了系统功能,而且,设计人员不需要增加复杂的软件,便能够更轻松地开发基于CAN的应用。 在基于CAN的系统中使用K83 MCU的一个关键优点是,CIP为实时事件提供了确定性响应,缩短了设计时间,并且可以采用MPLAB®代码配置器(MCC)工具方便地进行配置。这一新系列产品非常适合医疗、工业和汽车市场中使用CAN的应用,例如电动手术台、资产追踪、超声机、自动输送机和汽车配件等。在完成一项任务时,与
[半导体设计/制造]
51单片机C语言学习 3
第三课 生成HEX文件和最小化系统   在开始C语言的主要内容时,我们先来看看如何用KEIL uVISION2来编译生成用于烧写芯片的HEX文件。HEX文件格式是Intel公司提出的按地址排列的数据信息,数据宽度为字节,所有数据使用16进制数字表示, 常用来保存单片机或其他处理器的目标程序代码。它保存物理程序存储区中的目标代码映象。一般的编程器都支持这种格式。我们先来打开第一课做的第一项目,打开它的所在目录,找到test.Uv2的文件就可以打开先前的项目了。然后右击图3-1中的1项目文件夹,弹出项目功能菜单,选Options for Target'Target1',弹出项目选项设置
[单片机]
51单片机头文件究竟该如何写?
众里寻他千百度,默然回首还是看不懂你的代码! 我相信,对于初学单片机编程或其他语言编程的朋友来说,刚开始我们编程时总喜欢把所有的代码都写在一个文件中。 (当然如果你是绝世天才那就另当别论了,哈哈)。其实我也如此,刚开始我就想,将所有的代码都写在一个文件中那该多 方便,打开一个文件都可以看清。当然,起初我们很容易看明白,因为你我都知道,咱写的代码只有那寥寥几行,倒着背都 能背下来。但当后来我们写的代码越来越多时,我们往往苦于阅读自己的代码。 因此,我们可以将一个程序写在多个文件中(即以.c为后缀的文件中)。这时聪明的你就会问了,那么我写了了这么多文件,最后只通过一个按钮编译,生成HEX这个家伙,那么各文件又是怎样
[单片机]
基于51单片机超声波测距系统研究与设计
在日常生产生活中,很多场合如汽车倒车、机器人避障、工业测井、水库液位测量等需要自动进行非接触测距。超声波是指频率大于20 kHz的在弹性介质中产生的机械震荡波,其具有指向性强、能量消耗缓慢、传播距离相对较远等特点,因此常被用于非接触测距。由于超声波对光线、色彩和电磁场不敏感,因此超声波测距对环境有较好的适应能力,此外超声波测量在实时、精度、价格也能得到很好的折衷。 为此,文中尝试以单片机AT89S52为核心,利用一对40 kHz压电超声传感器设计一款体积较小、价格低廉、精度较高、具有温度补偿、实时LCD显示和报警的超声波测距仪。 1 超声波测距原理 超声波传感器分机械方式和电气方式两类,它实际上是一种换能器,在发射端
[单片机]
基于<font color='red'>51单片机</font><font color='red'>的</font>超声波测距系统<font color='red'>的</font>研究与设计
51单片机实验9:外部中断
实验:按下按键,使led状态反转。 开发板独立按键,led,mcu电路图如下: 对于中断系统的介绍参考:https://blog.csdn.net/cax1165/article/details/86633086 #include reg52.h #define uc unsigned char sbit led=P2^0; sbit k3=P3^2; void delay(uc x) { uc i,j; for(i=1;i =x;i++) for(j=1;j =110;j++); } void int0init() { IT0=1; EX0=1; EA=1; } void int0() int
[单片机]
<font color='red'>51单片机</font>实验9:外部中断
基于51单片机Proteus仿真的音乐播放器和函数发生器
音乐播放器: 实际运行效果: 51单片机Proteus仿真音乐播放器 音乐播放器原理图 音乐播放器代码链接: https://pan.baidu.com/s/1Yrjb2BtYoAcUZDdtUpbyMw 提取码:vhth 代码: #include reg52.h #include intrins.h typedef unsigned char uchar; typedef unsigned int uint; sbit K1 = P3^2; sbit Beep = P3^7; uchar i; uchar song_Index,Tone_Index=0; uchar * song_Tone, *song
[单片机]
基于<font color='red'>51单片机</font>Proteus仿真的音乐播放器和函数发生器
基于51单片机实现智能照明控制系统设计
  对一些照明时间较长、照明设备较多的场所(如学校教室、商场等),其照明系统的使用浪费现象屡见不鲜。由于缺乏科学管理和管理人员的责任心不强,有时在借助外界环境能正常工作和夜晚室内空无一人时,整个房间内也是灯火通明。这样下来,无形中所浪费的电能是非常惊人的。据测算,这种现象的耗电占其单位所有耗电的40%左右。因此,有必要在保证照明质量的前提下,实施照明节能措施。这不仅可以节约能源,而且会产生明显的经济效益。   1系统结构和工作原理   系统结构图如图1所示。本系统主要由光照检测电路、热释电红外线传感器及处理电路、单片机系统及控制电路组成。工作时,光照检测电路和热释电红外线传感器采集光照强弱、室人是否有人等信息送到单片机,单片机
[单片机]
基于<font color='red'>51单片机</font>实现智能照明控制系统<font color='red'>的</font>设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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