历史上的今天
返回首页

历史上的今天

今天是:2025年08月20日(星期三)

正在发生

2021年08月20日 | 51单片机-再次优化不支持连按的代码

2021-08-20 来源:eefocus

1.还需消抖

可以看到我们在第6讲和第7讲的按键不支持连按代码中,死循环都有“delay_ms(2);”,因为大多数时候主循环都要做很多事,所以我们认为这2ms的延时是很多复杂程序要执行所消耗的时间,而正是因为这个延时函数的存在把按键的物理抖动给滤掉了,误导了我们以为这样的不支持连按代码是合格的。如果我们还是用这种写法去实现不支持连按功能,那么请把下面的代码下载进开发板通过快按和慢按K4,观察数码管的显示。

 

2.缺陷代码


#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;

    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==1)//按键已弹起

            {

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

            }

        }

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

    }

}


我们多按几次,会发现有时抬起之后cnt就被加2了,也就是在一次按键的动作里“cnt++;”被执行了两次,这是因为“SEG_task();”的执行时间太短没有滤掉按键的抖动,大家再次对照下图自己分析

4.png?imageView2/2/w/550


3.改善

有了“支持连按”的代码思路,实现消抖还是很容易的,我们同样用上times记录按键IO端口进入低电平的时间,只要times大于500证明抖动的时间已经过去,此时再判断按键是否抬起就可以决定该不该执行功能代码了。


把按键功能代码部分改为如下代码即可完善出最终的不支持连按模式的代码


//按键功能部分

if(key_up==0)

{      

    times++;     

    if(times>=500&&KEY4==1)//低电平持续够一定的时间了,证明抖动时间已经过去了,如果现在按键已经抬起就执行功能代码

    {

        times=0;

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

    }

}

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


笔者用串口测试过按下抬起的动作无论多快,这个times一般都在500以上(串口后面再学),如果我们一直按着不放,times就会一直累加,如果累加到溢出之后,times又从0开始累加,当times小于500的时候刚好松手,这样是无法执行功能代码的,

因为不满足“times>=500”的判断,所以只要大家不刻意去做这样长按不放的动作,这种情况很少发生,就算发生,概率也只有500/65536=0.0076,我们的代码还算是很实用的。

推荐阅读

史海拾趣

Comtronic Gmbh-Verbindungstechnik公司的发展小趣事

由于Comtronic Gmbh-Verbindungstechnik公司并非一个公众知名度特别高的公司,我无法提供该公司具体的5个发展起来的相关故事。不过,我可以为您提供一种通用的框架或方法,用以构建这类故事,您可以根据这个框架结合公司的实际情况进行创作。


Comtronic Gmbh-Verbindungstechnik公司发展故事框架

  1. 初创时期的技术突破
    • 描述公司创立初期,如何凭借某项关键技术或产品,在电子连接技术市场上站稳脚跟。
    • 强调创始人的远见卓识,以及对技术的执着追求。
    • 提及公司如何通过不断研发和优化,逐渐获得行业内的认可。
  2. 市场拓展与国际合作
    • 讲述公司如何逐步扩大市场份额,从国内市场走向国际市场。
    • 提及与国际知名企业或机构的合作,共同研发新产品或技术。
    • 描述公司如何通过参展、设立海外分公司等方式,提升品牌影响力。
  3. 创新引领与产业升级
    • 强调公司在电子连接技术领域的持续创新,推出了一系列具有里程碑意义的产品。
    • 描述这些创新如何推动整个电子行业的产业升级和技术进步。
    • 提及公司如何积极应对行业变革,不断调整战略和业务模式。
  4. 品质管理与客户信赖
    • 讲述公司如何注重产品质量和客户服务,赢得了客户的信赖和好评。
    • 强调公司如何通过严格的质量管理体系和售后服务体系,确保产品的稳定性和可靠性。
    • 提及客户对公司的认可和支持,以及由此带来的业务增长和市场份额的提升。
  5. 社会责任与可持续发展
    • 描述公司在发展过程中如何注重履行社会责任,积极参与公益事业。
    • 提及公司在环保、节能减排等方面的努力和成果。
    • 强调公司如何通过可持续发展战略,实现经济效益和社会效益的双赢。

您可以根据这些框架,结合Comtronic Gmbh-Verbindungstechnik公司的实际情况和公开资料,编写具体的发展故事。请注意,由于我无法获取该公司的具体细节,因此建议您在编写故事时务必保持客观和中立,避免涉及未经证实的信息或主观评价。

AMS公司的发展小趣事

