8x8單色LED點矩陣
專題目標:
本專題的目標是要設計製作一個有趣的LED點矩陣,基本上,這就是廣告看板,LED點矩陣變化很多,可由自己設計圖案和閃亮形式,其設計重點包括三個部分:第一部分「零件設計」:本電路採用89S51晶片和8X8單色LED點矩陣。第二部分「電路板設計與製作」:採用麵包板和洞洞板單面設計。第三部分「程式設計」:LED點矩陣採掃描方式驅動。為了達到這個目標,將分為硬體、軟體與整合三部,如下說明:
一、 硬體部分:本電路零件多佑採用洞洞板、裸銅線單面設計,因此電路板佈線設計難度不低。
二、 軟體部分:在此將利用Keil C設計控制程式,因而控制程式主要為掃描功能,將陣列中的資料依序輸出。LED點矩陣的變化,全視陣列內的資料而定,只要改變陣列裡的資料,級可改變LED點矩陣的圖案便話;所以,顯示資料的設計與編碼,也是在此的重點工作,另外,輸出裝置必須備和硬體設計。
三、 整合部分:利用89S51線上燒錄實驗板及其驅動程式,將我們所設計的程式燒錄到89S51晶片上。當然,也可以使用其他89S51燒錄設備來燒錄程式,在依零件表準備零件,然後將零件裝置到電路板上,並銲接妥當。最後將完成燒錄的晶片,置入我們所設計製作的電路板,即可將電源接上該電路板,再觀察電路中的LED點矩陣變化,是否符合我們的規劃。
電路圖:
方塊圖
電路圖
程式:
行 | 程式內容 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | /* mydisp.h – 8x8 單色LED矩陣燈函數 及 輸出埠 */ #define OUTP P2 #define SCANP P0 #define COUNT 11 Unsigned char code disp[8*COUNT]= { 0x00, 0x7C, 0x8A, 0x92, 0xA2, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x42, 0xFE, 0x02, 0x00, 0x00, 0x00, 0x00, 0x42, 0x86, 0x8A, 0x92, 0x62, 0x00, 0x00, 0x00, 0x84, 0x82, 0xA2, 0xD2, 0x8C, 0x00, 0x00, 0x00, 0x18, 0x28, 0x48, 0xFE, 0x08, 0x00, 0x00, 0x00, 0xE4, 0xA2, 0xA2, 0xA2, 0x9C, 0x00, 0x00, 0x00, 0x3C, 0x52, 0x92, 0x92, 0x0C, 0x00, 0x00, 0x00, 0x80, 0x8E, 0x90, 0xA0, 0xC0, 0x00, 0x00, 0x00, 0x6C, 0x92, 0x92, 0x92, 0x6C, 0x00, 0x00, 0x00, 0x60, 0x92, 0x92, 0x94, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; void delay1ms(int t) { int i,j; for (i=0;i for (j=0;j<120;j++); } void display(int base,int t,int repeat,int func,int row) { int i,col; unsigned char sean; for (i=0;i { scan=0x01; For (col=0;col<8;col++) { OUTP=0x00; SCANP=~scan; switch(func) { case0: OUTP = 0x00; break; case1: OUTP = disp[8*base+col]; break; case2: OUTP = ~disp[8*base+col]; break; case3: OUTP = disp[base+col]; break; case4: OUTP = disp[8*base+col] << row ; break; case5: OUTP = disp[8*base+col] >> row ; break; case6: OUTP = disp[8*base+col] << row | disp[8*base+col] >> (8-row); break; case7: OUTP = disp[8*base+col] >> row | disp[8*base+col] << (8-row); break; case8: OUTP = ((disp[8*base+col] & 0xF0) << row) |((disp[8*base+col] & 0xF0) >> row); break; } delay1ms(t); scan<<=1; } } } |