基于STC89C52,使用独立按键对LED进行一些基础的控制

按键控制LED亮灭

首先我们需要对独立按键有一个基本的了解,通过查看原理图

TQ79DYMMFALRH6BK7RYSb7e0ffdbd24a0491.png

可以发现,该板子的独立按键与寄存器P3相连,独立按键的值存放在寄存器中,我们无法对其进行赋值,只能检查寄存器的值,当存放在寄存器中的值为0的时候,代表寄存器成功接地,即开关按下,寄存器中存放1,表示开关是弹开的。

所以我们可以通过这个特点来实现开关按下时灯亮,松开时灯熄:

#include <REGX52.H>
​
void main()
{
    while(1)                            //注意放在循环体内
    {
        if(P3_0==0 || P3_1==0)                  //开关按下,点亮
        {
            P2_3=0;
        }
        else                                //开关松开,熄灭
            P2_3=1;
    }
}

按键控制LED状态

通过查询独立按键的特性具有如下特点

a415ebe2a169436f9c6538c8a19aad84c23c47c49872a163.png

 

当按键按下时金属片不会瞬间接通而是会回弹一段后稳定接通,松开时也不会瞬间松开,而是会回弹,通过了解,金属片状态改变时,回弹的时间大约为20ms,所以我们在按下和关闭按键时,要延迟大约20ms后再对按键状态进行判断。

总结逻辑为:当按键按下(寄存器中值为0)时,等20ms确保它稳定了,再对按钮状态判断,如果此时寄存器的值还是0,说明我们按下按键还没松开,程序就循环执行判断,一旦按键松开(寄存器中值不为0),跳出循环,等20ms确保它稳定了,对LED灯的值取反,即使其状态改变。此时成功完成了 一次按下松开按钮,使LED状态改变:

#include <REGX52.H>
void Delay(int n)   //@12.000MHz        ms
{       
    unsigned char data i, j;
    while(n--)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
    }
}
void main()
{
    while(1)
    {
        if(P3_1==0)
        {
            Delay(20);
            while(P3_1==0);
            Delay(20);
            P2_0=~P2_0;
        }
    }
}

按键控制LED显示二进制

在按键控制LED状态的基础上,我们将每次按下并松开一次按钮后,添加一个对P2寄存器的值改变的操作,我们想要控制LED显示二进制,我们用0表示灯灭,一表示灯亮即变化规律为0000 0000->0000 0001->0000 0010->0000 0011,对应的二进制数在不断增大,而在LED灯的控制中,0为亮,1为灭,所以我们将P2的初值赋为0xFF,每控制一次按键,P2的值减少一个。

即可实现LED显示二进制:

#include <REGX52.H>
​
void Delay(int n)   //@12.000MHz        ms
{       
    unsigned char data i, j;
    while(n--)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
    }
}
 
void main()
{
    P2=0xFF;
    while(1)
    {
        if(P3_1==0)
        {
            Delay(20);
            while(P3_1==0);
            Delay(20);
            
            P2--;
        }
    }
}

按键控制LED移位

依旧是在按键控制LED状态的基础上,我们将每次按下并松开一次按钮后,添加一个对P2寄存器的值改变的操作,只是这一次是将LED移位,我们可以使用移位操作符<<和>>来实现左移和右移

使用一个无符号计数变量,num,每当按下左侧按钮(我这个板子为P3_1)时,num就会减少1;每当按下右侧按钮(我这个板子为P3_0)时,num就会增加1,操作完按钮后,就会根据num的值,对8取余,来对初始状态0xFE进行移位,实现按键控制LED移位:

#include <REGX52.H>
​
void Delay(int n)   //@12.000MHz        ms
{       
    unsigned char data i, j;
    while(n--)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
    }
}
unsigned int num=0;
void main()
{
    P2=0xFE;
​
    while(1)
    {
        if(P3_1==0)
        {
            Delay(20);
            while(P3_1==0);
            Delay(20);
            num--;
            P2=~(0x01>>(num%8));
        }
        if(P3_0==0)
        {
            Delay(20);
            while(P3_0==0);
            Delay(20);
            num++;
             P2=~(0x01<<(num%8));
        }
    }
}
  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值