文章目录

  • 前言
  • 一、延时函数
  • 二、流水灯代码
  • 三、代码改进
  • 总结



前言

上次已经实现了LED的点亮了,这篇文章将带大家实现流水灯。

一、延时函数

要想实现流水灯首先就得知道什么是延时函数,延时函数的作用就是等待。比如延时一毫秒就是让程序在这里等待一毫秒。延时函数的本质就是执行一些空指令,因为执行指令需要耗费时间,所以执行一定数量的空指令就能达到延时的效果。

延时函数的实现
这里的延时函数就是不断的在执行;表达式来达到延时的效果。

/*延时函数
单位:ms
x:延时的数值
*/
void delayms(unsigned int x)
{
   unsigned char i;
	 while(x--)
	 {
		 for(i=0;i<113;i++);
	 }
}

二、流水灯代码

下面就是流水灯的代码了,其实操作起来也是非常简单的。不过这样写一个流水灯看起来实在是太过于复杂了,下面将对代码进行整改。

#include <reg52.h>

/*LED灯端口定义*/
sbit LED0 = P2^0;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit LED5 = P2^5;
sbit LED6 = P2^6;
sbit LED7 = P2^7;

/*延时函数
单位:ms
x:延时的数值
*/
void delayms(unsigned int x)
{
   unsigned char i;
	 while(x--)
	 {
		 for(i=0;i<113;i++);
	 }
}


void main()
{
	
	while(1)
	{
		LED0 = 0;
		delayms(1000);
		LED1 = 0;
		delayms(1000);
		LED2 = 0;
		delayms(1000);
		LED3 = 0;
		delayms(1000);
		LED4 = 0;
		delayms(1000);
		LED5 = 0;
		delayms(1000);
		LED6 = 0;
		delayms(1000);
		LED7 = 0;
		delayms(1000);
		LED0 = LED1 = LED2 = LED3 = LED4 = LED5 = LED6 = LED7 = 1;	
	}
}

三、代码改进

上篇文章我们已经讲到了8个LED灯分别接到了P2.0—P2.7上面。所以我们可以直接对P2端口进行操作实现点亮LED灯。
默认状态LED灯都为灭,也就是状态都为1。所以P2.0—P2.7的8个端口状态为
1111 1111。
我们只需要让其中一个位变成0即可让LED灯点亮。
对P2直接进行操作让第一个LED灯点亮就是对P2赋值如下:
1111 1110
换成16进制也就是0xfe
下面的代码就可以点亮第一个LED了

P2 = 0xfe;

所以可以直接对P2进行操作达到流水灯的效果。

#include <reg52.h>

/*延时函数
单位:ms
x:延时的数值
*/
void delayms(unsigned int x)
{
   unsigned char i;
	 while(x--)
	 {
		 for(i=0;i<113;i++);
	 }
}


void main()
{
	int i = 0;
	while(1)
	{
		
		for(i = 0; i < 8; i ++ )
		{
			P2 = ~(1<<i);
			delayms(1000);
		}
	}
		
}

板子上面有8个LED灯,所以这里设计了一个for循环。利用左移操作和取反操作实现了流水灯的效果。
简单解释一下这个for循环实现流水灯的原理
一开始i=0 P2 = ~(1<<0)相当于是1111 1110
i = 2时P2 = ~(1<<1)相当于是1111 1101
后面的以此类推,这里0移到到了哪里哪个LED就会被点亮了。
对左移和取反操作还不熟悉的同学建议去加强一下C语言的知识。

总结

流水灯的点亮就介绍到这里了,大家主要是掌握sbit位定义和直接操作P2进行流水灯的点亮。