51单片机入门——8X8点阵LED
文章目錄
- 1.初識點陣LED
- 1.1.什么是點陣LED
- 1.2.點亮LED點陣
- 1.3.點陣顯示圖案
- 2.點陣的動畫顯示
- 2.1.點陣的縱向移動
- 2.2.點陣的橫向移動
1.初識點陣LED
1.1.什么是點陣LED
LED點陣屏通過LED(發光二極管)組成,以燈珠亮滅來顯示文字、圖片、動畫、視頻等,是各部分組件都模塊化的顯示器件,通常由顯示模塊、控制系統及電源系統組成。LED點陣顯示屏制作簡單,安裝方便,被廣泛應用于各種公共場合,如汽車報站器、廣告屏以及公告牌等。
點陣LED顯示屏作為一種現代電子媒體設備,具有靈活的的顯示面積(可任意的分割和拼裝)、高亮度、長壽命、數字化、實時性等特點,應用非常廣泛。前邊學了LED小燈和LED數碼管后,學習LED點陣就要輕松多了。一個數碼管是由 8 個LED組成,同理,一個 8X8 的點陣就是由 64 個LED組成。如下圖:
其內部結構原理圖,如下圖:
1.2.點亮LED點陣
從上圖可知,每一行的LED的陽極(陰極)連接在一起由左側的 8 個引腳控制(例如:第一行的LED的陽極由第 9 號引腳控制),每一列的LED的陰極(陽極)連接在一起由上側的 8 個引腳控制。
那么如果我們把 9 號引腳置高電平、13 號引腳置低電平的話,左上角的那個LED小燈就會被點亮。我們先在proteus中建立仿真圖:
仿真結果如下:
我們可以看到,左上腳的LED被點亮了。從這里我們可以逐步發現點陣的控制原理了。我們前面講了一個數碼管就是 8 個 LED 小燈,一個點陣是 64 個 LED 小燈。同樣的道理,我們還可以把一個點陣理解成是 8 個數碼管。經過前面的學習已經掌握了 6 個數碼管同時顯示的方法,那 8 個數碼管也應該輕輕松松了。
1.3.點陣顯示圖案
獨立的 LED 小燈可以實現流水燈,數碼管可以顯示多位數字,那點陣 LED 就得來顯示一點花樣了。
我們要顯示花樣的時候,往往要先做出來一些小圖形,這些小圖形的數據要轉換到我們的程序當中去,這個時候就需要取模軟件。給大家介紹一款簡單的取模軟件,這種取模軟件在網上都可以下載到,大家來了解一下如何使用,先看一下操作界面。
鼠標點一下“新建圖形”,根據我們板子上的點陣,把寬度和高度分別改成 8,然后點確定。
點擊左側的“模擬動畫”菜單,再點擊“放大格點”選項,一直放大到最大,那我們就可以在我們的 8X8 的點陣圖形中用鼠標填充黑點,就可以畫圖形了。
大家可以看到 P0 口控制的是一行,所以用“橫向取模”,如果控制的是一列,就要選“縱向取模”。選中“字節倒序”這個選項,是因為左邊是低位 DB0,右邊是高位 DB7,所以是字節倒序,其它兩個選項大家自己了解,點確定后,選擇“取模方式”這個菜單,點一下“C51 格式”后,在“點陣生成區”自動產生了 8 個字節的數據,這 8 個字節的數據就是取出來的“模”。
大家注意,雖然我們用了軟件來取模,但是也得知道其原理是什么,在這個圖片里,黑色的一個格子表示一位二進制的 1,白色的一個格子表示一位二進制的 0。第一個字節是 0x00,其實就是這個 8X8 圖形的第一行,全黑就是 0xFF;第二個字節是 0x66,低位在左邊,高位在右邊,大家注意看,黑色的表示 1,白色的表示 0,就組成了 0x66 這個數值。同理其它的數據大家也就知道怎么來的了。
那么下面我們就用程序把這些數據依次送到點陣上去,看看運行效果如何。
對于 8X8 的點陣來說,我們可以顯示一些簡單的圖形,字符等。但大部分漢字通常來說要用到 16X16 個點,而 8X8 的點陣只能顯示一些簡單筆畫的漢字,大家可以自己取模做出來試試看。使用大屏顯示漢字的方法和小屏的方法是類似的,所需要做的只是按照相同的原理來擴展行數和列數而已。
2.點陣的動畫顯示
點陣的動畫顯示,說到底就是對多張圖片分別進行取模,使用程序算法巧妙的切換圖片,多張圖片組合起來就成了一段動畫了,我們所看到的動畫片、游戲等等,它們的基本原理也都是這樣的。
2.1.點陣的縱向移動
上一節我們學了如何在點陣上畫一個?形,有時候我們希望這些顯示是動起來的,而不是靜止的。對于點陣本身已經沒有多少的知識點可以介紹了,主要就是編程算法來解決問題了。比如我們現在要讓點陣顯示一個 I ? U 的動畫,首先我們要把這個圖形用取模軟件畫出來看一下。
這張圖片共有 24 行,每 8 行組成一張點陣圖片,并且每向上移動一行就出現了一張新圖片,一共組成了 16 張圖片。
用一個變量 index 來代表每張圖片的起始位置,每次從 index 起始向下數 8 行代表了當前的圖片,250ms 改變一張圖片,然后不停的動態刷新,這樣圖片就變成動畫了。首先我們要對顯示的圖片進行橫向取模,雖然這是 16 張圖片,由于我們每一張圖片都是和下一行連續的,所以實際的取模值只需要 24 個字節就可以完成,我們來看看程序。
#include<reg52.h>unsigned char index = 0 , tmr = 0 ; unsigned char i = 0; unsigned char image[] = {0x7E,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x66,0x99,0x81,0x81,0x42,0x24,0x18,0x00,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00 };void display() {switch(i){case 0 : P0 = 0xfe ; P2 = image[i + index] ; i ++ ; break ;case 1 : P0 = 0xfd ; P2 = image[i + index] ; i ++ ; break ;case 2 : P0 = 0xfb ; P2 = image[i + index] ; i ++ ; break ;case 3 : P0 = 0xf7 ; P2 = image[i + index] ; i ++ ; break ;case 4 : P0 = 0xef ; P2 = image[i + index] ; i ++ ; break ;case 5 : P0 = 0xdf ; P2 = image[i + index] ; i ++ ; break ;case 6 : P0 = 0xbf ; P2 = image[i + index] ; i ++ ; break ;case 7 : P0 = 0x7f ; P2 = image[i + index] ; i = 0 ; break ;} }void main() {EA = 1 ;TMOD = 0x01; //設置 T0 為模式 1TH0 = 0xFC; //為 T0 賦初值 0xFC67,定時 1msTL0 = 0x67;ET0 = 1; //使能 T0 中斷TR0 = 1; //啟動 T0while(1); }void InterruptTimer0() interrupt 1 { TH0 = 0xFC; //重新加載初值TL0 = 0x67;display();tmr ++ ;if(tmr >= 125){tmr = 0 ;index ++ ;if(index == 16)index = 0 ;} }
大家把這個程序下載到單片機上看看效果,一個 I ? U 一直往上走動的動畫就出現了,現在還有哪位敢說我們工科同學不懂浪漫的?還需要用什么玫瑰花取悅女朋友嗎?一點技術含量都沒有,要玩就玩點高科技,呵呵。
2.2.點陣的橫向移動
上下移動我們會了,那我們還想左右移動該如何操作呢?
方法一:最簡單,就是把板子側過來放,縱向取模就可以完成。
這里大家是不是有種頭頂冒汗的感覺?我們要做好技術,但是不能沉溺于技術。技術是我們的工具,我們在做開發的時候除了用好這個工具外,也得多拓展自己解決問題的思路,要慢慢培養自己的多角度思維方式。
那把板子正過來,左右移動就完不成了嗎?當然不是。大家慢慢的學多了就會培養了一種感覺,就是一旦硬件設計好了,我們要完成一種功能,大腦就可以直接思考出來能否完成這個功能,這個在我們進行電路設計的時候最為重要。我們在開發產品的時候,首先是設計電路,設計電路的時候,工程師就要在大腦中通過思維來驗證板子硬件和程序能否完成我們想要的功能,一旦硬件做好了,做好板子回來剩下的就是靠編程來完成了。只要是硬件邏輯上沒問題,功能上軟件肯定可以實現。
當然了,我們在進行硬件電路設計的時候,也得充分考慮軟件編程的方便性。因為我們的程序是用 P0 來控制點陣的整行,所以對于我們這樣的電路設計,上下移動程序是比較好編寫的。那如果我們設計電路的時候知道我們的圖形要左右移動,那我們設計電路畫板子的時候就要盡可能的把點陣橫過來放,有利于我們編程方便,減少軟件工作量。
方法二:和縱向取模一樣,將橫向的共陰數碼管看成是縱向的共陽數碼管。
我們先設計如圖的圖案。
方法三:利用二維數組來實現,算法基本上和上下移動相似。
那么下面我們要進行橫向做 I ? U 的動畫了,先把我們需要的圖片畫出來,再逐一取模,和上一張圖片類似的是,我們這個圖形共有 30 張圖片,通過程序每 125ms 改變一張圖片,就可以做出來動畫效果了。但是不同的是,我們這個是要橫向移動,橫向移動的圖片切換時的字模數據不是連續的,所以這次我們要對 30 張圖片分別取模。
最上面的圖形是橫向連在一起的效果,而實際上我們要把它分解為 30 個幀,
每幀圖片單獨取模,取出來都是 8 個字節的數據,一共就是 30X8 個數據,我們用一個二維數組來存儲它們。
下載進到板子上瞧瞧,是不是有一種帥到掉渣的感覺呢。技術這東西,外行人看的是很神秘的,其實我們做出來會發現,也就是那么回事而已,每 125ms 更改一張圖片,每 1ms在定時器中斷里刷新單張圖片的某一行。
不管是上下移動還是左右移動,大家要建立一種概念,就是我們是對一幀幀的圖片的切換,這種切換帶給我們的視覺效果就是一種動態的了。比如我們的 DV 拍攝動畫,實際上就是快速的拍攝了一幀幀的圖片,然后對這些圖片的快速回放,把動畫效果給顯示了出來。因為我們硬件設計的緣故,所以在寫上下移動程序的時候,數組定義的元素比較少,但是實際上大家也得理解成是 30 張圖片的切換顯示,而并非是真正的“移動”。
總結
以上是生活随笔為你收集整理的51单片机入门——8X8点阵LED的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: usr/bin/expect方式免密码登
- 下一篇: mac 下安装jenkins