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