1. 程式人生 > >(學習筆記)手把手教你學51微控制器:變數進階與點陣LED

(學習筆記)手把手教你學51微控制器:變數進階與點陣LED

一、變數的作用域

作用域:變數的有效範圍。分為:區域性變數和全域性變數。

1.1區域性變數

在函式內部宣告的變數,只在本函式內部可以使用。

1.2全域性變數

在函式外宣告的變數就是全域性變數。

二、變數的儲存類別

變數的儲存類別分為自動、靜態、暫存器和外部四種。

區域性變數如果不加static修飾都屬於自動變數。關鍵詞為auto,可以省略。

全域性變數均為靜態變數。

區域性變數加 static 關鍵字也為靜態區域性變數。特點是,只賦一次初值,在之後使用中,可以儲存前次的執行結果。

eg: static unsigned char i=0;

i 為靜態區域性變數,初始化 i=0 只執行一次。

三、點陣的初步認識

8*8點陣由64個LED小燈組成。通過控制行和列的電平來控制燈的亮滅。

點陣可以用來顯示圖形,需要用取模軟體將點陣顯示的圖形數字化,將需要顯示的的地方(亮)設定為0,將不顯示的地方(暗)設定為1,這是因為譯碼器輸出為低電平,此時一個格子為一位二進位制數字,每一行為一個位元組,例如0xff(全黑),0x00全亮從而達到顯示影象的目的。

3.1點陣的縱向移動

橫向移動時每一張圖片都是和下一行連續的。

        switch(i)
	{
		case 0:ADDR2=0;ADDR1=0;ADDR0=0;P0=LedChar[index+0];i++;break;   
		case 1:ADDR2=0;ADDR1=0;ADDR0=1;P0=LedChar[index+1];i++;break;   
		case 2:ADDR2=0;ADDR1=1;ADDR0=0;P0=LedChar[index+2];i++;break;
		case 3:ADDR2=0;ADDR1=1;ADDR0=1;P0=LedChar[index+3];i++;break;
		case 4:ADDR2=1;ADDR1=0;ADDR0=0;P0=LedChar[index+4];i++;break;
		case 5:ADDR2=1;ADDR1=0;ADDR0=1;P0=LedChar[index+5];i++;break;
		case 6:ADDR2=1;ADDR1=1;ADDR0=0;P0=LedChar[index+6];i++;break;
		case 7:ADDR2=1;ADDR1=1;ADDR0=1;P0=LedChar[index+7];i=0;break;
		default:break;
	}

用 index 代表每張圖片的起始位置,每次從index起始向下數8行代表了當前的圖片。每隔一段時間後,改變一張圖片通過index++實現,則可實現不停地動態重新整理,這樣就形成了動畫。當index代表最後一張圖片時,對index清零。

3.2點陣的橫向移動

方法1:把板子側過來放,縱向取模就可以完成。

方法2:利用二維陣列來實現,演算法基本上和上下移動相同。

3.2.1二維陣列初始化

二維陣列的初始化分為兩種情況 :

(1)陣列元素的數量小於陣列元素個數,沒有賦值的會自動給0;

unsigned char a[2][3]={{1,2}{3,4}};

等價於 unsigned char[2][3]={1,2,0,3,4,0};

(2)陣列元素等於陣列個數時如下:

unsigned char a[2][3] ={{1,2,3},{4,5,6}};

等價於 unsigned char a[2][3]={1,2,3,4,5,6};

二維陣列初始化時行數可以省略,編譯系統會自動根據列數計算出行數,但是列數不能省略。

3.2.2二維陣列實現點陣橫向移動

橫向移動時圖片切換時的字模資料不是連續的。需要對每一幀的影象進行字模轉換。

	switch(i)
	{
		case 0:ADDR2=0;ADDR1=0;ADDR0=0;P0=image[index][0];i++;break;   
		case 1:ADDR2=0;ADDR1=0;ADDR0=1;P0=image[index][1];i++;break;   
		case 2:ADDR2=0;ADDR1=1;ADDR0=0;P0=image[index][2];i++;break;
		case 3:ADDR2=0;ADDR1=1;ADDR0=1;P0=image[index][3];i++;break;
		case 4:ADDR2=1;ADDR1=0;ADDR0=0;P0=image[index][4];i++;break;
		case 5:ADDR2=1;ADDR1=0;ADDR0=1;P0=image[index][5];i++;break;
		case 6:ADDR2=1;ADDR1=1;ADDR0=0;P0=image[index][6];i++;break;
		case 7:ADDR2=1;ADDR1=1;ADDR0=1;P0=image[index][7];i=0;break;
		default:break;
	}

index代表當前幀數,0~7代表點陣的每一行。