上下移動我們會了,那我們還想左右移動該如何操作呢?
方法一、最簡單,就是把板子側過來放,縱向取模就可以完成。
這裡大家是不是有種頭頂冒汗的感覺?我們要做好技術,但是不能沉溺於技術。技術是我們的工具,我們在做開發的時候除了用好這個工具外,也得多拓展自己解決問題的思路,要慢慢培養自己的多角度思維方式。
那把板子正過來,左右移動就完不成了嗎?當然不是。大家慢慢的學多了就會培養了一種感覺,就是一旦硬體設計好了,我們要完成一種功能,大腦就可以直接思考出來能否完成這個功能,這個在我們進行電路設計的時候最為重要。我們在開發產品的時候,首先是設計電路,設計電路的時候,工程師就要在大腦中通過思維來驗證板子硬體和程式能否完成我們想要的功能,一旦硬體做好了,做好板子回來剩下的就是靠程式設計來完成了。只要是硬體邏輯上沒問題,功能上軟體肯定可以實現。
當然了,我們在進行硬體電路設計的時候,也得充分考慮軟體程式設計的方便性。因為我們的程式是用 p0 來控制點陣的整行,所以對於我們這樣的電路設計,上下移動程式是比較好編寫的。那如果我們設計電路的時候知道我們的圖形要左右移動,那我們設計電路畫板子的時候就要盡可能的把點陣橫過來放,有利於我們程式設計方便,減少軟體工作量。
方法二、利用二維陣列來實現,演算法基本上和上下移動相似。
二維陣列,前邊提過一次,他的使用其實也沒什麼複雜的。它的宣告方式是:
資料型別 陣列名[陣列長度 1][陣列長度 2];
與一位陣列類似,資料型別是全體元素的資料型別,陣列名是識別符號,陣列長度 1 和陣列長度 2 分別代表陣列具有的行數和列數。陣列元素的下標一律從 0 開始。
例如:unsigned char a[2][3];宣告了乙個具有 2 行 3 列的無符號字元型的二維陣列 a。
二維陣列的陣列元素總個數是兩個長度的乘積。二維陣列在記憶體中儲存的時候,採用行優先的方式來儲存,即在記憶體中先存放第 0 行的元素,再存放第一行的元素......,同一行中再按照列順序存放,剛才定義的那個 a[2][3]的存放形式就如表 7-1 所示。
表7-1 二維陣列的物理儲存結構
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
二維陣列的初始化方法分兩種情況,我們前邊學一維陣列的時候學過,陣列元素的數量可以小於陣列元素個數,沒有賦值的會自動給 0。當陣列元素的數量等於陣列個數的時候,如下所示:
unsigned char a[2][3] = , };
或者是unsigned char a[2][3] = ;
當陣列元素的數量小於陣列個數的時候,如下所示:
unsigned char a[2][3] = , };
等價於unsigned char a[2][3] = ;
而反過來的寫法
unsigned char a[2][3] = ;
等價於unsigned char a[2][3] = , };
此外,二維陣列初始化的時候,行數可以省略,編譯系統會自動根據列數計算出行數,但是列數不能省略。
講這些,只是為了讓大家了解一下,看別人寫的**的時候別發懵就行了,但是我們今後寫程式的時候,按照規範,行數列數都不要省略,全部寫齊,初始化的時候,全部寫成unsigned char a[2][3] = , };的形式,而不允許寫成一維陣列的格式,防止大家出錯,同時也是提高程式的可讀性。
那麼下面我們要進行橫向做 i ❤ u 的動畫了,先把我們需要的畫出來,再逐一取模,和上一張類似的是,我們這個圖形共有 30 張,通過程式每 250ms 改變一張,就可以做出來動畫效果了。但是不同的是,我們這個是要橫向移動,橫向移動的切換時的字模資料不是連續的,所以這次我們要對 30 張分別取模,如圖 7-11 所示。
圖 7-11 橫向動畫取模
圖 7-11 中最上面的圖形是橫向連在一起的效果,而實際上我們要把它分解為 30 個幀,每幀單獨取模,取出來都是 8 個位元組的資料,一共就是 30*8 個資料,我們用乙個二維陣列來儲存它們。
#include不管是上下移動還是左右移動,大家要建立一種概念,就是我們是對一幀幀的的切換,這種切換帶給我們的視覺效果就是一種動態的了。比如我們的 dv 拍攝動畫,實際上就是快速的拍攝了一幀幀的,然後對這些的快速回放,把動畫效果給顯示了出來。因為我們硬體設計的緣故,所以在寫上下移動程式的時候,陣列定義的元素比較少,但是實際上大家也得理解成是 32 張的切換顯示,而並非是真正的「移動」。sbit
addr0 = p1^0;
sbit
addr1 = p1^1;
sbit
addr2 = p1^2;
sbit
addr3 = p1^3;
sbit
enled = p1^4;
unsigned
char
code
image[
30][8]
=,//動畫幀 1
,//動畫幀 2
,//動畫幀 3
,//動畫幀 4
,//動畫幀 5
,//動畫幀 6
,//動畫幀 7
,//動畫幀 8
,//動畫幀 9
,//動畫幀 10
,//動畫幀 11
,//動畫幀 12
,//動畫幀 13
,//動畫幀 14
,//動畫幀 15
,//動畫幀 16
,//動畫幀 17
,//動畫幀 18
,//動畫幀 19
,//動畫幀 20
,//動畫幀 21
,//動畫幀 22
,//動畫幀 23
,//動畫幀 24
,//動畫幀 25
,//動畫幀 26
,//動畫幀 27
,//動畫幀 28
,//動畫幀 29
//動畫幀 30};
void
main
()/* 定時器 0 中斷服務函式 */
void
interrupttimer0
() interrupt 1
//以下**完成每 250ms 改變一幀影象
tmr++;
if(tmr >=
250)}}
51的LED點陣筆記
今天的學習進度到了led點陣,其實原理和班上同學在操場上用一堆蠟燭擺乙個心字型差不多。用多個led燈通過一定的組合,亮和滅的操作,達到顯示出字或形狀的效果。說到這個,和昨天學習的數碼管原理也一樣,通過led亮和滅的兩種狀態,把七條橫槓和乙個點組合成數字或字母。原理理解不難。難點 1 led點陣最小有...
自己寫的乙個行掃瞄led點陣移動顯示程式
行掃瞄的接法寫個向上移動的程式很容易,列掃瞄的接法寫個左右移動的程式很容易,只是通過字模的陣列不同取法就可以實現 但上面的接法明顯不符合實際要求,行掃瞄的時候一般都是要左右移動顯示,列掃瞄的時候一般是上下移動顯示 所以我們需要的是行掃瞄左右移動的程式,列掃瞄上下移動的程式,這樣的程式要用到陣列資料的...
007 變數的作用域和LED點陣
例如 void main 由於普中a2開發板的8 8點陣led由74hc595控制dpa dph,所以先介紹74hc595晶元。初始化 srclk為0,rclk為1 此時ser口有八位數字,從高位到低位依次為 76543210 寫入 第7位數字寫入ser srclk由0 1 上公升沿到達 ser中的...