细数实现流水灯的三种代码形式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hpu_zhn/article/details/83025137

     在上篇博文发出之后,有同学说,程序代码太繁琐了,不如用移位啊,数组啊一步就搞定了。由于是入门,我们当然是一步一步来了。这里我们来看一看实现流水灯的三种代码书写形式:


①顺序赋值式

#include<reg52.h>

#define uchar  unsigned char
#define uint   unsigned int 

sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;

/* ********************************************* */
// 函数名称: Delay()
// 函数功能:毫秒延时
/* ********************************************* */

void delay(uint z)
{
	uint x,y;
	for(x = 0; x < z; x++)
		for(y = 0; y < 113; y++);
}
// 函数名称: main()
// 函数功能: 实现一个LED灯一闪一闪的效果

void main(void)
{
	while(1)
	{
		LED1 = 0;           //灯亮
		delay(1000);        //持续亮1s
		LED1 = 1;           //灯灭
		delay(1000);        //持续灭1s
		LED2 = 0;
		delay(1000);
		LED2 = 1;
		delay(1000);
		LED3 = 0;
		delay(1000);
		LED3 = 1;
		delay(1000);
		LED4 = 0;           //灯亮
		delay(1000);        //持续亮1s
		LED4 = 1;           //灯灭
		delay(1000);        //持续灭1s
		LED5 = 0;
		delay(1000);
		LED5 = 1;
		delay(1000);
		LED6 = 0;
		delay(1000);
		LED6 = 1;
		delay(1000);
		LED7 = 0;
		delay(1000);
		LED7 = 1;
		delay(1000);
	}	

}

     这个便是我们昨天列出的程序,是的,这个程序代码十分冗长,但是这个程序最大的特点就是逻辑简单,用来入门,以及理解单片机的控制原理,以及sbit的用法,再合适不过了。这里对于这段代码我们就不多说了。

②移位操作式

#include <reg52.h>

#define uint unsigned int

/* ********************************************* */
// 函数名称: delay()
// 函数功能:毫秒延时
/* ********************************************* */

void delay(uint z)
{
	uint x,y;
	for(x = 0; x < z; x++)
		for(y = 0; y < 113; y++);
}

/* ***************************************************** */
// 函数名称:main()
// 函数功能:实现流水灯效果
// 入口参数:无
// 出口参数:无
/* ***************************************************** */

void main(void) 
{
	int i;						//循环变量
	while(1)	  					
	{
		P2 = 0xff;	 			//设定LED灯初始值
		delay(1000);
		for(i = 0;i < 8;i++)
		{
			P2 = P2 << 1;		//移位、依次点亮
			delay(1000);		//延时
		}
	}
}

        这段代码较上一段代码,很明显简明多了,但是逻辑性强了些,下面我们来解释一下功能函数,以及它的亮点之所在--移位。先说移位,即C语言中的移位运算符,左移运算符<<、右移运算符>>;对于移位运算符,我们简单地介绍一下,

 << 左移运算符:

              移位规则:左边抛弃,右边补零

 >>右移运算符

             移位规则: 左边用0补充,右边丢弃;

      具体函数来说,首先 赋值语句  P2 = 0xff; 0xff转换为二进制即是11111111,八个一,这里实现的作用便是给P2端口的8个I\O口全部赋高电平1,对于LED灯来说,也就是灭;接着for循环,i加1,往左移动一位,随着补0操作,即实现了对应端口的LED灯点亮,如此循环往复,也就实现了流水灯操作。

③数组赋值式

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar code table[7] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数组

/* ********************************************* */
// 函数名称: Delay()
// 函数功能:毫秒延时
/* ********************************************* */

void delay(uint z)
{
	uint x,y;
	for(x = 0; x < z; x++)
		for(y = 0; y < 113; y++);
}
/* ***************************************************** */
// 函数名称:main()
// 函数功能:实现流水灯效果
// 入口参数:无
// 出口参数:无
/* ***************************************************** */

void main()
{
	uchar i;
	while(1)
	{
		for(i=0;i<8;i++)
		{
			P2 = table[i];
			delay(300);
		}
		
	}
}
											

    不得不说,这段代码,就是前两串代码的进阶版了,因为这里引用到了数组,我也最欣赏这种代码的书写方式。

具体代码而言:

    uchar code table[7] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ; 对于数组定义,方便分析,我们把所有十六进制转换为二进制:

0xfe:11111110          0xfd:11111101      0xfb:11111011    0xf7:11110111  ;

0xef:11101111          0xdf:11011111     0xbf:10111111     0x7f:01111111  ;

     这样一写,我们就看的很清楚了,和上一串代码中的移位操作,可以说有异曲同工之妙。

具体功能函数而言,很简单,就是一个for循环,i累加一次,给P2端口赋一个值,数组的定义我们知道,

      table[0] = 0xfe、table[1] = 0xfd、table[2] = 0xfb ......table[7] = 0x7f  ; 这里明白为什么要定义这样的数组了吧,P2口共8个端口,我们每次一个位置0,给低电平,其余位都给高电平,再加上延迟函数,即实现了流水灯,这里解释一下,延时函数中的数字是我们可以更改的,以调试效果最佳为好。

    好了,以上就是这三种实现代码了,后面有很好了,我们再补充。

 

猜你喜欢

转载自blog.csdn.net/hpu_zhn/article/details/83025137