前天在玩OLED時想完成一直想弄得一個東西,就是簡單的單片機遊戲。由於STM32和nRF51822的內存足夠,因此就用緩存數組的方法來顯示圖像(我也不知道術語是啥,反正就是在內存中創建一個128X64的二維數組,更新顯示時將整個數組刷新到屏幕上),並且這兩個OLED是串口的(還有一個128X32的OLED,同樣串口的,連驅動時序和驅動函數都同樣,兩個都過小了,還那麼貴......),四個IO口就能驅動(兩個仍是供電的VCC和GND),因此不像以前的那個mini 12864屏幕,它是8位並口的,帶讀寫功能,而這個串口的只能寫,不能讀(那個Mini12864是5V的,我試着不加外加電路用STM32沒驅動成功,多是我水平不夠,另外總共十多個引腳,全弄轉換電路太複雜,而STM32的5V兼容當時我還不知道,就一直放着了,沒在用STM32 試過,爲了簡單點使用12864,也爲了作畢設,就又買了倆3.3V的),因此開闢一個緩存數組能夠解決讀屏幕內容這個問題。(之後看還能想着補上三種12864的照片吧)數組
可是在剛開始寫程序時就出了問題,就是對於二維數組的定義和引用出現了問題。如今解決了,顧總結以下(僅我知道的和剛剛解決的)。緩存
1:二維數組在函數定義時,要定義到列,其中列數要與要傳遞來的二維數組的列向量數一致。如:函數
定義一個二維數組:spa
unsigned char T_image[4][6]={ //就是一個俄羅斯方塊的一個圖形的四個方向變換的圖形遊戲
{0,1,0,1,1,1},內存
{ 1,0,1,1,1,0},it
{1,1,1,0,1,0},io
{0,1,1,1,0,1}};for循環
2:而後定義一個函數,此函數可以調用上面二維數組,但不限於上面一個,則定義爲:void Position_change(struct POSITION pos,unsigned char ch[][6]);,注意定義中對數組的定義,就是定義到列向量,而且下標數值與即將引用的數組的列向量下標相等值,而行向量下標則不須要寫(因此上面定義二維數組時最好行列向量下標值要統一)。使用時即可以直接傳遞一個定義了的二維數組,如在main中調用時寫爲:Position_change(pos,T_image); 就能夠了。
變量
3:若在這個定義的函數中還調用了另外一個函數Draw_position,這個函數要使用ch[][6]傳遞的函數,則在定義這個函數時和上面那個函數同樣,定義到列向量:void Draw_position(unsigned char ch[][6]);而後在上面那個函數中被調用時寫成 Draw_position(ch);就能夠了,即二維數組變量做爲傳遞函數時只須要寫方括號前面的名稱就好,不須要寫方括號,也不須要精確到列向量,和上面那個函數在main函數中調用同樣。即總體寫爲:
void Position_change(struct POSITION pos,unsigned char ch[][6])
{ Draw_position(ch);
}
4:若函數中還有對傳遞二維數組的for循環,則只須要對定義中的二維數組進行操做就好了:
for(i=0;i<4;i++)
for(n=0;n<6;n++)
if(ch[i][n]==0)....... //ch就是指定義時的參數變量名稱,定義爲啥就寫爲啥好了,就能傳遞下來了
else......
好了,基本就寫完了。其實這個很簡單,只是當時學的時候沒以爲這個重要,就簡單而過了。
之後要寫點對nRF51822的應用體驗,擬想從開箱開始(額,用了很久了,跳過吧,從怎麼鏈接電腦設置kile5並用SWD下載開始吧),可是不知道人家容許麼......
本文水平有限,內容不少詞語因爲知識問題不嚴謹或很離譜,但主要做爲記錄做用,能理解就行了,但願之後的本身和路過的大神對必要的錯誤提出批評與指點,對好笑的錯誤不要嘲笑,指出來我會改正的。