51单片机-不支持连按

发布者:DreamySunset最新更新时间:2021-08-19 来源: eefocus关键字:51单片机  按键模式 手机看文章 扫描二维码
随时随地手机看文章

1.缺陷

上一讲讲解的“不支持连按”模式贴合了我们在生活中的实际应用,虽然我们仅用“while(KEY4==0);”就把按键模式给切换了,不过这条语句严格来说是有缺陷的。


现在我们编写的都是简单的程序,如果后面还有更多更复杂的程序时,“while(KEY4==0);”就成为BUG了。


如果我们对按键按下不松手,那程序就一直在循环等待,不遇到高电平就不往下执行代码,如果这时有重要的程序要执行,那岂不是因按键而耽误。


还有我们再看下面这些代码


while(1)

{    

    if(KEY4==0)

    {

        delay_ms(10);//等待抖动过去

        if(KEY4==0) //二次判断

        {

            //这里执行某些功能语句

        }

    }

}


即使我们不使用“while(KEY4==0);”,只要我们按键不松手,每次都要执行“delay_ms(10);”,这样的代码称不上高效率,我们只能再次完善代码了。

 

2.改善

首先我们为了让程序做到通用性,我们定义一个key_up为unsigned char类型的变量,而不是像宋老师那样在《手把手教你学51单片机》文档8.4.3节后面的文字内容说到的利用bit类型的变量,毕竟bit类型只适合在51单片机,要是移植到其他单片机里就不适用了,所以我们不打算使用这种变量。


我们新定义的key_up变量是用来记录此时按键IO端口的扫描值,进一步分析,当按键按下不松手时,

此时的key_up等于KEY4(也就是0),当按键松手后,key_up就等于1了。

然后想进入执行功能语句时,先过了“if(key_up==0)”这一关,因为我们一直让key_up在死循环里存取KEY4的值,所以只要没有按键动作,key_up一直等于1,这样连进入功能语句的第一关都没有资格。


当有按键按下时,key_up等于0了,进入了第一关,然后我们再设最后一关,如果通过了最后一关就可以执行功能语句了,最后一关是判断“if(KEY4==1)”,也就是说如果按键没松手,就无法执行功能语句了。没错,我们这次的不支持连按模式是只有按键松手之后才去执行的,上一讲则是按下之后过了10ms就执行代码了。

 

3.代码


#include  

sbit ADDR2 = P1^2;

sbit ADDR1 = P1^1;

sbit ADDR0 = P1^0;

sbit ENLED = P1^4;

sbit ADDR3 = P1^3;

  

sbit LED2  = P0^0;

sbit KEY4  = P2^7;

 

void delay_ms(unsigned int x)

{

    unsigned int i,j;

    if(x==1000)

    {

        for(i=0;i<19601;i++)//延时1s

        {

            for(j=5;j>0;j--);

        }

    }

    else while(x--)for(j=115;j>0;j--);

}

 

void main()

