历史上的今天
返回首页

历史上的今天

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

正在发生

2021年08月19日 | 51单片机-不支持连按

2021-08-19 来源:eefocus

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); //假设这部分是要执行的其他程序

    }

}


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

推荐阅读

史海拾趣

Anachip公司的发展小趣事

品质一直是Anachip公司非常重视的一环。为了确保产品的稳定性和可靠性,公司建立了严格的品质管理体系,从原材料采购到生产过程的每一个环节都进行严格控制。同时,公司还加大了品牌建设的力度,通过广告宣传、赞助活动等方式提升品牌知名度。这些举措不仅提升了公司的市场竞争力,也赢得了客户的信任和忠诚。

艾谱科(Epticore)公司的发展小趣事

在成功推出高效能芯片后,艾谱科公司开始积极拓展市场。公司凭借其产品的技术优势,与多家知名电子产品制造商建立了合作关系。同时,艾谱科还积极参加国际电子展会,向全球客户展示其产品的卓越性能。随着市场知名度的提高,艾谱科的订单量逐渐增加,公司规模也不断扩大。

Amerace Electronic Components公司的发展小趣事

为了确保产品质量和客户满意度,Amerace Electronic Components公司建立了严格的质量管理体系。公司引进了先进的生产设备和技术,并对生产过程进行严格的监控和管理。同时,Amerace还注重员工培训和技能提升,确保员工具备高度的专业素养和责任意识。这些措施使得Amerace的产品质量得到了有效保障,赢得了客户的信任和支持。

HBControls公司的发展小趣事
如果重启无效,可能是显示屏连接线松动或损坏。需要打开冰箱后盖检查连接线是否牢固连接。
GeneSiC公司的发展小趣事
如果压缩机工作但冰箱不制冷,可能是制冷剂不足或泄漏。这需要专业人员进行检查和补充或更换制冷剂。
AEM [ American Electronic Materials]公司的发展小趣事

在电子行业的发展过程中,AEM始终保持着对技术创新的追求。公司不断投入巨资进行技术研发,引进先进的生产设备和制造工艺,致力于提升产品的性能和品质。通过多年的努力,AEM成功突破了多项技术难题,取得了一系列重要的技术成果。

此外,AEM还积极与产业上下游的企业进行合作,共同推动电子行业的发展。通过与供应商和客户的紧密合作,AEM不断优化供应链和销售渠道,提高了公司的运营效率和市场竞争力。

问答坊 | AI 解惑

工程急需:可视对讲解决方案,有意者可以联系

工程中遇到的实际问题:一座大厦,楼下部分为商业,上面为公寓写字楼,如何实现可视对讲的门禁作用?前提是:不影响商业部分使用电梯,日常营业,还要保证公寓的安全性。有这方面经验的同志们可以讨论一下。如果有具体产品,只要产品质量有保证,公 ...…

查看全部问答>

求汽车dbc 文件

跪求哪位大兄有dbc文件啊? 最近一个项目有部分要测试到汽车dbc文件。 什么型号的车都可以。 没有这种文件,我们不能测试到所购买的仪器, 也不知道怎么取CAN的数据处理。 大恩大德,无言感激。 …

查看全部问答>

冰天雪地S型裸体拜求高手指点:蓝牙模拟串口问题

硬件环境:硬件多普达智能手机带蓝牙. 软件环境:Smartphone. 程序主干: 1.g_hComDevice= RegisterDevice (L\"COM\", ComIndex, L\"btd.dll\", (DWORD)&pp);    //创建虚拟串口,本地为服务器端 2.g_hComFile = CreateFile (szComPort, ...…

查看全部问答>

请教懂VHDL的高手,帮帮忙!!!

这是一个正负脉宽数控调制信号发生器,就是没有运行成功,有的地方看不懂,请教高手帮忙解释一下,谢谢啦! LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY PULSE IS   PORT(CLK:IN STD_LOGIC;      &nbs ...…

查看全部问答>

UltraEdit的SystemVerilog关键词设置共享

SystemVerilog部分在文件末尾(/L15 打头),每个人的惯用语言不一样,如果你只需要增加SystemVerilog部分而保留其它设置,则把这最后一部分拷下贴到你的 WORDFILE.TXT中就可(别忘了把该文件设为WORDLIST文件:菜单-> 高级->配置->语法高 ...…

查看全部问答>

sd卡读写

u8 MSD_ReadBlock(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead){  u32 i = 0;  u8 rvalue = MSD_RESPONSE_FAILURE;  /* MSD chip&n ...…

查看全部问答>

谁有测量电阻的程序和电路设计给一份参考下 谢谢大家

谁有测量电阻的程序和电路设计给一份参考下 谢谢大家…

查看全部问答>

soso姐和玲珑赶紧起来发TI LM3S811的板子喽

到点了 ,赶紧起床发板子,快点的哈哈哈 ,大家都等不及了…

查看全部问答>

PCI Express设计遇到的问题

用Spartan-6做一个简单的PCIE通信板卡,在生成PCIE IP核时,开辟BAR0为128个字节的IO空间,然后直接利用生成的参考设计,生成bit文件和MCS文件。下载MCS文件到配置FLASH后,断电重新再上电后,工控机的WINDOWS XP设备管理器下能够看到该板卡,但是 ...…

查看全部问答>

arm printf函数问题

用的是arm linux交叉编译工具链编译的,连续的打印四句         printf(\"\\r\\n##### Test TFT LCD #####\\r\\n\");         printf(\"[1] TFT240320 8Bit\\n\\r\");   &nbs ...…

查看全部问答>