8×8點矩陣實驗

Download Report

Transcript 8×8點矩陣實驗

8×8點矩陣實驗
實驗目的
 瞭解點矩陣LED控制原理
 掌握用行列掃描控制的LED點矩陣編譯
實驗內容
 編寫程式,在8×8上顯示數位或者字母
實驗設備
 DMA2440XP教學平台
 ADS 1.2 試用版內建開發環境和除錯軟體
 USB連接線、串列連接線、電源
1 LED相關知識
LED即發光二極體,是嵌入式系統中常用的輸出設備。
單個LED通常用作報警之顯示,故障指示或提示信號等。
LED是一個半導體設備,當電流通過它的時候,可以產生可
見光。LED的發光強度與通過的電流強度成正比,由64個
LED組成,8行8列。
由於LED的發光顏色和發光效率與製作LED的材料和工
藝有關,目前廣泛使用的有紅、綠、藍三種。由於LED工作
電壓低(僅1.5-3V),能主動發光且 有一定亮度,亮度又
能用電壓(或電流)調節,本身又耐衝擊、抗振動、壽命長
(10萬小時),所以在大型的顯示設備中,目前尚無其他
的顯示方式與LED顯示 方式匹敵。
顯示範例
8x8 LED點矩陣的介面圖—
資料0~15通過HC574栓鎖器,再經過電晶體放大來驅動8×8 LED點矩陣,
靜態方式顯示。電路介面圖如下:
8x8 LED點矩陣的介面圖—
8x8矩陣硬體架構
Ex:
0000000101010101
0000001010101010
0000010001010101
低位元組
低
位
元
組
1000000010101010
高位元組
高
位
元
組
Ex:
0000000100000000
0000001001111110
0000010001000010
低位元組
低
位
元
組
1000000000000000
高位元組
高
位
元
組
練習題---假設三顆燈亮
高位元組(0-8)
9-15
低
位
元
組
(
)
表示第六排的LED8x8_Address=?
練習題---假設三顆燈亮
高位元組(0-8)
9-15
低
位
元
組
(
)
表示第六排的LED8x8_Address=?
00100000 11100110
掃描顯示簡介-1
原理特色
以單位時間只顯示一列資訊,由左至右
依序顯示

現場示範字母“人形”範例講解
掃描顯示簡介-2
優點
不需改變電流
可增加顯示效果
可調整亮度和顏色
設計較為方便

如何估算時間
估算的一面顯示時間=
(每排的掃描時間*8 + 每面掃描的間隔) * 掃描幾次畫面
設計亮度訣竅
每列的掃描時間太多 整體看起來不像一面圖形 畫面跳動
太少 需要更多次刷新才能維持亮度
每面掃描的間隔 太長 畫面閃爍
太短 畫面較暗
每面掃描幾次
太多 時間太長
太少 時間太短
決定亮度的設計關鍵
每排掃描時間&每面掃描的間隔 比例調整
3 實驗步驟






新建一個工程名為LED8x8,並新建原始檔案、輸入程式,設
置好工程編譯產生映像檔。
硬體連接:用串列線將PC的COM1與實驗箱的UART1連起來,
再用USB連接。
線(A->B)將PC的USB HOST介面與實驗箱的USB Device介面連
起來,最後插上12V電源。
下載、除錯並執行
結合實驗內容和原理,觀察實驗現象,實驗結果應該是8×8點
矩陣LED迴圈顯示字母或數位形狀。
完成實驗練習題。
4 8X8LED點矩陣應用程式編譯實例



相關函數說明
8×8 LED點矩陣的位址
#define
LED8X8_Address *(volatile U16 *)( 0x0x08001000 )
//nGCS1
8×8 LED點矩陣顯示函數void LED8X8_Display( U16 *LED8X8, U32 d )
參數說明: LED8X8 :特定的顯示陣列指標
D:顯示維持的次數
功能說明: 顯示一個特定的陣列裏的資料
主要程式如下:
實驗程式Test_LED8×8(void)
功能說明:動態的LED顯示
主要程式如下:
主程序Main
主要程式如下:
上面是關於該實驗涉及到的部分函數,完整的程式請看光碟目錄的exp檔
案夾下相對應實驗的工程目錄。
作業

各組發揮創意變更顯示圖案

設計程式碼,使其可以利用電腦鍵盤切換
多組顯示圖案

設計程式碼,展示LED至少兩種顯示亮度
備註




volatile 為一關鍵字 加在變數的前面
被 volatile 宣告的變數 將不會使用最佳化編譯
有時一個變數的值改變了 compiler 並不會馬上將他寫入記
憶體中而會先把結果放在CPU暫存器中 等到處理結束之後
才寫入記憶體
若說這個變數是多執行緒的flag 其他的執行緒要透過這個變
數來反應,而這個值卻又沒有寫入記憶體 這時便會發生意
想不到的結果
又或者是這變數為一個硬體的暫存器,會被硬體所改變然
而compiler 並沒有正確的將值從硬體暫存器取出來,而是
將自己暫存的值拿來使用,這種情況 就是要用volatile 來宣
告變數 告訴compiler不要自己暫存變數來提升速度
如此這個變數有任何的改變,便會馬上反應出來