1. 程式人生 > >細數實現流水燈的三種程式碼形式

細數實現流水燈的三種程式碼形式

     在上篇博文發出之後,有同學說,程式程式碼太繁瑣了,不如用移位啊,陣列啊一步就搞定了。由於是入門,我們當然是一步一步來了。這裡我們來看一看實現流水燈的三種程式碼書寫形式:

①順序賦值式

#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,給低電平,其餘位都給高電平,再加上延遲函式,即實現了流水燈,這裡解釋一下,延時函式中的數字是我們可以更改的,以除錯效果最佳為好。

    好了,以上就是這三種實現程式碼了,後面有很好了,我們再補充。