历史上的今天
返回首页

历史上的今天

今天是:2025年08月19日(星期二)

正在发生

2021年08月19日 | 51单片机-支持连按与全局变量

2021-08-19 来源:eefocus

1.支持连按的思路

支持连按的代码就是在“不支持连按”代码的思路上把“if(KEY4==1)”改为“if(KEY4==0)”,这样的话按键不松手程序就能一直进入“if(KEY4==0)”的大括号里面。然后我们定义一个变量times,如果一直按着不放,times就一直累加,累加到1000,意味着低电平已经持续了一定的时间,我们就可以执行功能代码了,如图所示


3.png?imageView2/2/w/550


2.全局变量

全局变量就是先在所有函数前定义,这种变量可以在所有函数中使用,例如这个变量的值发生改变成为另一个值时,假设是12,其他函数此时运用这个变量的值就是12。关于全局变量的利弊请参考《手把手教你学51单片机》文档7.1.2节。


所以这次我们把数码管显示的内容代码封装成函数,定义一个全局变量cnt,cnt在主函数中通过按键动作来改变这个值,然后数码管负责显示这个数。


实验现象就是按着K4不放,数码管显示cnt的值一直累加。

 

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;

unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化

unsigned char LedBuff[6]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//数码管显示缓存区

unsigned char cnt=0;//可以在SEG_task()和main()中使用的全局变量

  

void SEG_task()//数码管显示函数

{

    static unsigned char i=0;

    LedBuff[0]=LedChar[cnt%10];   

    if(cnt>=10)LedBuff[1]= LedChar[(cnt/10)%10];  //cnt没到达10之前不更新LedBuff[1]的初始值

    if(cnt>=100)LedBuff[2]= LedChar[(cnt/100)%10];//cnt没到达100之前不更新LedBuff[2]的初始值

    if(cnt==0){ LedBuff[1]=0xFF;LedBuff[2]=0XFF; }//cnt到达255之后再加1就溢出变为0了,这时候要再次熄灭这两个数码管

   

    P0=0xFF;//端口状态全部熄灭数码管里的LED达到刷新作用

    switch(i)

    {

        case 0:

        ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[0];i++;break;

        case 1:

        ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[1];i++;break;     

        case 2:

        ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedBuff[2];i=0;break;  

    }  

}

 

void main()

{  

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

    unsigned int  times=0; //用来记录进入过按键判断语句的次数

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

    ENLED = 0;// 

   

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

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

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

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

   

    while(1)

    { 

        SEG_task();//数码管显示任务

    

        //按键功能部分

        if(key_up==0)

        {      

            if(KEY4==0)         //之前“KEY4==1”是不支持连按,现在改为“KEY4==0”就成为支持连按了

            {

                times++;

                if(times>=1000) //按键IO端口一直是低电平times就一直累加,累加到1000意味低电平持续了一段时间了,该执行功能代码了,修改1000这个数的话那么cnt自加的速度就会改变

                {

                    times=0;

                    cnt++;      //执行功能代码

                }

            }

        }

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

    }

}


推荐阅读

史海拾趣

Colibrys SA公司的发展小趣事

Colibrys在MEMS技术方面拥有深厚的专业知识,这得益于公司长期的研发积累和不断创新的精神。许多客户委托公司建造最苛刻的航空航天、能源、铁路或汽车测试设备,这些成功案例进一步巩固了公司在行业内的领先地位。无论是用于汽车安全气囊的MEMS加速度计,还是用于引导钻头的高温加速度计,都体现了Colibrys在专业知识应用方面的卓越能力。

Holt Integrated Circuits公司的发展小趣事

自成立以来,Holt Integrated Circuits便专注于为航空电子行业提供高性能的集成电路解决方案。四十多年来,Holt始终站在技术前沿,为全球超过400家制造商提供模拟和混合信号IC数据总线解决方案。从F-16到A-350等先进飞行器,Holt的IC产品已成为飞行控制、导航、发动机管理、通信、安全系统及机上娱乐系统的核心部件。这种长期且稳定的合作关系,不仅奠定了Holt在航空电子领域的领导地位,也推动了整个行业的技术进步。

睿赫(crechip)公司的发展小趣事

在公司的快速发展过程中,睿赫公司高度重视团队建设和人才培养。公司建立了一套完善的人才选拔和培养机制,吸引了一批优秀的电子工程师和技术人才加入。同时,公司还注重员工的职业发展和福利待遇,为员工提供了广阔的发展空间和良好的工作环境。

通过团队建设和人才培养,睿赫公司的研发团队逐渐壮大,创新能力也得到了极大的提升。这使得公司能够在激烈的市场竞争中保持领先地位,不断推出具有竞争力的新产品。