{  

    unsigned char key_up=1;//定义记录按键状态值的变量,初始值为1避免程序一开始就进入了“if(key_up==0)”

    unsigned char i=1;

    ADDR3 = 1;//使能三八译码器

    ENLED = 0;// 

   

    ADDR2 = 1;//**************************

    ADDR1 = 1;//让三八译码器的IO6输出低电平

    ADDR0 = 0;//**************************

    P2 = 0xF7;//让K4能具备有被拉低的条件先

    P0 = 0xFE;//先点亮LED2

     

    while(1)

    {    

        if(key_up==0)

        {      

            if(KEY4==1)//只要不松手,KEY4就会等于0,只有在按键抬起之后才执行功能代码

            {

                P0=~(0x01<                i++;

                if(i>=8)i=0;

            }

        }

        key_up=KEY4; //如果不松手,key_up就会等于0 

        delay_ms(2); //假设这部分是要执行的其他程序

    }

}


大家可以照着代码分析一下,我们是不是已经解决了上一讲代码的两处缺陷。

关键字:51单片机  按键模式 引用地址:51单片机-不支持连按

上一篇:51单片机-按键模式
下一篇:51单片机-静态变量

推荐阅读最新更新时间:2024-11-07 11:55

51单片机入门 - 学习笔记
什么是单片机 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。 不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。
[单片机]
<font color='red'>51单片机</font>入门 - 学习笔记
接近开关的51单片机驱动程序
今天用做了个小东西:数码管显示接近开关变化值接近开关通过外部中断0连接单片机;数码管示数增加到50后清零; #include reg51.h // 引用标准库的头文件 #include intrins.h #define uchar unsigned char #define uint unsigned int #define NoOp 0x00 // 空操作寄存器 #define Digit0 0x01 // 数码管1寄存器 #define Digit1 0x02 // 数码管2寄存器 #define Digit2 0x03 // 数码管3寄存器
[单片机]
基于51单片机的舞蹈机器人步进机仿真设计
程序运行图: 仿真原理图: 部分程序: #include reg51.h #include intrins.H //8步式步进电机脉冲序列 //unsigned char steps = {0x77,0x33,0xbb,0x99,0xdd,0xcc,0xee,0x66}; unsigned char steps = {0x2,0x6,0x4,0xc,0x8,0x9,0x1,0x3}; //当前各电机在上述序列中的位置 unsigned char cur_step = {0,0,0,0,0,0,0,0}; //这个文件用于记录舞步信息序列 char speed_tickers = {0,0,0,0,0,0,0,0}; /
[单片机]
基于AT89C51单片机的温度测控系统硬件模块设计
本文主要介绍的基于AT89C51单片机的温度测控系统中最重要的一环:硬件模块设计。以下是该温度测控系统中各个模块及其工作原理。 1 温度检测模块 该系统温度测量部分采用DALLAS公司生产的一线式数字温度传感器DS18B20,它具有微型化、低功耗、高性能抗干扰能力、测量范围广、强易配处理器等优点,DS18B20可直接将温度转化成串行数字信号给单片机处理,它具有三引脚TO-92小体积封装形式,温度测量的范围为-55~+125℃,测温分辨率可达到0.062 5℃。 2 4×4行列式按键模块 该系统采用4×4行列式矩阵按键输入,其中除了0~9这10个相应数字温度按键外,还设计了温度重设按键、确定按键、零下温度选择按键和小数点按键等
[单片机]
51单片机-------流水灯(实验报告)
一、实验目的 掌握51单片机开发板的使用步骤; 掌握51单片机开发板所需软件的安装过程; 以LED流水灯实验为例子,掌握软件KEIL4的使用方法。 二、实验设备 实验仪器设备: 计算机 软件: Proteus仿真软件、KELL开发软件 三.实验任务 在单片机I/O口(P0)上依次外接八个发光二极管LED,通过程序实现LED依次闪烁显示,即不停的一亮一灭向下推移,亮,灭持续时间均为1秒。 四、实验内容及实验步骤 【注:1.项目背景 2.需求分析 3.项目内容及仿真软件(可以参考本人闪烁灯实验报告的写法link)】 4.项目内容及仿真: (1)打开Keil软件,新建一个工程,命名为“LED流水灯”; (2)选择
[单片机]
<font color='red'>51单片机</font>-------流水灯(实验报告)
基于51单片机的太阳自动跟踪系统的研究
0 引言 随着社会经济的快速发展,人类所面临的能源问题越来越突出,太阳能作为一种清洁能源,无疑受到各国的普遍重视。在相同条件下,光照强度越大,太阳能电池输出功率越大。因而增大太阳能电池受光面的光照强度,就可增大太阳能电池输出功率。除了提高太阳光电池本身的转换效应和提高蓄电池充放电效应外,对太阳的自动跟踪是太阳光伏发电系统中另一种提高转换效率的有效手段。因此,在太阳能的利用过程中,实施太阳跟踪是很有必要的。 对太阳进行跟踪的方法很多,但不外乎为采用确定太阳位置所用的两种坐标系统,即赤道坐标系和地平坐标系,并分为双轴跟踪和单轴跟踪。单轴跟踪已在很多文献作了介绍,本文要讨论的为双轴跟踪。为了叙述方便,在以后的陈述中将两种坐标系下
[单片机]
基于<font color='red'>51单片机</font>的太阳自动跟踪系统的研究
51单片机的中断控制
51系列单片机有5个中断源,2个优先级,可以实现二级中断服务嵌套结构。 现在很多兼容51的单片机已经有4个优先级(或更多)和更多的中断源了。 --------------------- 想要研究中断的嵌套,应该从中断优先级入手。 一些资料中,把有关中断优先级的中断响应原则,写成如下三条: 1、CPU同时接收到几个中断申请时,首先响应优先级级别最高的中断请求; 2、正在进行的中断过程不能被新的同级或低优先级的中断请求所中断; 3、正在进行的低优先级中断过程,能被高优先级中断请求所中断。 中断优先级的设置,是在IP寄存器中进行,IP称为中断优先级控制寄存器。 把IP中的某位置为1,则相应的中断源为高优先级;为0,则为低优先级。 当把5
[单片机]
89S51单片机智能语音拨号报警系统
电话自动报警的主要功能为: 用户根据需要把自己的手机号码、办公室电话或报警监控中心的电话预存入报警主机。报警主机不断地对所监控的设备( 门禁、烟雾探测器、窗磁、摄像头等) 状况进行巡检, 当有不安全情况( 如火灾、非法入室、视频丢失等) 发生时, 报警主机拨通预先存入的电话号码, 播放相应的警情语音。若电话占线或者无人接听,可拨下一个预存的电话号码, 如果所有预存的电话都占线或者无人接听, 则会自动把所有的预存电话重拨一遍, 保证了报警的有效性和可靠性。 1 系统组成和工作原理 系统组成框图如图1 所示。采用AT89C51 单片机 作为控制核心, 外接E2PROM 用于存储电话号码、设置参数( 定时布/撤防、联动、视频等)
[单片机]
89S<font color='red'>51单片机</font>智能语音拨号报警系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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