51单片机水流灯入门(理解IO口的组操作)

51单片机流水灯入门(理解IO口的组操作)

P1口接8个LED的负极,然后LED的正极经过电阻直接接Vcc


1:手工实现

1  流水灯单个闪过代码

#include <reg52.h>

void delayms(int X)
{
	int i, j;
	for(i = X;  i ; --i)
	for(j = 110;j ; --j);
	return;
}

int main()
{
	int i;
	for(i = 0; i < 8; ++i)
	{
		P1 = 0xff - (1 << i);
		delayms(500);
	}
	return 0;
}

PS:给新同学解释下,单个引脚赋值0的时候点亮

(P1只能采用十六进制数来赋值)

0xff的二进制 :             1 1 1 1 1 1 1 1 

如果要点亮第一个:    1 1 1 1 1 1 1 0

同理要点亮第二个:    1 1 1 1 1 1 0 1

即要点亮第二个,需要把 二进制的 11111101转换成十六进制数,然后赋值给P1口。

11111101的由来:

                                        1 1 1 1 1 1 1 1       => 0xff

                                   -    0 0 0 0 0 0 1 0       => 1 << 1

                                  =    1 1 1 1 1 1 0 1       =>OK~

所以代码中赋值语句为 : P1 = 0xff - (1 << i);   记住要给<<加括号哦~   (运算符优先级问题);

最后的delayms为延时函数。


2:8个灯逐个点亮,最后全亮

#include <reg52.h>

void delayms(int X)
{
	int i, j;
	for(i = X;  i ; --i)
	for(j = 110;j ; --j);
	return;
}

int main()
{
	int i, j = 0xff;
	for(i = 0; i < 8; ++i)
	{
		P1 = j <<= i;
		delayms(500);
	}
	return 0;
}

2:库函数实现