点亮LED流水灯

之前我们已经成功在8051单片机上点亮了LED灯。但是我现在希望进阶一点,点亮一连串的LED灯。

创建工程以及将HEX文件烧录单片机

请直接查看https://www.tylerhong.cn/点亮第一个led/tylerhong/

代码编写

#include "reg52.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned int u16;

#define LED_PORT	P2

void dealy(time) {
	while (time--);
}

void main() {
	u8 i = 0;
	
	LED_PORT = ~0x01;
	
	while (1) {
		
		for (i = 0 ; i < 7 ; ++i) {
			
			LED_PORT = _crol_(LED_PORT, 1);
			dealy(50000);
		}
		
		for (i = 0 ; i < 7 ; ++i) {
			LED_PORT = _cror_(LED_PORT, 1);
			dealy(50000);
		}
		
	}
}

代码解释

#include "intrins.h"

这个是我们引入的全新头文件

当我们成功编译这个代码之后就可以点击左边文件管理器的小箭头打开这个头文件的详细内容
compile and open head file

我们可以看到_crol_和 _cror_这两个函数
two function

这两个就是我们等会儿需要使用的函数,一个代表向左移动,另一个代表向右移动

void dealy(time) {
	while (time--);
}

这个是延时函数,我们还没有学计时器,所以先用这个延时函数简单的代替一下

		for (i = 0 ; i < 7 ; ++i) {
			
			LED_PORT = _crol_(LED_PORT, 1);
			dealy(50000);
		}

这个就是主要的内容了,for循环一共执行7次是因为我们只需要做7次变换,我们有8个灯,但是初始位置的灯不需要做变换就能点亮。

_crol_(LED_PORT, 1)

这一段代码指的是将LED_PORT这个数值向左移动一位,且最左端的那位数会被补到整个的最后面,所以这个和左移<<是不一样的,左移符号是在末尾直接补0.

		for (i = 0 ; i < 7 ; ++i) {
			LED_PORT = _cror_(LED_PORT, 1);
			dealy(50000);
		}

这一段代码和上面是一样的,同理,就不做过多的解释了

运行代码

当我们把代码成功烧录刀单片机中之后按下开关。我们就可以得到下面的效果
final effect

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部