嵌入式實驗 貪吃蛇 瑞 民大 LED

2021-10-01 13:10:21 字數 3688 閱讀 4953

by 草木灰

### 一、實驗內容

1、利用led矩陣、 鍵盤編寫乙個簡單的貪吃蛇遊戲

2、通過編寫貪吃蛇遊戲這一任務,理解驅動,交叉編譯,嵌入式開發

此次實驗可以實驗的目的是進一步熟練前面學過的知識,體驗嵌入式開發的過程。而且有了鍵盤和led矩陣的驅動、c語言貪吃蛇程式,任務的關鍵就是明確各個介面:

1、嵌入式開發板的led矩陣介面。

2、嵌入式開發板的鍵盤介面。

3、c語言貪吃蛇程式的顯示介面。

4、c語言貪吃蛇程式的鍵盤介面。

5、c語言貪吃蛇的頻率介面,包括地圖顯示頻率,蛇的移動頻率。

所以要求c語言貪吃蛇程式是模組化的,下面實驗準備部分著重分析各個介面。

1、嵌入式開發板的led矩陣介面

下面是led矩陣的掃瞄函式,主體是兩層for迴圈

//該程式是led驅動測試程式的一部分

d = open(device_name, o_rdwr);

for (i=1;i<=8;i++)

c = 1;

r = r<<1;

}// close

ret = close(fd);

2、嵌入式開發板的鍵盤介面

把讀取到的值存在pre_scancode,沒有鍵按下時,讀到的值為255,有按鍵被按下時反饋值為按鍵數值,比如按下 「 6 」 就反饋 「 6 」。

//該程式是鍵盤驅動測試程式的一部分

fd =

open

(device_name, o_rdwr)

;buf[0]

=0x22

;while(1

) pre_scancode = buf[0]

;usleep

(50000);

// sleep 0.05 second

}// close

ret =

close

(fd)

;

3、c語言貪吃蛇程式的顯示介面

地圖大小:

下面兩個巨集定義設定地圖大小

#define h 10 

//高

#define w 20

//寬

地圖標誌:

三種輸出分別為「 」 、「 o 」和「#」,開發板上可以設定為led亮滅

void

drawmap()

//畫地圖

else

if(i==

0||i==w-

1||j==

0||j==h-1)

//為1輸出#

else

}printf

("\n");

//別忘了換行

}}

移植測試:

修改為其他值可以使用,不影響程式執行

4、c語言貪吃蛇程式的鍵盤介面

下面是按鍵獲取函式

int

keyread

(key *key)}}

return keyreadflag;

}

移植測試:

先簡單換成鍵盤上其它鍵,確保這段函式是鍵盤介面函式。

修改介面值後按鍵無反應,修改函式列印按鍵的值。按下左鍵先檢測到224,然後檢測到75。數字小鍵盤獲得的值沒有224,直接輸出31(1鍵)。修改後,小蛇不動。

發現是程式沒有檢測到,因為這裡做移植測試是為了測試該函式是否封裝完善,所以暫時略過不管。

5、c語言貪吃蛇的頻率介面

地圖顯示頻率:

該c程式模板沒有設定地圖顯示頻率,但led的話肯定要有考慮顯示頻率的問題,簡單些可以在 drawmap() 裡面加延時函式

void

drawmap()

//畫地圖

else

if(i==

0||i==w-

1||j==

0||j==h-1)

//為1輸出#

else

}printf

("\n");

//別忘了換行

// printf("%d\n",flag_key);

}}

蛇的移動頻率:

該c程式模板沒有設定難度級——蛇的移動速率不變,可以重新寫乙個延時函式設定為難度級別

void

snakemove

(key key,snake *gamesnake,

int keywork)

else

if(i==

0||i==w-

1||j==

1||j==h-1)

else

c = c<<1;

buf_led[0]

=c;// column

} c =1;

r = r<<1;

}}

(2)、鍵盤

初始化程式:巨集定義和標頭檔案沒寫

#include

// open() close()

#include

// read() write()

#define device_name_key "/dev/keypad"

int fd_key;

fd_key =

open

(device_name_key, o_rdwr)

;buf_key[0]

=0x22

;

應用程式:將原來case的值改變即可

int

keyread

(key *key)}}

return keyreadflag;

}

(3)、頻率

根據顯示效果調整延時長短即可。

1、 warning:getch(); printf() ; scanf()等函式不可移植 ;注釋掉。

2、報錯內容:

[root@localhost drivers]# make

arm-linux-gcc -o eatingsnake eatingsnake.o

/usr/local/arm-linux/lib/gcc-lib/arm-linux/3.3.2/../../../../arm-linux/bin/ld: eatingsnake.o: relocations in generic elf (em: 3)

eatingsnake.o: could not read symbols: file in wrong format

collect2: ld returned 1 exit status

make: *** [eatingsnake] error 1

解決方法:

因為是「eatingsnake.o」報的錯誤,刪除這個檔案,將.c檔案和makefile放在新建資料夾snake下,重新編譯。
實驗總結:

可以實現貪吃蛇基本功能:led矩陣顯示小蛇, 鍵盤1、5、3、2分別控制方向左、上、右、下。

課程總結:

貪吃蛇實驗

總的來說共分為三個部分 遊戲介面 食物 蛇。遊戲介面很簡單,不多贅述。食物要實現隨機出現在介面內。蛇部分是重難點,要實現其移動 吃食物 身體的移動 碰撞檢測等等。我運用了for迴圈來列印出整個遊戲介面,以下為 部分 void print wall cout for int i 1 i n i cou...

貪吃蛇遊戲實驗報告

使用教材 c語言課程設計與遊戲開發實踐 一 實驗目的 熟悉實驗環境vc 或dev c 熟悉console的輸入和輸出 通過遊戲的需求,進一步掌握陣列的使用。二 實驗環境 dev c vc 三 實驗記錄 實驗思路 以實驗教材p87至p91頁的 為基礎,加入計分功能,計命功能,變速功能,遊戲成功和失敗出...

ARM嵌入式實驗

問題 在startup.s中增加函式,由c程式呼叫,以此取得彙編中相關引數的設定值。獲取pll中m,p值,c程式呼叫彙編函式 在c語言中,要extern 乙個函式宣告即可,然後這個函式在彙編裡面實現。在彙編裡面,用export 把c語言定義的函式名引進來,再開始編寫函式名開始的段 實現 c程式呼叫 ...