51单片机-按键猜想

发布者:自由漫步最新更新时间:2021-08-19 来源: eefocus关键字:51单片机  按键  寄存器 手机看文章 扫描二维码
随时随地手机看文章

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

 

1.状态图

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

1.png


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

首先要测试的是我们自己快速按下按键后就松开,上图的“按键按下时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


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


关键字:51单片机  按键  寄存器 引用地址:51单片机-按键猜想

上一篇:51单片机-按键&蜂鸣器&数码管
下一篇:51单片机-按键用法

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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