历史上的今天
返回首页

历史上的今天

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

正在发生

2021年08月19日 | 51单片机-按键猜想

2021-08-19 来源:eefocus

当然按键的功能不是像前两讲的代码这么单调,前两讲的代码是认识到程序中寄存器位的值是可以受外部电路影响而改变的。这一讲我们要做的就是根据前两讲的知识不断探索按键的一些规律和原理。

 

1.状态图

可能我们理想中的按键过程图如下

1.png?imageView2/2/w/550


那我们不妨在这种猜想下用代码测试看看是什么效果。

首先要测试的是我们自己快速按下按键后就松开,上图的“按键按下时P2.7的状态”持续的时间到底是多长,我们就用流水灯的方式来查看按下之后迅速松开,小灯会跳到哪里显示。

 

2.代码及分析

#include  

sbit ADDR2 = P1^2;

sbit ADDR1 = P1^1;

sbit ADDR0 = P1^0;

sbit ENLED = P1^4;

sbit ADDR3 = P1^3;

  

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 i=1;

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

    ENLED = 0;// 

   

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

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

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

     

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

    P0 = 0xFE;//先点亮最右端的小灯

 

    while(1)

    {    

        if(KEY4==0)

        {

            delay_ms(10);

            P0=~(0x01<            i++;

            if(i>=8)i=0;

        }

    }

}


#include  

sbit ADDR2 = P1^2;

sbit ADDR1 = P1^1;

sbit ADDR0 = P1^0;

sbit ENLED = P1^4;

sbit ADDR3 = P1^3;

  

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 i=1;

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

    ENLED = 0;// 

   

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

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

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

     

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

    P0 = 0xFE;//先点亮最右端的小灯

 

    while(1)

    {    

        if(KEY4==0)

        {

            delay_ms(10);

            P0=~(0x01<            i++;

            if(i>=8)i=0;

        }

    }

}


while(1)

{    

    P0=0xFF;

    switch(i)

    {

        case 0: IO0_OUT();P0=LedChar[0];break;    

        case 1: IO0_OUT();P0=LedChar[1];break;    

        case 2: IO0_OUT();P0=LedChar[2];break;    

        case 3: IO0_OUT();P0=LedChar[3];break;    

        case 4: IO1_OUT();P0=LedChar[3];break;   

        case 5: IO2_OUT();P0=LedChar[3];break;      

        case 6: IO3_OUT();P0=LedChar[3];break;    

        case 7: IO4_OUT();P0=LedChar[3];break;    

        case 8: IO5_OUT();P0=LedChar[3];break;    

        case 9: IO5_OUT();P0=LedChar[4];break;    

        case 10:IO5_OUT();P0=LedChar[5];break;   

        case 11:IO5_OUT();P0=LedChar[0];break;   

        case 12:IO4_OUT();P0=LedChar[0];break;    

        case 13:IO3_OUT();P0=LedChar[0];break;   

        case 14:IO2_OUT();P0=LedChar[0];break;  

        case 15:IO1_OUT();P0=LedChar[0];break;

    }

    if(KEY4==0)i++;

    if(i>=16)i=0;//让i在0~15之间变化

    delay_ms(30);

}


1阶段一下子来到4阶段,那么i肯定是因为按键的动作,被加了3次等于3才会在4阶段处停留,而在按键按下的动作中i自加一次之后都需要经过“delay_ms(30);”,可想而知,P2.7在按键动作中被拉低的持续时间就有60~90ms。

4.png?imageView2/2/w/550


因为我们有了“delay_ms(30);”才会看到2,3阶段有亮度的持续短时间显示,之前叫大家按着K4不放,看到的是数码管在循环做跑马灯,i在K4按下不放中KEY4一直等于0所以i一直从0~15不停的改变,加上延时部分,6个数码管上的16段灯就看起来像流水灯一样在跑了。讲解到这里我们已经对按键的原理和代码操作有一定的了解了。


推荐阅读

史海拾趣

Altonics公司的发展小趣事

为了确保产品的质量和稳定性,Altonics公司建立了严格的质量管理体系。公司从原材料采购到产品出厂的每一个环节都进行严格把控,确保产品质量符合行业标准。同时,公司还引入了先进的质量检测设备和方法,不断提高产品质量检测的准确性和效率。这些措施使得公司的产品在市场上赢得了良好的口碑。

南晶电子(DGNJDZ)公司的发展小趣事

在产品质量和技术水平得到认可后,南晶电子开始积极拓展市场。公司参加了多场国内外电子展会,与众多客户建立了合作关系。同时,南晶电子还加大了营销力度,通过线上线下相结合的方式,提高了品牌知名度和市场占有率。在短短几年内,公司实现了从国内市场到国际市场的跨越式发展。

