|
首先還是講一下芯片。先講164芯片,它用作行掃描,行為低電平有效(0有效)。
190152p4e70a0155z081l4.png.thumb.jpg (29.92 KB, 下載次數(shù): 187)
下載附件
2017-3-4 01:54 上傳
,這個(gè)芯片叫做移位寄存器,根據(jù)芯片手冊,把AB相連作為數(shù)據(jù)輸入端,CLK作為時(shí)鐘端,CLK是上升沿有效,來一個(gè)時(shí)鐘,輸出數(shù)據(jù)往右移動(dòng)一次。若上電 時(shí)芯片輸出為 1111 1111 1111 1111,16個(gè)高電平,上電時(shí)AB為0,時(shí)鐘信號來了一個(gè)上升沿,則AB移入寄存器,這時(shí)輸出為0111 1111 1111 1111,這時(shí)選中了一行,若AB仍然保持為0,再來一個(gè)時(shí)鐘信號時(shí),這時(shí)輸出為0011 1111 1111 1111,已經(jīng)移入了兩個(gè)0了,選中了兩行,而點(diǎn)陣是逐行掃描顯示的,就是一行一行往下顯示,每次只有一行才會(huì)顯示,切換速度加快你就看起來它們是同時(shí)顯 示的,上面有兩行選中了所以不行。所以第一個(gè)時(shí)鐘信號過后即輸出為0111 1111 1111 1111時(shí)應(yīng)該把AB設(shè)置為1,下一個(gè)時(shí)鐘信號來時(shí),由于AB為1了,所以輸出為1011 1111 1111 1111,也就是說第二個(gè)時(shí)鐘時(shí)選中了第二行,以此類推依次選中到16行,當(dāng)輸出為1111 1111 1111 1110時(shí)由于再移動(dòng)一次最低位的0就移出去了,所以這時(shí)要把AB改為0了,再來時(shí)鐘時(shí)輸出為0111 1111 1111 1111,這就是行掃描。下面將列掃描,列掃描為高電平有效(1有效)。
190153pf8i2tf9e5ffve5s.png.thumb.jpg (141.48 KB, 下載次數(shù): 142)
下載附件
2017-3-4 01:54 上傳
,這是595芯片,也是一個(gè)移位寄存器,和164的不同是有鎖存功能。鎖存功能意思就是說你的時(shí)鐘信號在給,數(shù)據(jù)也隨著時(shí)鐘信號一個(gè)一個(gè)輸入到寄存器,但 是寄存器的輸出仍然沒有改變,直到鎖存引腳有高脈沖時(shí),已經(jīng)移位好的數(shù)據(jù)才會(huì)輸出到引腳。若行數(shù)據(jù)選中的是第1行時(shí),列數(shù)據(jù)輸出為1110 1110 1110 1110這16個(gè)數(shù)據(jù)時(shí),那么就是隔一個(gè)燈亮3個(gè)燈。若沒有鎖存引腳那么,每來一個(gè)時(shí)鐘信號,輸出引腳跟著改變,燈的狀態(tài)一直在變化,直到16次之后才會(huì) 正常,這樣的話就亂了。
相信很多朋友都喜歡LED點(diǎn)陣屏吧,可是對于初學(xué)者而言,可能點(diǎn)陣的驅(qū)動(dòng)會(huì)有點(diǎn)困難。現(xiàn)在就此講解一下點(diǎn)陣的驅(qū)動(dòng)方法。上幾個(gè)圖看看我做的點(diǎn)陣的效果吧。首先上個(gè)單色點(diǎn)陣的吧,
155517sledgqem4tm2df04.jpg.thumb.jpg (51.31 KB, 下載次數(shù): 153)
下載附件
2017-3-4 01:54 上傳
,這個(gè)有原理圖,那么就給大家看看原理圖吧,
160236uixn1wjj8y0w850v.png.thumb.jpg (141.48 KB, 下載次數(shù): 156)
下載附件
2017-3-4 01:54 上傳
這個(gè)是595芯片,串入并出,作為列輸出,注意這個(gè)芯片有鎖存輸出,也就是說只有鎖存腳有脈沖信號時(shí)輸出才會(huì)改變,再看看行輸出,就是控制選通每一行的,
161449wwaz8xuaf6d9xsqz.png.thumb.jpg (29.92 KB, 下載次數(shù): 159)
下載附件
2017-3-4 01:54 上傳
,這個(gè)芯片和595主要的區(qū)別是沒有鎖存輸出,為什么行不要鎖存輸出呢?因?yàn)槊看芜x通一行,每來一個(gè)時(shí)鐘信號改變一行,若行為低電平有效,164上電默認(rèn) 輸出為1,則先移入一個(gè)0進(jìn)去,然后一直移入1,直到16行移完,再循環(huán),這里沒來一個(gè)時(shí)鐘輸出都會(huì)變一下,而如果列輸出也這樣的話,列數(shù)據(jù)是經(jīng)過16次 的變化才得到最終的正確數(shù)據(jù),而不是一次得到一個(gè)正確數(shù)據(jù)。然后繼續(xù)下一個(gè)啊,這個(gè)是雙色點(diǎn)陣
155605zcz8t8y65k3bzwpj.jpg.thumb.jpg (63.11 KB, 下載次數(shù): 169)
下載附件
2017-3-4 01:54 上傳
,這個(gè)其實(shí)是紅色、綠色、紅綠結(jié)合(橙色),這個(gè)我沒原理圖,但是這些都可以做,現(xiàn)在要自己分析了,不要原理圖!對于大部分點(diǎn)陣都是逐行掃描的,行掃描一 般都是A、B、C、D四根線組成的,再經(jīng)過譯碼形成16根行選通信號線,再加上列數(shù)據(jù)輸入線、列時(shí)鐘線、列鎖存線基本就沒什么線了,再加個(gè)OE吧,這個(gè)用 來控制亮度的,紅、綠各有自己的數(shù)據(jù)線,但其他線都是公用的,先查查里面用的芯片,再先選通一行,再寫入一個(gè)字節(jié)數(shù)據(jù),看顯示出來的和你的數(shù)據(jù)是怎么樣 的。下面展示一下彩色點(diǎn)陣,有三原色的,RGB,掃描方式是分上下兩屏同時(shí)16行掃描,數(shù)據(jù)斷獨(dú)立,控制端共用,無原理圖
155618z29jwe79ft822t0j.jpg.thumb.jpg (57.51 KB, 下載次數(shù): 158)
下載附件
2017-3-4 01:54 上傳
155620iazkoaonoxdi74za.jpg.thumb.jpg (59.53 KB, 下載次數(shù): 191)
下載附件
2017-3-4 01:54 上傳
155622zc4qjk67oppk7qfp.jpg.thumb.jpg (61.04 KB, 下載次數(shù): 156)
下載附件
2017-3-4 01:54 上傳
155624pautuatb48uubmuu.jpg.thumb.jpg (59.13 KB, 下載次數(shù): 156)
下載附件
2017-3-4 01:54 上傳
像這樣的屏幕一般都有ABCD的,前面說了這個(gè)是行掃描,16行的,然后LAT(列鎖存),CLK(時(shí)鐘),每種顏色有獨(dú)立的數(shù)據(jù)輸入。先講到這里吧,上傳幾個(gè)程序供大家參考,不是通用的啊,根據(jù)原理圖更改相應(yīng)程序。有興趣的朋友可以交流交流啊。
155648md21p126g2pl2p1d.jpg.thumb.jpg (44.53 KB, 下載次數(shù): 170)
下載附件
2017-3-4 01:54 上傳
前面發(fā)的程序是買點(diǎn)陣時(shí)送的,個(gè)人感覺不好,下面是我自己寫的:
- /*--------16*48點(diǎn)陣屏的移動(dòng)顯示------------*/
- /*--------16*48點(diǎn)陣屏的移動(dòng)顯示------------*/
- /*--------16*48點(diǎn)陣屏的移動(dòng)顯示------------*/
- /*--------16*48點(diǎn)陣屏的移動(dòng)顯示------------*/
- /*--------16*48點(diǎn)陣屏的移動(dòng)顯示------------*/
- #include < reg51.h>
- #include < intrins.h>
- typedef unsigned char uchar
- typedef unsigned int uint
- #define DATE_OUT P1 //指定P1口做為輸出
- sbit DATA=DATE_OUT^0; //列數(shù)據(jù)輸出位
- sbit LCLK=DATE_OUT^1; //列掃描時(shí)鐘位
- sbit LAT=DATE_OUT^2; //列數(shù)據(jù)鎖存位
- sbit AB =DATE_OUT^3; //行數(shù)據(jù)輸出位
- sbit HCLK =DATE_OUT^4; //行掃描時(shí)鐘位
- uchar DatCnt = 0;
- idata unsigned char TempDat[6][16]={
- {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",0第1個(gè)部分的,即第1個(gè)8列*/
- {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1第2個(gè)部分的,即第2個(gè)8列*/
- {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",0第3個(gè)部分的,即第3個(gè)8列*/
- {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1第4個(gè)部分的,即第4個(gè)8列*/
- {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",0第5個(gè)部分的,即第5個(gè)8列*/
- {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1第6個(gè)部分的,即第6個(gè)8列*/
- };//緩存數(shù)據(jù)
-
- //非常好用的字摸軟件PCtoLCD2002完美版 字模選項(xiàng):陽碼、行列式、順向
- code unsigned char DisplayDat[][16]={
- {0xFD,0xFD,0xFD,0xFC,0xC1,0xDD,0xDC,0xD1,0xDD,0xDC,0xC1,0xFD,0xFD,0xFE,0xFF,0xFF},
- {0xFF,0xFF,0xFF,0x1F,0xDF,0xDF,0x5F,0xDF,0xDF,0x1F,0xFF,0xFB,0xFB,0x03,0xFF,0xFF},/*"電",6*/
- {0xFF,0xFE,0xE1,0xFF,0xFD,0xFE,0xFE,0x80,0xFE,0xFE,0xFE,0xFE,0xF6,0xFA,0xFD,0xFF},
- {0xFF,0x0F,0xDF,0xBF,0x7F,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*"子",7*/
- {0xFF,0xFF,0xFF,0xE0,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x81,0xFF,0xFF,0xFF},
- {0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFF,0xFF},/*"工",8*/
- {0xFF,0xF9,0xC7,0xF7,0xF1,0x87,0xF3,0xE4,0xD7,0xB7,0x76,0xF7,0xF7,0xF4,0xF7,0xFF},
- {0xFF,0xCF,0x2F,0x6F,0x4F,0x3F,0xC7,0x3F,0xBF,0x87,0x3F,0xBF,0x83,0x7F,0xFF,0xFF},/*"程",9*/
- {0xFF,0xFE,0xE1,0xFD,0xFB,0xF0,0xFD,0xFB,0xF7,0xE0,0xFA,0xF6,0xEE,0xDC,0xFE,0xFF},
- {0x9F,0x7F,0xFF,0xBF,0x7F,0xFF,0xBF,0xDF,0x0F,0xEF,0xFF,0x9F,0xE7,0xF7,0xFF,0xFF},/*"系",10*/
- {0xFD,0xFD,0xFD,0xFC,0xC1,0xDD,0xDC,0xD1,0xDD,0xDC,0xC1,0xFD,0xFD,0xFE,0xFF,0xFF},
- {0xFF,0xFF,0xFF,0x1F,0xDF,0xDF,0x5F,0xDF,0xDF,0x1F,0xFF,0xFB,0xFB,0x03,0xFF,0xFF},/*"電",6*/
- {0xFF,0xFE,0xE1,0xFF,0xFD,0xFE,0xFE,0x80,0xFE,0xFE,0xFE,0xFE,0xF6,0xFA,0xFD,0xFF},
- {0xFF,0x0F,0xDF,0xBF,0x7F,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*"子",7*/
- {0xFF,0xFF,0xFF,0xE0,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x81,0xFF,0xFF,0xFF},
- {0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFF,0xFF},/*"工",8*/
- {0xFF,0xF9,0xC7,0xF7,0xF1,0x87,0xF3,0xE4,0xD7,0xB7,0x76,0xF7,0xF7,0xF4,0xF7,0xFF},
- {0xFF,0xCF,0x2F,0x6F,0x4F,0x3F,0xC7,0x3F,0xBF,0x87,0x3F,0xBF,0x83,0x7F,0xFF,0xFF},/*"程",9*/
- {0xFF,0xFE,0xE1,0xFD,0xFB,0xF0,0xFD,0xFB,0xF7,0xE0,0xFA,0xF6,0xEE,0xDC,0xFE,0xFF},
- {0x9F,0x7F,0xFF,0xBF,0x7F,0xFF,0xBF,0xDF,0x0F,0xEF,0xFF,0x9F,0xE7,0xF7,0xFF,0xFF},/*"系",10*/
- {0xFD,0xFD,0xFD,0xFC,0xC1,0xDD,0xDC,0xD1,0xDD,0xDC,0xC1,0xFD,0xFD,0xFE,0xFF,0xFF},
- {0xFF,0xFF,0xFF,0x1F,0xDF,0xDF,0x5F,0xDF,0xDF,0x1F,0xFF,0xFB,0xFB,0x03,0xFF,0xFF},/*"電",11*/
- {0xF7,0xF7,0xF7,0xEF,0xE8,0xCF,0xAC,0x6F,0xEC,0xEF,0xEC,0xED,0xED,0xEC,0xED,0xFF},
- {0x7F,0xBF,0xFF,0x83,0x7F,0x8F,0x7F,0x8F,0x7F,0x8F,0x6F,0xEF,0x8F,0x7F,0xFF,0xFF},/*"信",12*/
- {0xFF,0xFF,0xFF,0xEF,0xCF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xE7,0xFF,0xFF,0xFF},/*"1",13*/
- {0xFF,0xFF,0xFF,0xE3,0xDB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEB,0xF7,0xFF,0xFF},/*"0",14*/
- {0xFF,0xFF,0xFF,0xE3,0xDB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEB,0xF7,0xFF,0xFF},/*"0",15*/
- {0xFF,0xFF,0xFF,0xEF,0xCF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xE7,0xFF,0xFF,0xFF},/*"1",16*/
- {0xFE,0xFE,0xF2,0x8E,0xEE,0xEA,0xE2,0xCA,0xEA,0xEE,0xE9,0xE5,0x9B,0xFA,0xF7,0xFF},
- {0xFF,0xFF,0xE3,0x1F,0xDF,0xDF,0xC7,0x9F,0xDF,0xDF,0xDF,0xDF,0xC1,0x3F,0xFF,0xFF},/*"班",17*/
- {0xFF,0xFF,0xFD,0xFB,0xFB,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xFB,0xFD,0xFE,0xFF},/*"(",0*/
- {0xFF,0xF8,0xF7,0xEF,0xDF,0xBF,0xBF,0xBE,0xBE,0xBF,0xBF,0xDF,0xEF,0xF7,0xF8,0xFF},
- {0xFF,0x1F,0xEF,0xF7,0xFB,0xFD,0xFD,0x7D,0x7D,0xFD,0xFD,0xFB,0xF7,0xEF,0x1F,0xFF},/*"⊙",1*/
- {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xFF},/*"_",2*/
- {0xFF,0xF8,0xF7,0xEF,0xDF,0xBF,0xBF,0xBE,0xBE,0xBF,0xBF,0xDF,0xEF,0xF7,0xF8,0xFF},
- {0xFF,0x1F,0xEF,0xF7,0xFB,0xFD,0xFD,0x7D,0x7D,0xFD,0xFD,0xFB,0xF7,0xEF,0x1F,0xFF},/*"⊙",3*/
- {0xFF,0xFF,0xBF,0xDF,0xDF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xDF,0xDF,0xBF,0x7F,0xFF},/*")",4*/
- {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",5*/
- };
- /*下面函數(shù)掃描模式:點(diǎn)陣屏為16*48,我分成了6個(gè)16*8的,為了簡便我采用
- 16進(jìn)制寫,6個(gè)16*8的如下排列
- 1 2 3 4 5 6
- 0xff 0xfe 0xfb 0xfc 0xfe 0x55 第1行 這些數(shù)據(jù)都是我隨便寫的,做個(gè)假設(shè)
- 0xff 0xfe 0xfb 0xfc 0xfe 0x55 第2行
- 0xff 0xfe 0xfb 0xfc 0xfe 0x55 第3行
- 0xff 0xfe 0xfb 0xfc 0xfe 0x55 第4行
- ... ... ... ... ... ... ...
- ... ... ... ... ... ... ...
- 0xff 0xfe 0xfb 0xfc 0xfe 0x55 第15行
- 0xff 0xfe 0xfb 0xfc 0xfe 0x55 第16行
- */
- void Display(uchar flag)
- {
- unsigned char i,j,temp,x; //定義變量
- DATE_OUT = 0XFF; //置位高電平做準(zhǔn)備
- AB=0; //將列數(shù)據(jù)位清0,準(zhǔn)備移位,行為低電平有效
- for(i=0;i<16;i++) //因?yàn)橛?6行,所以要16次循環(huán),依次選中1行
- { //循環(huán)輸出16行數(shù)據(jù)
- HCLK=0; //為列移位做準(zhǔn)備,列移位為上升沿有效
- LAT=0; //為行鎖存做準(zhǔn)備,行鎖存輸出為上升沿有效
- for(x=6;x>0;x--) //分成了6個(gè)部分,所以循環(huán)6次,
- { //若為16*16的點(diǎn)陣,分成兩個(gè)部分就可以了,循環(huán)兩次
- if(flag == 1)
- {
- temp = TempDat[x-1][i]; //讀取點(diǎn)陣數(shù)據(jù)做輸出,這里用到ia目的是先讀取點(diǎn)陣數(shù)據(jù)的第二位字節(jié),因一行16個(gè)點(diǎn)由兩個(gè)字節(jié)組成, //電路中的移位寄存器最后一位對應(yīng)最后一列,所以要先輸出一行中的第二個(gè)字節(jié)數(shù)據(jù)
- }
- if(flag == 0) //用于清屏
- temp = 0xff; //由于我的點(diǎn)陣?yán)锩嬗昧?550三極管,相當(dāng)于非門,所以這里高電平為滅
- for(j=0;j<8;j++) //移動(dòng)列數(shù)據(jù),移動(dòng)6個(gè)字節(jié)后鎖存輸出才打開,因?yàn)?行的列數(shù)據(jù)分成了6個(gè)字節(jié)
- {
- LCLK = 0; //為列移位做準(zhǔn)備
- DATA = temp&0x01; //將數(shù)據(jù)低位做輸出,由電路圖可知,移位寄存器的最后一位對應(yīng)最后一列,因此先移最后一位
- temp >>= 1; //將數(shù)據(jù)緩沖右移一位,為下次輸出做準(zhǔn)備
- LCLK = 1; //將DATA上的數(shù)據(jù)移入寄存器
- } //移入單字節(jié)結(jié)束
- }
- HCLK = 1; //HCLK拉高,列數(shù)據(jù)移位,相應(yīng)行拉低,三極管導(dǎo)通輸出電量到相應(yīng)行點(diǎn)陣管陽極(共陽)
- LAT = 1; //LAT拉高,將數(shù)據(jù)鎖存輸出到相應(yīng)行的點(diǎn)陣發(fā)光管顯示,顯示一行后將保持到下一行顯示開始
- AB = 1; //列數(shù)據(jù)位只在第一行時(shí)為0,其它時(shí)候都為1,當(dāng)將這個(gè)0移入寄存器后,從第一位開始一直移位最后一位, //移位的過程,AB就必需是1,這是因?yàn)椴荒芡瑫r(shí)有兩個(gè)及兩個(gè)以上0的出現(xiàn),否則顯示出亂
- }
- j = 64;
- while(j--); //每一行的顯示,保持16個(gè)移位時(shí)間,因此,最后一行的顯示,也要加入保持時(shí)間,補(bǔ)嘗顯示的亮度
- HCLK = 0; //
- HCLK = 1; //將最后一行數(shù)據(jù)移出
- }
- void DisplayMoveLeft(uint DatNum,uint MoveSpeed)
- {
- uchar NextByte[16];//下半個(gè)漢字的數(shù)據(jù)
- uchar i,j=8,a,b;
-
- for(i=0;i<16;i++)
- {
- NextByte[i]=DisplayDat[DatCnt][i];
- }
- DatCnt++;
- if((DatNum*2)==DatCnt)DatCnt=0;
- while(j--)//8次移位
- {
- for(i=0;i<16;i++)//16個(gè)字節(jié)移位
- {
- for(a=0;a<5;a++)
- {
- TempDat[a][i]<<=1;
- if(TempDat[a+1][i]&0x80){TempDat[a][i]+=1;}
- }
- TempDat[5][i]<<=1;
- if(NextByte[i]&0x80)
- {
- TempDat[5][i]+=1;
- }
- NextByte[i]<<=1;
- }
- for(b=0;b<MoveSpeed;b++)
- {
- Display(1);
- }
- }
- }
- void main(void) //主入口函數(shù)
- {
- Display(0);
- while(1)
- {
- DisplayMoveLeft(30,12);
- }
- }
復(fù)制代碼
|
-
-
參考程序.rar
2017-3-4 01:51 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
13.45 KB, 下載次數(shù): 120, 下載積分: 黑幣 -5
|