【二】【单片机】有关独立按键的实验

自定义延时函数Delay

分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中,直接使用。

 
//Delay.c
void Delay(unsigned int xms)                //@11.0592MHz
{
        
        while(xms--){
        unsigned char i, j;

        
        i = 2;
        j = 199;
        do
        {
                while (--j);
        } while (--i);
        }

}
 
//Delay.h
void Delay(unsigned int xms);                //@11.0592MHz

独立按键控制LED灯亮灭

GND表示是低电平,P31对应K1按键,P30对应K2按键,P32对应K3按键,P33对应K4按键。

K1按键按下去,表示P31为低电平,也就是P31=0。K1按键被弹起,P31为高电平,也就是P31=1。其他的按键以此类推。

 
#include <REGX52.H>
void main(){
    while(1){
        if(P3_1==0){
                P2_0=0;
        }else{
                P2_0=1;
        }
    } 
}

独立按键控制LED亮灭

独立按键控制LED灯状态

独立按键控制LED灯亮灭实验中,每当我们按下K1按键,灯亮起,如果K1被弹起,灯不亮。我们是否可以控制每当按键按下、抬起一整个阶段结束,灯才完成一次变化,亮到灭或者灭到亮?

独立按键控制LED灯的状态,每当我们按下抬起整个阶段完成,灯发生一次变化,亮到灭或者灭到亮。

 
#include <REGX52.H>
#include "Delay.h"
void main(){
    while(1){
        if(P3_1==0){
            Delay(20);
            while(P3_1==0);
            Delay(20);
            
            P2_0=~P2_0;
        }
    }

}

代码中添加Delay(20)是为了对应按键抖动。

所以我们延时20毫秒,此时按键一定处于稳定的状态。因为前后抖动加起来的时间不超过20毫秒。

所以延时20毫秒后,按键的状态可以是按下或者抬起。此时都是处于稳定的状态。

如果此时按键一直处于按下的状态,也就是P3_1=0,一直让程序空跑,直到按键被抬起,才使灯发生改变。

因为我们要使某个LED灯状态改变,所以只需要对对应二进制数进行取反即可。

独立按键控制LED灯状态

独立按键控制LED灯显示二进制

独立按键控制LED灯呈现二进制数显示。我们模拟二进制数的计算过程即可,每次进行++操作。比如说十进制的5,对应的二进制数是101,我需要让显示1的亮,显示0的不亮,所以我们还需要对二进制数进行取反。

检测范围,八个灯,全部亮是1111 1111对应的十进制数是2^8-1=255。而unsigned char的范围就是0~255。因此我们可以用unsigned char 作为二进制数的模拟数据类型。

模拟按键是完成一整个操作,状态发生一次改变。

 
#include <REGX52.H>
#include "Delay.h"

void main(){
    unsigned char LEDNum=0;
    while(1){

        if(P3_1==0){
            Delay(20);
            while(P3_1==0);
            Delay(20);
            
            LEDNum++;
            P2=~LEDNum;
                
        }
            
    }
        
}

独立按键控制LED二进制显示

独立按键控制LED灯移位

独立按键控制LED灯移位,K1按键控制LED灯左移,K2按键控制LED灯右移。

 
#include <REGX52.H>
#include "Delay.h"

void main(){
        unsigned char LEDNum=0;
        P2=~0x01;
        while(1){
                if(P3_1==0){
                        Delay(20);
                        while(P3_1==0);
                        Delay(20);
                        
                        if(LEDNum==0){
                                LEDNum=7;
                        }else{
                                LEDNum--;
                        }
                        
                        P2=~(0x01<<LEDNum);
                        
                }
                if(P3_0==0){
                        Delay(20);
                        while(P3_0==0);
                        Delay(20);
                        
                        LEDNum++;
                        if(LEDNum>=8){
                                LEDNum=0;
                        }
                        
                        P2=~(0x01<<LEDNum);
                        
        
                        
                }        
        }
        
        
        
}

这段代码是用来控制一个8位LED灯的亮灭和切换的程序,编写在51单片机上,利用了外部的两个按钮来控制LED灯的左右移动。

#include <REGX52.H>这一行代码是包含一个特定的头文件REGX52.H,这个文件中定义了使用51单片机系列中某个型号(如REGX52)时需要的一些特定功能和寄存器的地址。这是为了方便编程而直接使用单片机中的资源。

#include "Delay.h"这里包含了一个叫Delay.h的头文件,这个文件应该定义了一些延时函数,用于在程序中创建延迟。延迟在这种硬件控制程序中非常常见,用来等待硬件响应或者创建定时任务。

unsigned char LEDNum=0;定义了一个无符号字符变量LEDNum,并初始化为0。这个变量用来记录当前点亮的LED灯的编号(0-7)。

P2=~0x01;这行代码是将P2端口的值设置为~0x01(即11111110),使得第一个LED灯亮起。这里用到了位操作,~是位取反操作符,0x01是二进制的00000001,取反后变为11111110。

while(1){这是一个无限循环,意味着下面的代码会不断重复执行。

if(P3_1==0){这行代码检查P3端口的第二个引脚(P3_1)的状态是否为0(即是否被按下)。

Delay(20);调用Delay函数进行20ms的延时,用于消抖。消抖是因为当按键按下时,会有一个短暂的不稳定期,这时按键的电平可能会不断跳变。

while(P3_1==0);这是一个空的循环体,如果P3_1仍然为0,则一直在这里等待,直到按钮被释放。

Delay(20);再次调用Delay函数进行20ms的延时,进一步确保消抖完成,避免误操作。

if(LEDNum==0){ LEDNum=7; }else{ LEDNum--; }这部分逻辑是用于当P3_1被按下时,如果当前点亮的是第一个LED(LEDNum为0),则将LEDNum设置为7,即跳转到最后一个LED。否则,LEDNum减1,即向左移动一个LED。

P2=~(0x01<<LEDNum);这行代码是将P2端口的值设置为~(0x01<<LEDNum),通过左移操作和取反操作,来控制对应编号的LED灯亮起。

剩余的部分代码是处理另一个按钮(P3_0)的按下事件,逻辑与处理P3_1的按下类似,只是它是用于控制LED灯向右移动。

独立按键控制LED灯移位

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

  • 30
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妖精七七_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值