DATEL Inc公司的发展小趣事

DATEL Inc.公司成立于1970年,总部位于美国马萨诸塞州。公司成立的初衷是解决当时数据采集领域的痛点,如数据准确性低、采集效率低下等问题。创始人带领一支由工程师组成的团队,开始研发第一代数据采集产品。他们日夜兼程,不断试验、调整,最终成功推出了一款体积小、功耗低、易于开发的数据采集器,这款产品迅速在市场中获得了认可。

HellermannTyton公司的发展小趣事

面对全球经济波动和行业竞争加剧的挑战,Heimann Optoelectronics Gmbh果断实施转型升级战略。公司加大在物联网、人工智能等新兴技术领域的研发投入,成功开发出了一系列智能光电传感器和解决方案。这些产品能够实时监测环境变化、智能控制设备运行,为智慧城市、智能家居等领域提供了强有力的支持。通过转型升级,公司不仅巩固了传统市场的领先地位,还成功开拓了新的增长点。

GWM Associates公司的发展小趣事
检查输入信号和电源是否正常,排除外部干扰因素。同时,检查电路中的元器件是否有损坏或失效。

问答坊 | AI 解惑

定期评选积极参与者,开发板、精美小礼品精彩大放送

从即日起,为答谢长期关心与支持电子工程世界论坛的各位研发人员,自由电子爱好者及各高校的同学们,我们每月将评选出5位论坛积极参与建设者,并发送电子开发板或其他精美小礼品,在大家共同的努力下,把我们这个虚拟的电子工程师大家庭办的更温 ...…

查看全部问答>

可以把贴片240脚芯片插在面包板上的工具

哥们为做实验,特意做了这些转接板.以方便把240脚的芯片插在面包板上.PROTEL99SE格式.有需要的朋友,拿去用吧! [ 本帖最后由 西门 于 2009-5-12 00:18 编辑 ]…

查看全部问答>

请教关于PLC系统外,增加继电器控制的必要性。

一个闸门,用10个KW的电机来驱动。 原来这套控制系统是用两路互锁继电器来控制。 现在准备用上位机+西门子S200来控制电机,正转反转以及上限下限。 本人第一次接触PLC,不是很了解通常PLC系统的可靠性。 想请教大家,在PLC控制系统之外,有 ...…

查看全部问答>

二极管参数大全

二极管种类很多。我从这个资料上看到有这几种:肖特基二极管、快恢复二极管(FAST RECOVERY RECTIFIERS)、高效整流二极管、超快速二极管、稳压二极管、开关二极管等。不知道有什么区别。 高手赐教吧…

查看全部问答>

请教:请各位大哥大姐帮我看看这个 I2C 问题,谢谢!

请教: 我的 芯片是带 SMBUS(也就是 I2C) 现在问题是: 并不是每个 I/O 都能做 I2C ,是吗? 我的 P1.0,P1.1 是用 SMBUS 其他引脚用 I2C ,那就软件模拟,是吗? 现在有两个器件需要用到 I2C , 那么有个器件只能用 别的 I/O ,用软件 ...…

查看全部问答>

EVC下写完内存映像文件后,设置文件大小失败

        HANDLE hFile=CreateFile(L\"BC.txt\",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);//EVC下这里用CreateFileForMapping         if(hFile==INVALI ...…

查看全部问答>

静止图象显示的硬件设备开发

请教高手... 我现在要开发一种设备,功能很简单,就是将几幅已有的图片(*.jpg或*.bmp)传入设备存贮器并输出至电视机.  输出部分好象可以用SED1356芯片,但具体怎么做就不知从何下手了. 请高手不吝赐教....…

查看全部问答>

求版主及高手救命,时间太紧了。

Error[e124]: Segment conflict for segment INTVEC. In module "010DT" there is a segment part that is of type RELOCATA××E, while in module "?cstart" there is a segment part that is of type COMMON Total number of errors: ...…

查看全部问答>

stm32f103,usb读取sd卡速度慢得问题

USB端点0为控制模式,端点1批量发送,端点2为批量接受,枚举正常,可以读写,问题在于读写的速度太慢了,1M的文件需要20s。请高手帮忙 usb_endp.c中 void EP2_OUT_Callback(void) {   Mass_Storage_Out(); } usb_bot.c中 void  ...…

查看全部问答>

如何发进度贴,请看此链接,谢谢配合

https://bbs.eeworld.com.cn/thread-413866-1-2.html帖子中说明了为了方便管理大家的帖子,“需要参与DIY活动的朋友请注意,直到今天板子应该都发到了大家手里,接下来大家的任务就是开始按照周计划的安排实施了,便于我们的管理,大家发一个进度帖 ...…

查看全部问答>