210 likes | 349 Views
8×8 點矩陣實驗. 實驗目的 瞭解點矩陣 LED 控制原理 掌握用行列掃描控制的 LED 點矩陣編譯 實驗內容 編寫程式,在 8×8 上顯示數位或者字母 實驗設備 DMA2440XP 教學平台 ADS 1.2 試用版內建開發環境和除錯軟體 USB 連接線、串列連接線、電源. 1 LED 相關知識.
E N D
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點矩陣,靜態方式顯示。電路介面圖如下:
高位元組 低位元組 Ex: 0000000101010101 0000001010101010 0000010001010101 1000000010101010 低位元組 高位元組
高位元組 低位元組 Ex: 0000000100000000 0000001001111110 0000010001000010 1000000000000000 低位元組 高位元組
練習題---假設三顆燈亮 高位元組(0-8) 低位元組(9-15) 表示第六排的LED8x8_Address=?
練習題---假設三顆燈亮 高位元組(0-8) 低位元組(9-15) 00100000 11100110 表示第六排的LED8x8_Address=?
掃描顯示簡介-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不要自己暫存變數來提升速度如此這個變數有任何的改變,便會馬上反應出來