自定义延时函数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灯移位
结尾
最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!