Applied Micro Circuits (MACOM)公司的发展小趣事

在某一时期,MACOM宣布收购Applied Micro Circuits Corp.,这一举动标志着公司在业务领域上的又一次重要扩张。收购完成后,MACOM迅速进行了业务分拆,将不感兴趣的服务器芯片业务与自身的主营业务进行剥离。这一战略调整使得MACOM能够更专注于自身擅长的领域,同时也为被剥离的业务提供了更好的发展机会。

Aavid Niagra公司的发展小趣事

为了拓展市场份额,Aavid Niagra公司开始实施全球化战略布局。公司先后在多个国家和地区设立了生产基地和研发中心,以便更好地服务当地客户。同时,公司还积极参与国际电子行业的交流与合作,不断提升自身的国际影响力。全球化战略的实施为公司带来了更多的发展机遇,也使其在全球电子散热市场上占据了重要地位。

C-MAX Time Solutions公司的发展小趣事

在电子行业竞争日益激烈的今天,C-MAX Time Solutions公司始终坚持研发创新。公司不断投入资金和资源,用于新产品的研发和现有产品的升级改进。通过持续的技术创新和产品迭代,C-MAX始终保持了在电子行业中的领先地位。同时,公司还注重人才培养和团队建设,为公司的长远发展提供了有力保障。

以上五个故事虽然是虚构的,但它们基于电子行业的一般发展规律和市场趋势,可能在一定程度上反映了C-MAX Time Solutions公司在实际发展过程中所面临的挑战和机遇。当然,具体的公司发展历程还需要结合公司的实际情况和市场环境进行深入分析。

Eagle-Picher公司的发展小趣事

然而,Eagle-Picher的发展并非一帆风顺。1991年9月16日,位于密苏里州乔普林的Eagle-Picher工业公司电子部遭受了一场毁灭性的大火。火灾导致公司的电池生产设备化为灰烬,给公司的业务带来了巨大的打击。然而,Eagle-Picher并没有放弃,而是迅速组织力量进行重建和恢复生产。这一事件虽然给公司带来了短期的困难,但也展现了Eagle-Picher的坚韧和决心。

问答坊 | AI 解惑

PCB 制造的过程及工艺

首先:PCB(印刷电路板)的原料是什么呢?大家知道有种东西叫\\\\\\\\\\\"玻璃纤维\\\\\\\\\\\"吧,这种材料我们在日常生活中出处可见,比如防火布、防火毡的核心就是玻璃纤维,玻璃纤维很容易和树脂相结合,我们把结构紧密、强度高的玻纤布浸入树 ...…

查看全部问答>

请教传感器信号通过电源载波的问题

请教大家一下,我的传感器模块A输出信号是0-5V,该模块的电源是另一个模块B提供的,同时模块A的信号也要输出到模块B,但是两个模块之间只能允许一根同轴电缆通信,所以我想把0-5V的传感器的信号通电源过载波的传送,怎么实现呢? 传感器电源是12V的 ...…

查看全部问答>

嵌入式系统工具参考手册

ISE Design Suite: Embedded Edition 内包含的嵌入式系统工具(包括处理器平台调整实用程序、软件应用开发工具、调试工具链及器件驱动器与库)方面的信息…

查看全部问答>

关于定点数和浮点数的问题

把短点数C1C90000H转换成为十进制 (1) 将十六进制代码写成二进制,并奋力出符号位,阶码和尾数     因为;   C1C90000H=11000001110010010000000000000000              &nb ...…

查看全部问答>

rt_main函数进行vxworks实时仿真时需要注意的地方

各位: rtw编译后,仿真得出的模型.lo,在vxworks下总是找不到rt_main里面的一个函数:rt_ODEUpdateCouinousState,这是为什么啊?麻烦各位帮个忙指点一下…

查看全部问答>

芯片测试82538

我现在要编一C程序测试控制卡上的52835芯片是否能正常工作!以前没有搞过,有没有哪位大哥搞过类似的东西?急呀!!!…

查看全部问答>

还是LCD1602显示问题,帮忙看下代码?

刚学习不久,代码写的比较烂,主要想学习下LCD,抄了下某开发板的代码,自己改了下,代码如下: #include #include #include #include #include #define uchar unsigned char #define uint  unsigned int sbit E=P2^7;  &n ...…

查看全部问答>

求助:stm32发热

                                 新做了一块板子,开始好好的,几个通讯模块都测试通过了,只是LM1117有点热(我的电源是12v通过7805变成5v,再由LM ...…

查看全部问答>

NIOS2 SD卡 SPI操作函数

unsigned char CS_EN,DI_EN ;void delay(int i){    while(i>0)    {    i--;    }}unsigned char Write_Cmd(unsigned char *cmd,unsigned char lres){    unsigned ...…

查看全部问答>