點(diǎn)陣屏顯示原理及實(shí)驗(yàn)詳解.doc_第1頁
點(diǎn)陣屏顯示原理及實(shí)驗(yàn)詳解.doc_第2頁
點(diǎn)陣屏顯示原理及實(shí)驗(yàn)詳解.doc_第3頁
點(diǎn)陣屏顯示原理及實(shí)驗(yàn)詳解.doc_第4頁
點(diǎn)陣屏顯示原理及實(shí)驗(yàn)詳解.doc_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

標(biāo)題:LED點(diǎn)陣屏學(xué)習(xí)攻略 共享資料2010-8-13 8:5044LED點(diǎn)陣屏學(xué)習(xí)攻略 在經(jīng)歷了將近一個(gè)學(xué)期斷斷續(xù)續(xù)的點(diǎn)陣屏學(xué)習(xí)后,最后終于在AVR平臺(tái)下完成了128*32點(diǎn)陣屏的無閃爍顯示?,F(xiàn)把整個(gè)學(xué)習(xí)過程總結(jié)如下:無論是51單片機(jī)還是AVR單片機(jī),點(diǎn)陣屏的顯示原理是一樣的,所以首先從51講起。說明:以下所有試驗(yàn)如無特殊說明均在Keil uVision3 + Proteus 6.9 SP5下仿真完成。一基于51的點(diǎn)陣屏顯示:(1)點(diǎn)亮第一個(gè)8*8點(diǎn)陣: 1.首先在Proteus下選擇我們需要的元件,AT89C52、74LS138、MATRIX-8*8-GREEN(在這里使用綠色的點(diǎn)陣)。在Proteus 6.9中8*8的點(diǎn)陣總共有四種顏色,分別為MATRIX-8*8-GREEN,MATRIX-8*8-BLUE,MATRIX-8*8-ORANGE ,MATRIX-8*8-RED。在這里請(qǐng)大家牢記:紅色的為上列選下行選;其它顏色的為上行選下列選!而所有的點(diǎn)陣都是高電平選中列,低電平選中行!也就是說如果某一個(gè)點(diǎn)所處的行信號(hào)為低,列信號(hào)為高,則該點(diǎn)被點(diǎn)亮!此結(jié)論是我們編程的基礎(chǔ)。 2.在選擇完以上三個(gè)元件后,我們開始布線,具體如下圖:這里P2是列選,P3連接38譯碼器后作為行選。選擇38譯碼器的原因:38譯碼器每次可輸出相應(yīng)一個(gè)I/O口的低電平,正好與點(diǎn)陣屏的低電平選中行相對(duì),并且節(jié)省了I/O口,大大方便了我們的編程和以后的擴(kuò)展。3.下面讓我們把它點(diǎn)亮,先看一個(gè)簡(jiǎn)單的程序:(將奇數(shù)行偶數(shù)列的點(diǎn)點(diǎn)亮,效果如下圖)下面是源代碼:/*8*8LED點(diǎn)陣屏顯示*/#includevoid delay(int z) /延時(shí)函數(shù) int x,y; for(x=0;xz;x+) for(y=0;y110;y+);void main() while(1) P3=0; /行選,選擇第一行 P2=0x55; /列選,即該行顯示的數(shù)據(jù) delay(5); /延時(shí) /*下同*/ P3=2; /第三行 P2=0x55; delay(5); P3=4; /第五行 P2=0x55; delay(5); P3=6; /第七行 P2=0x55; delay(5); 上面的程序?qū)崿F(xiàn)了將此8*8點(diǎn)陣的奇數(shù)行偶數(shù)列的點(diǎn)點(diǎn)亮的功能。重點(diǎn)讓我們看while循環(huán)內(nèi),首先是行選P3=0,此時(shí)38譯碼器的輸入端為000,則輸出端為01111111,即B0端為低電平,此時(shí)選中了點(diǎn)陣屏的第一行,接著列選我們給P2口賦0x55,即01010101,此時(shí)又選中了偶數(shù)列,緊接著延時(shí)。然后分別對(duì)第三、五、七行進(jìn)行相同的列選。這樣就點(diǎn)亮了此點(diǎn)陣屏奇數(shù)行偶數(shù)列交叉的點(diǎn)。完成這個(gè)程序,我們會(huì)發(fā)現(xiàn)其實(shí)點(diǎn)陣屏的原理是如此簡(jiǎn)單,和數(shù)碼管的動(dòng)態(tài)顯示非常相似,只不過換了一種方式而已。4.完成了上面的點(diǎn)亮過程,下面我們讓這個(gè)8*8的點(diǎn)陣屏顯示一個(gè)漢字:“明”先看效果圖:源代碼如下:/*8*8LED點(diǎn)陣屏顯示*/#includechar code table=0x0f,0xe9,0xaf,0xe9,0xaf,0xa9,0xeb,0x11; /明 字編碼 void delay(int z) /延時(shí)函數(shù) int x,y; for(x=0;xz;x+) for(y=0;y110;y+);void main() int num; while(1) /循環(huán)顯示 for(num=0;num8;num+) /8行掃描 P3行選,P2列選 P3=num; /行選 P2=tablenum; /列選 delay(5); /延時(shí) 因?yàn)橐@示一個(gè)漢字,這里我們使用了一個(gè)數(shù)組table 來存儲(chǔ)該字的編碼,重點(diǎn)還是來看while循環(huán),首先在for循環(huán)內(nèi)完成對(duì)8*8點(diǎn)陣屏的8行依次掃描。我們來分析第一行的情況即num=0的時(shí)候,首先P3=0,選中第一行,然后P2=table0,即P2等于table數(shù)組中第一個(gè)數(shù)據(jù)0x0f,則此時(shí)就點(diǎn)亮了第一行相應(yīng)的點(diǎn)。接著延時(shí),其他行同理。這樣我們就完成了一個(gè)最簡(jiǎn)單漢字的顯示。(2)16*16點(diǎn)陣的顯示原理 1.雖然完成了上面8*8點(diǎn)陣的顯示,但是由于點(diǎn)的數(shù)量太少以至于它的顯示效果并不是很理想,事實(shí)上現(xiàn)在大部分點(diǎn)陣的漢字都是16*16顯示的,下面讓我們來學(xué)習(xí)16*16點(diǎn)陣的顯示。和上面一樣我們先選擇元件:AT89C52,74LS138,,MATRIX-8*8-GREEN,因?yàn)橐@示16*16的漢字,我們就不能再使用一個(gè)38譯碼器進(jìn)行行選了,這里我們用兩個(gè)38譯碼器組合成一個(gè)4選16的譯碼器(當(dāng)然也可以使用74159)。而MATRIX-8*8-GREEN點(diǎn)陣需要4個(gè)。完成后如下圖:2.先來看看4選16的譯碼器是如何工作的,這里有4個(gè)輸入端a、b、c、d,16個(gè)輸出端H0H15,如上圖連線后即可完成類似于38譯碼器一樣的工作。只不過擴(kuò)展到了16行選。關(guān)于連線的原理這里不再贅述,只要明白38譯碼器的原理這個(gè)可以輕松理解。接著完成全部布線。如下圖所示:3.連好線后,P1作為行選,P2、P3一起作為列選。現(xiàn)在16*16的點(diǎn)陣被分成兩塊并不完整的部分,我們可以整體移動(dòng)(包括點(diǎn)陣屏、連線以及連接點(diǎn),)來方便我們觀察顯示的效果(最好同時(shí)去掉仿真中電平的指示燈)。接著我們來看一個(gè)程序,還是讓此點(diǎn)陣屏顯示一個(gè)漢字:“明”。先看效果圖:源代碼如下:/*16*16LED點(diǎn)陣屏顯示*/#includechar code table=0x00,0x20,0x20,0x7F,0x7E,0x21,0x22,0x21, 0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21, 0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21, 0x80,0x20,0x80,0x20,0x40,0x28,0x20,0x10; / “明” void delay(int z) int x,y; for(x=0;xz;x+) for(y=0;y110;y+);void main() int num; while(1) for(num=0;num16;num+) P1=num; /行選 P2=table2*num; /列選 P3=table2*num+1; /列選 delay(2); 4.先來看這次使用的table數(shù)組,因?yàn)槭?6*16的點(diǎn)陣,所以總共有32個(gè)數(shù)據(jù),其中第1、2個(gè)數(shù)據(jù)用于第一行的顯示,第2、3個(gè)數(shù)據(jù)用于第二行的顯示,以此類推,總共16行。然后還是來看while循環(huán)內(nèi),同樣for循環(huán)依次掃描16行,以第一行為例,即num=0時(shí),首先P1=0,選中第一行,P2=table0、P3=table1送出列選數(shù)據(jù),即第一行要顯示的兩個(gè)字節(jié)的數(shù)據(jù)。其他行同理。這樣很輕松的我們就完成了16*16點(diǎn)陣的顯示。程序雖然完成了,但是回過頭來看一看就會(huì)發(fā)現(xiàn),我們?cè)谶@里使用了P2與P3口一起來做列選,浪費(fèi)了大量的I/O/資源,而且現(xiàn)在點(diǎn)陣屏的大小還只有16*16,如果想要擴(kuò)展的更大,已經(jīng)沒有足夠的I/O口可用了。所以一定要想出更好的辦法進(jìn)行列選。5.為了解決上面提到的問題,我們來學(xué)習(xí)一個(gè)新的元件:74HC595。它實(shí)質(zhì)上是一個(gè)串行移位寄存器,能夠?qū)崿F(xiàn)“串入并出”的功能,關(guān)于它的使用我們還是用上一個(gè)列子來講解,先來看看它的實(shí)現(xiàn),如圖:可以看到這里我們僅使用了三個(gè)I/O口就完成了列選數(shù)據(jù)的發(fā)送。主要來看74HC595是如何實(shí)現(xiàn)“串入并出”的,這里我們使用了兩個(gè)595進(jìn)行了級(jí)聯(lián),即第二個(gè)595的數(shù)據(jù)輸入端連接了第一個(gè)595的級(jí)聯(lián)輸出口Q7。也就是說,我們只需要從第一個(gè)595的輸入端串行輸入數(shù)據(jù),便可以實(shí)現(xiàn)把數(shù)據(jù)送入第二個(gè)595的功能。而且595的數(shù)量可以進(jìn)行無限的級(jí)聯(lián),而不管有多少個(gè)595,我們只需要一個(gè)數(shù)據(jù)輸入端就可以,這樣就大大節(jié)省了I/O資源。對(duì)于595的具體使用還是來看程序。源代碼如下:/*16*16LED點(diǎn)陣屏顯示*/#includesbit R=P20; /數(shù)據(jù)輸入端口 sbit CLK=P21; / 時(shí)鐘信號(hào) sbit STB=P22; / 鎖存端 char code table=0x00,0x20,0x20,0x7F,0x7E,0x21,0x22,0x21, 0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21, 0x22,0x21,0x22,0x3F,0x3E,0x21,0x22,0x21, 0x80,0x20,0x80,0x20,0x40,0x28,0x20,0x10; / “明” void delay(int z) int x,y; for(x=0;xz;x+) for(y=0;y110;y+);void WriteByte(char dat) /寫一個(gè)字節(jié)的數(shù)據(jù) char i; for(i=0;i1; /右移一位,取出該字節(jié)的最低位 R=CY; /將該字節(jié)的最低位傳給R CLK=0; /將數(shù)據(jù)移入595,上升沿 CLK=1; void main() int num; while(1) for(num=0;num1,把要輸入的數(shù)據(jù)右移一位,這樣最低位便進(jìn)入移位寄存器CY中,緊接著我們讓R=CY,把該位傳給595的輸入端,CLK一個(gè)上升沿的跳變就實(shí)現(xiàn)了把該位數(shù)據(jù)移入595的功能。8次循環(huán)便可以將一個(gè)字節(jié)的數(shù)據(jù)送出。重點(diǎn)還是看while循環(huán)內(nèi),同樣也是16行的掃描,然后就是WriteByte(table2*num)等同于上面的P2=table2*num,WriteByte(table2*num+1)等同于P3=table2*num+1,完成列選,接著行選,然后有一個(gè)STB的下降沿的跳變,這個(gè)變化能夠?qū)崿F(xiàn)并行輸出移位寄存器中的數(shù)據(jù)。這樣就完成了整個(gè)過程。(3)16*16點(diǎn)陣的移位控制 點(diǎn)陣的移位一般有上、下、左、右的移動(dòng),這里我們重點(diǎn)講上移和左移,其它同理。1. 點(diǎn)陣的上移:點(diǎn)陣的上移相對(duì)來說很簡(jiǎn)單,看效果圖如下:源代碼:(該程序?qū)崿F(xiàn)了循環(huán)上移顯示“邢臺(tái)”)/*16*16LED點(diǎn)陣屏顯示*/#includesbit R=P20; /數(shù)據(jù)輸入端口 sbit CLK=P21; / 時(shí)鐘信號(hào) sbit STB=P22; / 鎖存端 char code table=/*- 文字: 邢 -*/*- 宋體12; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 -*/ 0x00,0x00,0xFE,0x3E,0x48,0x22,0x48,0x22, 0x48,0x12,0x48,0x12,0x48,0x0A,0xFF,0x13, 0x48,0x22,0x48,0x42,0x48,0x42,0x48,0x46, 0x44,0x2A,0x44,0x12,0x42,0x02,0x40,0x02,/*- 文字: 臺(tái) -*/*- 宋體12; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 -*/ 0x40,0x00,0x40,0x00,0x20,0x00,0x10,0x04, 0x08,0x08,0x04,0x10,0xFE,0x3F,0x00,0x20, 0x00,0x08,0xF8,0x1F,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,; void delay(int z) int x,y; for(x=0;xz;x+) for(y=0;y110;y+);void WriteByte(char dat) /寫一個(gè)字節(jié)的數(shù)據(jù) char i; for(i=0;i1; /右移一位,取出該字節(jié)的最低位 R=CY; /將該字節(jié)的最低位傳給R CLK=0; /將數(shù)據(jù)送出,上升沿 CLK=1; void main() int num,move,speed; while(1) if(+speed8) /移動(dòng)速度控制 speed=0; move+; /移位 if(move16) /是否完成移位一個(gè)漢字 move=0; /從頭開始 for(num=0;numtempyid) | (BUFFs+1(8-tempyid)。這里temp作為要發(fā)送的一個(gè)字節(jié)數(shù)據(jù),它由數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)組合而成,并且動(dòng)態(tài)的變化,大致來說就是首先第一個(gè)字節(jié)的數(shù)據(jù)右移tempyid位,第二個(gè)字節(jié)的數(shù)據(jù)左移8-tempyid位,兩者相或后組成一個(gè)字節(jié)新的數(shù)據(jù),只要我們一直不斷地移位、相或、發(fā)送,就能實(shí)現(xiàn)左移的效果。不太好理解,先來看實(shí)例(循環(huán)左移顯示“邢臺(tái)學(xué)院”),效果圖如下:見源代碼:#include #define uchar unsigned char#define uint unsigned intuchar yid,h; /YID為移動(dòng)計(jì)數(shù)器,H為行段計(jì)數(shù)器 uint zimuo; /字模計(jì)數(shù)器 uchar code hanzi; /漢字字模 uchar BUFF4; /緩存void in_data(void); /調(diào)整數(shù)據(jù)void rxd_data(void); /發(fā)送數(shù)據(jù)void sbuf_out(); /16段掃描 uchar code table=/篇幅有限,省略編碼;void main(void)uchar i,d=10;yid=0;zimuo=0; while(1) while(yid16) /數(shù)據(jù)移位。 for(i=0;i=96) /到最后從頭開始,有字?jǐn)?shù)決定 zimuo=0; /*/void sbuf_out() for(h=0;h=0;s-) /h為向后先擇字節(jié)計(jì)數(shù)器,zimuoo為向后選字計(jì)數(shù)器 BUFF2*s+1=tablezimuo+1+32*s+2*h; /把第一個(gè)字模的第一個(gè)字節(jié)放入BUFF0/中,第二個(gè)字模的第一個(gè)字節(jié)放入BUFF2中 BUFF2*s=tablezimuo+32*s+2*h; / 把第一個(gè)字模的第二個(gè)字節(jié)放入BUFF1中,/第二個(gè)字模的第二個(gè)字節(jié)放入BUFF3中 /*/void rxd_data(void) /串行發(fā)送數(shù)據(jù) char s; uchar inc,tempyid,temp; if(yid8) inc=0; else inc=1; for(s=0+inc;s2+inc;s+) /發(fā)送2字節(jié)數(shù)據(jù) if(yidtempyid)|(BUFFs+1(8-tempyid);/h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的數(shù)據(jù) SBUF=temp;/把BUFF中的字節(jié)從大到小移位相或后發(fā)送輸出。 while(!TI); /注:這里使用了串口,串口數(shù)據(jù)的發(fā)送為最低位在前。 TI=0; /等待發(fā)送中斷 首先來看定義的數(shù)據(jù)緩沖區(qū)BUFF ,這里一開始將會(huì)存儲(chǔ)第一個(gè)漢字與第二個(gè)漢字的第一行的編碼,該緩沖區(qū)動(dòng)態(tài)的存儲(chǔ)點(diǎn)陣屏每一行要發(fā)送的數(shù)據(jù),注意這里BUFF的大小為4個(gè)字節(jié),比16*16點(diǎn)陣屏要顯示的漢字多了一個(gè)漢字行的大小,這一點(diǎn)是必要的,這樣我們才能實(shí)現(xiàn)利用該緩沖區(qū)進(jìn)行左移控制,接著來看in_data(void)函數(shù),利用該函數(shù),我們實(shí)現(xiàn)了動(dòng)態(tài)的修改緩沖區(qū)中的數(shù)據(jù),這里不再詳述過程,重點(diǎn)看程序的注釋即可。然后看rxd_data(void)函數(shù),該函數(shù)的作用正是利用串口串行發(fā)送數(shù)據(jù),也就是上面提到的移位、相或然后發(fā)送,關(guān)于在移位過程中的具體實(shí)現(xiàn)細(xì)節(jié)以及如何協(xié)調(diào)的進(jìn)行數(shù)據(jù)發(fā)送,首先來看inc變量,該變量決定了從BUFF緩沖區(qū)中的第一個(gè)還是第二個(gè)數(shù)據(jù)開始讀取,當(dāng)移位開始后,在移完一個(gè)字節(jié)的數(shù)據(jù)之前我們都從BUFF數(shù)據(jù)緩沖區(qū)中的第一個(gè)字節(jié)開始讀取,當(dāng)移完一個(gè)字節(jié)后,inc變成1,這時(shí)我們從BUFF數(shù)據(jù)緩沖區(qū)中的第二個(gè)字節(jié)開始讀取,于此同時(shí)后一個(gè)字節(jié)總是在和前一個(gè)字節(jié)的數(shù)據(jù)進(jìn)行移位相或,達(dá)到慢慢向前推進(jìn)的效果,這里有一個(gè)臨界點(diǎn),就是當(dāng)移位滿16位后,即一個(gè)漢字移出點(diǎn)陣屏后,這時(shí)候我們就需要將數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)進(jìn)行更新,即后移一個(gè)字,這時(shí)數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)就變成了第二個(gè)漢字和第三個(gè)漢字的第一行漢字的編碼,以此類推。下面來看sbuf_out()函數(shù),該函數(shù)實(shí)現(xiàn)了16行的掃描,最后來看while循環(huán)內(nèi),這時(shí)主函數(shù)內(nèi)已經(jīng)很簡(jiǎn)單了,首先在while(yid16)內(nèi),有控制移動(dòng)速度的for循環(huán),即顯示幾次靜態(tài)的畫面移動(dòng)一步,而zimuo變量為移位過程中漢字的選擇變量,它每32位的變化,正好是一個(gè)16*16漢字的編碼個(gè)數(shù)。這樣就完成了整個(gè)點(diǎn)陣左移的控制(這里使用了串口實(shí)現(xiàn)點(diǎn)陣的左移,當(dāng)然我們也可以不用串口,關(guān)于非串口實(shí)現(xiàn)的左移后面介紹),它的過程比較復(fù)雜,需反復(fù)思考。(4)128*32點(diǎn)陣擴(kuò)展顯示 1. 128*32點(diǎn)陣的靜態(tài)顯示完成了16*16點(diǎn)陣的靜態(tài)與移動(dòng)顯示之后,就已經(jīng)算是掌握了點(diǎn)陣屏顯示的主要部分,以后不管想要操縱什么樣的點(diǎn)陣屏,只要把握上面的原理,都能按照我們的想法進(jìn)行顯示。所以接下來的講解不會(huì)再有上面那么詳細(xì)。下面來看128*32點(diǎn)陣是如何顯示的。這里的布線有點(diǎn)繁瑣,首先來看一下64*16點(diǎn)陣的布線,如下圖:前面已經(jīng)提到過,在該仿真環(huán)境下紅色點(diǎn)陣為上列選下行選。理解了64*16的點(diǎn)陣布線,我們來看一下128*32的仿真圖:這是一個(gè)完整的128*32的點(diǎn)陣屏,只是在上面小屏的基礎(chǔ)上級(jí)聯(lián)了更多的595,因?yàn)橹挥幸粋€(gè)4選16的譯碼器,而該點(diǎn)陣有32行,這里我們使用兩個(gè)數(shù)據(jù)輸入端,分別對(duì)應(yīng)點(diǎn)陣屏的上、下半屏。下面以操作上半屏為例(下半屏同理)。看效果圖:見源代碼:#include #define uchar unsigned char#define uint unsigned intuchar yid,h; /YID為移動(dòng)計(jì)數(shù)器,H為行段計(jì)數(shù)器 uint zimuo; /字模計(jì)數(shù)器 uchar code hanzi; /漢字字模 uchar BUFF18; /緩存void in_data(void); /調(diào)整數(shù)據(jù)void rxd_data(void); /發(fā)送數(shù)據(jù)void sbuf_out(); /16段掃描 uchar code table=/篇幅有限,省略編碼;void main(void)uchar i,d=10;yid=0;zimuo=0; while(1) while(yid16) /數(shù)據(jù)移位。 for(i=0;i=480) /到最后從頭開始,有字?jǐn)?shù)決定 zimuo=0; /*/void sbuf_out() for(h=0;h=0;s-) /h為向后先擇字節(jié)計(jì)數(shù)器,zimuoo為向后選字計(jì)數(shù)器 BUFF2*s+1=tablezimuo+1+32*s+2*h; /把第一個(gè)字模的第一個(gè)字節(jié)放入BUFF0/中,第二個(gè)字模的第一個(gè)字節(jié)放入BUFF2中 BUFF2*s=tablezimuo+32*s+2*h; / 把第一個(gè)字模的第二個(gè)字節(jié)放入BUFF1中,/第二個(gè)字模的第二個(gè)字節(jié)放入BUFF3中 /*/void rxd_data(void) /串行發(fā)送數(shù)據(jù) char s; uchar inc,tempyid,temp; if(yid8) inc=0; else inc=1; for(s=0+inc;s8+inc;s+) /發(fā)送8字節(jié)數(shù)據(jù) if(yidtempyid)|(BUFFs+1(8-tempyid);/h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的數(shù)據(jù) SBUF=temp;/把BUFF中的字節(jié)從大到小移位相或后發(fā)送輸出。 while(!TI); /注:這里使用了串口,串口數(shù)據(jù)的發(fā)送為最低位在前。 TI=0; /等待發(fā)送中斷 該程序同上面的左移程序大同小略,只有幾處不同。它同樣實(shí)現(xiàn)了上半屏循環(huán)左移顯示一系列漢字的功能。對(duì)該程序,就不再詳細(xì)講解。二基于AVR的點(diǎn)陣屏顯示(1)靜態(tài)顯示 上面已經(jīng)講完了基于51的點(diǎn)陣屏顯示,相信大家已經(jīng)掌握了點(diǎn)陣屏顯示的原理,下面仍然依據(jù)該原理,我們使用AVR單片機(jī)來進(jìn)行控制。下面的程序均在ICCAVR Version 6.31A環(huán)境下編寫并均在點(diǎn)陣實(shí)驗(yàn)板上測(cè)試通過。首先來看一下128*32點(diǎn)陣屏兩行靜態(tài)顯示的程序,源代碼如下:#include#include#define uchar unsigned char#define uint unsigned int#include delay.h#include code.h#pragma data: data#define screen_size 8 /半屏顯示漢字個(gè)數(shù):8 32*128uchar BUFF_1screen_size*2+2; /緩存uchar BUFF_2screen_size*2+2; /緩存 uchar disrow; /disrow 為16行變量uchar temp_up,temp_down;uchar Move_up,Move_down;uchar temp_up,temp_down;uint zimo_up,zimo_down;#define HC595_data1_H() PORTB |= BIT(0)#define HC595_data1_L() PORTB &=BIT(0)#define HC595_data2_H() PORTB |= BIT(1)#define HC595_data2_L() PORTB &=BIT(1)#define HC595_clk_H PORTB |= BIT(2)#define HC595_clk_L PORTB &=BIT(2)#define HC595_lo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論