能在點(diǎn)陣屏上顯示任意漢字,并進(jìn)行滾動(dòng)循環(huán)顯示。
利用單片機(jī)AT89C51編寫程序驅(qū)動(dòng)四塊級(jí)聯(lián)在一起的74HC595,再利用這四塊595芯片驅(qū)動(dòng)點(diǎn)陣屏進(jìn)行顯示。漢字顯示,是用相應(yīng)的文字取模軟件進(jìn)行文字取模,將取到的模存入數(shù)組中,配合相應(yīng)的程序算法,實(shí)現(xiàn)文字的在點(diǎn)陣屏上的滾動(dòng)顯示。
三、理論設(shè)計(jì)
3.1 原理分析
將事先取好的字模裝入數(shù)組之中,通過(guò)軟件編程驅(qū)動(dòng)四個(gè)74HC595芯片,兩個(gè)用于字模數(shù)組的輸出,兩個(gè)用于點(diǎn)陣的掃描,相互配合進(jìn)行漢字的顯示。在C語(yǔ)言中設(shè)計(jì)兩個(gè)循環(huán)進(jìn)行嵌套,里面的小循環(huán)用于單個(gè)漢字的顯示,外面的大循環(huán)用于漢字的滾動(dòng)。
3.2 控制系統(tǒng)
AT89C51是一種帶4K字節(jié)FLASH存儲(chǔ)器的低電壓、高性能CMOS 8位微處理器,俗稱單片機(jī)。AT89C51 提供以下標(biāo)準(zhǔn)功能:4k 字節(jié)Flash 閃速存儲(chǔ)器,256字節(jié)片內(nèi)數(shù)據(jù)存儲(chǔ)器(00H -7FH為片內(nèi)RAM,80H-FFH為特殊功能寄存器SFR),32 個(gè)I/O 口線,兩個(gè)16位定時(shí)/計(jì)數(shù)器,一個(gè)5向量?jī)杉?jí)中斷結(jié)構(gòu),一個(gè)全雙工串行通信口,片內(nèi)振蕩器及時(shí)鐘電路。同時(shí),AT89C51可降至0Hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式。空閑方式停止CPU的工作,但允許RAM,定時(shí)/計(jì)數(shù)器,串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM中的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個(gè)硬件復(fù)位。
3.3 74HC595芯片工作原理
74HC595是一個(gè)8位串行輸入、并行輸出的位移緩存器:并行輸出為三態(tài)輸出。在SCK 的上升沿,串行數(shù)據(jù)由SDL輸入到內(nèi)部的8位位移緩存器,并由Q7'輸出,而并行輸出則是在LCK的上升沿將在8位位移緩存器的數(shù)據(jù)存入到8位并行輸出緩存器。當(dāng)串行數(shù)據(jù)輸入端OE的控制信號(hào)為低使能時(shí),并行輸出端的輸出值等于并行輸出緩存器所存儲(chǔ)的值。
74HC595驅(qū)動(dòng)點(diǎn)陣屏電路 利用四個(gè)595芯片進(jìn)行級(jí)聯(lián)U2—>U3—>U4—>U5,左邊兩個(gè)595用于點(diǎn)陣的行掃描,下邊的兩個(gè)595用于字模數(shù)組的輸出。進(jìn)行相應(yīng)的邏輯組合實(shí)現(xiàn)漢字的滾動(dòng)顯示。 圖3-4 74HC595驅(qū)動(dòng)點(diǎn)陣屏電路
3.5系統(tǒng)總體結(jié)構(gòu)圖
四、電路仿真及仿真結(jié)果分析 4.1電路圖 依次向上滾動(dòng)所要顯示的漢字
4.2仿真結(jié)果 顯示漢字“張” 顯示漢字“啟” 顯示漢字“雄”
六、心得體會(huì) 通過(guò)本次設(shè)計(jì),使我對(duì)74HC595這款芯片,以及相應(yīng)的軟件驅(qū)動(dòng)代碼的書寫的理解更加清晰,對(duì)單片機(jī)的認(rèn)識(shí)也是更進(jìn)了一步。 在本次設(shè)計(jì)工程中,遇到了很多得問(wèn)題,主要是595軟件驅(qū)動(dòng)設(shè)計(jì)和芯片之間的邏輯配合,讓四個(gè)595相互配合驅(qū)動(dòng)顯示目標(biāo)漢字那一塊。由于對(duì)595芯片的數(shù)據(jù)寫入順序,輸出順序,以及點(diǎn)陣結(jié)構(gòu)認(rèn)識(shí)不清導(dǎo)致走了一些彎路。最后重新梳理了595的特點(diǎn),理清了下編程思路,最后順利完成。完成這次設(shè)計(jì)后,我在書本理論知識(shí)的基礎(chǔ)上又有了更深層次的理解,對(duì)單片機(jī)的認(rèn)識(shí)也是更加深刻。
單片機(jī)源程序如下:
- /**************************************************************************************
- 項(xiàng)目名稱:點(diǎn)陣滾動(dòng)設(shè)計(jì)
- ***************************************************************************************/
- #include "reg51.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
- #include "intrins.h"
- typedef unsigned int u16; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
- typedef unsigned char u8;
- //--定義使用的IO口--//
- sbit SRCLK=P3^6;
- sbit RCLK=P3^5;
- sbit SER=P3^4;
- //定義LED點(diǎn)陣的位選,也就是類似于數(shù)碼管的位選,因?yàn)橐獙?duì)其動(dòng)態(tài)掃描操作
- //數(shù)組前16位和后16位數(shù)據(jù)正好是相反的,也就是說(shuō)先讓第3個(gè)595輸出低電平,然后再讓第4個(gè)595輸出低電平
- u8 code ledwei[]=
- {
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
- };
- u8 code ledduan1[]=
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: 湖 --*/
- /*-- 新宋體12; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
- 0x01,0x00,0x21,0x1E,0x11,0x12,0x17,0xD2,0x81,0x12,0x41,0x1E,0x41,0x12,0x17,0xD2,
- 0x14,0x52,0x24,0x5E,0xE4,0x52,0x27,0xD2,0x24,0x52,0x20,0x22,0x20,0x2A,0x00,0x44,
- ,.......詳見(jiàn)附件.................
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
- };
- /*******************************************************************************
- * 函 數(shù) 名 : delay
- * 函數(shù)功能 : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
- * 函數(shù)功能 : 通過(guò)595發(fā)送四個(gè)字節(jié)的數(shù)據(jù)
- * 輸 入 : dat1:第4個(gè)595輸出數(shù)值
- * * dat2: 第3個(gè)595輸出數(shù)值
- * * dat3:第2個(gè)595輸出數(shù)值
- * * dat4:第1個(gè)595輸出數(shù)值
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
- {
- u8 a;
- SRCLK = 1;
- RCLK = 1;
- for(a=0;a<8;a++) //發(fā)送8位數(shù)
- {
- SER = dat1 >> 7; //從最高位開(kāi)始發(fā)送
- dat1 <<= 1;
- SRCLK = 0; //發(fā)送時(shí)序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //發(fā)送8位數(shù)
- {
- SER = dat2 >> 7; //從最高位開(kāi)始發(fā)送
- dat2 <<= 1;
- SRCLK = 0; //發(fā)送時(shí)序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //發(fā)送8位數(shù)
- {
- SER = dat3 >> 7; //從最高位開(kāi)始發(fā)送
- dat3 <<= 1;
- SRCLK = 0; //發(fā)送時(shí)序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- for(a=0;a<8;a++) //發(fā)送8位數(shù)
- {
- SER = dat4 >> 7; //從最高位開(kāi)始發(fā)送
- dat4 <<= 1;
- SRCLK = 0; //發(fā)送時(shí)序
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- RCLK = 0;
- _nop_();
- _nop_();
- RCLK = 1;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸 入 : 無(wú)
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void main()
- {
- u16 i,a;
-
- while(1)
- {
- for(a=0;a<=768;a=a+2) //大循環(huán)用于漢字的滾動(dòng)
- {
- for(i=0;i<16;i++) //小循環(huán)用于每一個(gè)漢字圖片的顯示
- {
- Hc595SendByte(ledduan1[2*i+a+1],ledduan1[2*i+a],~ledwei[i+16],~ledwei[i]);
- delay(500);
- }
- a+=2; //防止兩個(gè)不同字模的數(shù)組之間過(guò)渡的地方導(dǎo)致數(shù)組讀取混亂
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載(Proteus仿真+源代碼):
缺少matrix.dll 求大神分享
2018111115張啟雄 點(diǎn)陣LED顯示屏.zip
(3.81 MB, 下載次數(shù): 128)
2020-11-27 18:46 上傳
點(diǎn)擊文件名下載附件
|