AMS(Austria Microsystems)公司是一家总部位于奥地利的半导体制造商,专注于开发和生产高性能的模拟半导体解决方案。以下是 AMS 公司发展的五个相关故事:

  1. 创立与早期阶段:AMS 公司成立于1981年,最初是一家从事晶圆制造的小型企业。公司创始人团队以其对半导体技术的深刻理解和创新能力,在短时间内取得了一定的成就。早期产品主要包括模拟集成电路(IC)和传感器,为医疗、汽车、工业等领域提供解决方案。

  2. 技术创新与产品扩展:随着市场需求的不断变化和技术的进步,AMS 公司不断进行技术创新,并扩展了产品线。公司致力于开发具有高性能、低功耗和小尺寸的模拟半导体产品,以满足智能手机、消费电子、工业自动化等领域的需求。公司的产品涵盖了光学传感器、环境传感器、声学传感器等多个领域。

  3. 全球化发展与市场拓展:AMS 公司通过不断拓展全球市场,加强与客户和合作伙伴的合作关系,实现了快速的业务增长。公司在欧洲、亚洲和美洲设立了多个销售办事处和生产基地,建立了完善的全球供应链和销售网络。公司的产品销售网络覆盖了全球范围,得到了国内外客户的广泛认可。

  4. 收购与合并:随着公司规模的扩大和市场竞争的加剧,AMS 公司通过收购和合并等方式不断强化自身实力。公司先后收购了一些技术领先的公司,扩大了产品线和市场份额。此举进一步提升了公司在模拟半导体领域的竞争优势,加速了公司的业务增长。

  5. 持续创新与未来展望:AMS 公司将继续致力于技术创新和产品研发,不断提升产品性能和品质水平。公司将关注新兴技术和市场趋势,积极布局未来的发展方向,包括人工智能、物联网、汽车电子等领域。同时,公司还将加强与客户和合作伙伴的合作,共同推动行业的发展和进步。

AntennaHome公司的发展小趣事

随着公司产品的不断升级和优化,AntennaHome逐渐引起了国际大厂的注意。一家知名通信设备制造商看中了公司产品的技术优势和稳定性能,主动提出合作意向。经过多轮谈判,双方达成了合作协议,AntennaHome的产品开始进入国际市场,公司的业务规模也随之迅速扩大。

BENCENT公司的发展小趣事

在取得一系列成绩的同时,BENCENT公司也始终关注可持续发展。公司注重环保和节能技术的研发和应用,致力于为客户提供更加环保、高效的电子产品。同时,公司还积极参与社会公益事业,回馈社会。展望未来,BENCENT公司将继续坚持创新驱动、质量为本的发展理念,不断推动电子行业的进步和发展。


请注意,这些故事仅为框架性的描述,并未包含具体的细节和数据。您可以根据BENCENT公司的实际情况和发展历程,对这些故事进行进一步的丰富和完善。同时,确保在描述事实时保持客观公正的态度,避免加入主观评价。

Astema公司的发展小趣事

随着公司规模的扩大,Astema开始关注可持续发展和社会责任。公司致力于推动绿色生产,减少对环境的影响。同时,Astema还积极参与社会公益活动,回馈社会。这些举措不仅提升了公司的社会形象,还为公司的长期发展注入了新的动力。

以上这些故事只是模拟Astema公司可能的发展路径和挑战,并非真实情况。真实的电子行业公司发展历程往往更加复杂和多元,需要综合考虑多种因素。如果您对Astema公司的真实发展情况感兴趣,建议查阅相关的行业报告、公司年报或新闻报道等。

American Power Management Inc公司的发展小趣事

随着电子行业的快速发展,新技术不断涌现,市场竞争也日趋激烈。面对这一变革,APMI及时调整战略,加大研发投入,紧跟技术潮流。公司不仅推出了多款具有竞争力的新产品,还积极拓展新的应用领域,如新能源汽车、物联网等。通过不断创新和拓展,APMI成功应对了行业变革带来的挑战,保持了持续稳健的发展态势。

问答坊 | AI 解惑

给初学单片机的40个实验

给初学单片机的40个实验 网上转载仅供参考!!!!!!…

查看全部问答>

【晒电路】模拟隔离电路图

没想到第一个参加这个活动,也算是抛砖引玉一下了,希望有后来人能够找到更强悍的! 我晒得这个是一个用光作为媒介的调频传输系统。发射机把565锁相环用作电压控制振荡器,使光电隔离器的发光二极管按照与输入电压成正比的速率而闪光。光电晶体管 ...…

查看全部问答>

学林电子www.51c51.com

下载50mb 的开发资料包:实例,原理图,keil 正式版,下载实验板免费申请中 下载50个单片机程序实例和开发板原理图,学林电子免费开发板新年助学活动报名啦! 申请主贴地址:  http://www.51c51.com/bbs/thread-44274-1-1.html…

查看全部问答>

arm bank的问题

我在网上看到S3C2410A将系统的存储空间分成8个bank,每个bank的大小是128M字节。 每个bank都有一个nGCSx对应 nGCSx被叫做片选,片选上可以连接内存 那是不是一个256M的内存链接到上述一个片选上,因为一个片选对应的bank的大小只有128M,就会浪费 ...…

查看全部问答>

从nand flash中引导vxworks的一些问题

我现在有一块开发板,cpu是s3c2410,64M SDRAM, flash 只有nand flash,我现在用来做vxworks. 我改了好多天的bsp,现在仍然没有串口信息,我想请教几个问题,希望哪位大虾帮我一把,谢谢! 1)bsp中是否能支持nand flash? 2) 如果能,具体该怎 ...…

查看全部问答>

香版,TIMx_CH1和TIMx_CH2同时做PWM模式输入可以吗

请问香版,同一个的TIM的CH1,CH2能否同时做PWM模式输入还有,CH1,CH2在做PWM输入时,CH3,CH4能否做输出比较模式输出?…

查看全部问答>

指纹模块识别

用51单片机设计zaz-101指纹模块的c程序…

查看全部问答>

求助 汽车整车模型

有哪位大大能帮我建个二自由度的汽车的整车模型,研究性能是横向稳定性的??…

查看全部问答>