#說明:采用的芯片是89C51,LED點陣屏的規格是16*16,同時使用了兩個74HC595芯片,字模生成軟件在文末有網盤鏈接。
1 連接原理圖
整體的電路連接如上圖所示,單片機只需要使用三個IO接口,就可以實現對點陣屏的控制。當然對于不同的單片機而言連線是不同的,但是使用74HC595擴展的原理是相同的,在這里不再對于其IO擴展原理進行探究。
2 實現的功能
在51單片機以及C語言的環境下,實現LED點陣屏幕上漢字的平滑滾動,就像是公交車上顯示“前方到站第二醫院,下車乘客請提前做好準備”一樣。我們最后顯示的是“計算機測控技術”幾個字,當然顯示的漢字內容是自定義的。同時,設置一個按鈕能夠讓平滑滾動的漢字可以隨時停下來。
這里有兩點細節需要注意一下:
1、漢字循環到最后一個時,要繼續滾動出第一個漢字,而不是跳變到開頭重新循環。
2、漢字滾動的時候按下按鈕停止,滾動停止的時候按下按鈕繼續滾動,使用同一個按鈕。
3 C語言程序實現
3.1 定義變量
在這里我們定義芯片P3.4、P3.5、P3.6 三個接口為輸出IO接口,P2.7為接開關控制的IO接口。同時定義一個大數組儲存所有漢字對應的取模16進制碼,一個小數組用于表示現在屏幕上所需顯示的漢字。
#include #include typedef unsigned int u16; //常規無符號字符串和整數定義 typedef unsigned char u8; //將595的三個內置接口賦給新的名字 sbit SRCLK = P3 ^ 6; // 數據輸入口(串) sbit RCLK = P3 ^ 5; // 移位寄存器時鐘 sbit SER = P3 ^ 4; // 存儲寄存器時鐘 sbit stopscreen = P2^7; //暫停與開始開關定義引腳 /*定義一個數組存儲所有需要平滑滾動的文字的16進制碼,由取模軟件自動生成, 每個字由32個16進制數字組合而成,現在數組中存儲的是“計算機測控技術”*/ u8 code word[] = { /*-- 文字: 計 --*/ 0x00, 0x02, 0x04, 0x02, 0x08, 0x02, 0x08, 0x02, 0x00, 0x02, 0x00, 0x02, 0xEF, 0x7F, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0x28, 0x02, 0x18, 0x02, 0x08, 0x02, 0x00, 0x02, /*-- 文字: 算 --*/ 0x04, 0x02, 0x7C, 0x7E, 0x12, 0x09, 0x01, 0x00, 0xFC, 0x1F, 0x04, 0x10, 0xFC, 0x1F, 0x04, 0x10, 0xFC, 0x1F, 0x04, 0x10, 0xFC, 0x1F, 0x10, 0x04, 0xFF, 0x7F, 0x10, 0x04, 0x08, 0x04, 0x04, 0x04, /*-- 文字: 機 --*/ 0x08, 0x00, 0x88, 0x0F, 0x88, 0x08, 0x88, 0x08, 0xBF, 0x08, 0x88, 0x08, 0x8C, 0x08, 0x9C, 0x08, 0xAA, 0x08, 0xAA, 0x08, 0x89, 0x08, 0x88, 0x48, 0x88, 0x48, 0x48, 0x48, 0x48, 0x70, 0x28, 0x00, /*-- 文字: 測 --*/ 0x00, 0x20, 0xE4, 0x23, 0x28, 0x22, 0x28, 0x2A, 0xA1, 0x2A, 0xA2, 0x2A, 0xA2, 0x2A, 0xA8, 0x2A, 0xA8, 0x2A, 0xA4, 0x2A, 0xA7, 0x2A, 0x84, 0x20, 0x44, 0x21, 0x44, 0x22, 0x24, 0x28, 0x10, 0x10, /*-- 文字: 控 --*/ 0x08, 0x02, 0x08, 0x04, 0x08, 0x04, 0xC8, 0x7F, 0x5F, 0x40, 0x28, 0x29, 0x88, 0x10, 0x58, 0x20, 0x0C, 0x00, 0x8B, 0x3F, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0xEA, 0x7F, 0x04, 0x00, /*-- 文字: 技 --*/ 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0xC8, 0x7F, 0x3F, 0x04, 0x08, 0x04, 0x08, 0x04, 0xA8, 0x3F, 0x18, 0x21, 0x0C, 0x11, 0x0B, 0x12, 0x08, 0x0A, 0x08, 0x04, 0x08, 0x0A, 0x8A, 0x11, 0x64, 0x60, /*-- 文字: 術 --*/ 0x80, 0x00, 0x80, 0x04, 0x80, 0x08, 0x80, 0x08, 0xFE, 0x3F, 0xC0, 0x01, 0xA0, 0x02, 0xA0, 0x02, 0x90, 0x04, 0x88, 0x08, 0x84, 0x10, 0x82, 0x20, 0x81, 0x40, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00}; //下面一個用于存儲每一時刻點陣屏顯示內容的數字,隨著時間會不斷重新賦值與變化 u8 now[32] = { 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 }; 3.2 點陣顯示函數 由于使用595進行了接口擴展,首先編寫行顯示函數LED_line,接著再編寫漢字顯示函數LED_array,>>和<<這兩個符號是二進制移位符號。 void delay(u16 i) //延時函數,很普通 { while (i--); } //行顯示函數: LED_line (字節1 1 ,字節2 2 ,行號) void LED_line(u8 ledata1, u8 ledata2, u8 line_num) { u8 b_num, i; u8 REG595[4]; // 發送到595的四個字節。 REG595[0] = ledata2; REG595[1] = ledata1; if (line_num<8) { REG595[2] = 0; REG595[3] = 0x01 << line_num; } else { REG595[2] = 0x01 << (line_num - 8); REG595[3] = 0; } SRCLK = 1; // 移位準備 RCLK = 1; //輸出準備 for (b_num = 0; b_num<4; b_num++) { // 向595發送四個字節 for (i = 0; i<8; i++) { //發送8位數 SER = REG595[b_num] >> 7; //從最高位開始發送 REG595[b_num] <<= 1; SRCLK = 0; SRCLK = 1; //移位寄存器時序,低電平準備,高電平有效 } } RCLK = 0; // 存儲寄存器時序,低電平準備,高電平有效,四個字節同時發出 RCLK = 1; } void LED_array(u8 word[], u16 t_delay) //漢字顯示函數 { u8 i; while (t_delay--) { for (i = 0; i<16; i++) { // 逐行顯示 LED_line(~word[i * 2], ~word[i * 2 + 1], i); } } } 3.3 平滑滾動 通過上面的內容,我們只要調用LED_array函數,正確傳參后就可以在LED點陣屏上顯示我們想要顯示的內容了。實現平滑滾動才是本文的關鍵,主函數的算法流程圖如下所示: 總的來說,就是使用小數組(now)在大數組(word)中一步步移動的方法,在算法與數據結構里,我們往往把這種方法叫做滑動窗口法。在漢字取模軟件中生成的16進制數,每兩個一組代表LED點陣上的一行燈的亮滅。這也不難理解,因為一行是16個LED燈,一個兩位16進制數剛好可以表示8個2進制數,所以兩個兩位16進制數控制一行。因此,我們滑動窗口每次移動2個兩位16進制數。 void main() //主函數 { u16 i, j; for(j=0;;j++){ //在這里不使用while循環是因為while循環顯示輸出不穩定 //每次賦給now的值都后移兩位,顯示出來就是點陣一行行地變化 for (i=0;i<32;i++){ //對now中32個位置,每個位置都賦值 /*將需要實時顯示的內容放到實時數組now中去,同時使用對數組最大數224取余實現循環平滑滾動*/ now[i] = word[(i+(2*j))%224]; } LED_array(now, 10); //調用漢字顯示函數,依次顯示now中內容 delay(300); //延遲后進行下一循環 if(stopscreen==0){ //按鍵防抖設計 delay(50); if(stopscreen==0){ while(1){ //按第一下開關停止平滑滾動 LED_array(now, 10); if(stopscreen==0){ //按鍵防抖設計 delay(50); if(stopscreen==0){ break; //按第二下開關繼續平滑滾動 } } } } } } } 4 總結 清楚了LED點陣屏顯示的原理,我們可以設計LED點陣屏的多種顯示方式,甚至可以做出動畫片、游戲等。 字模生成軟件百度云:鏈接:https://pan.baidu.com/s/1OwK_L_aDjWas5LF_MuULmQ 提取碼:idov
上一篇:51單片機基于Proteus的8X8點陣滾動顯示心形
下一篇:51單片機LED點陣顯示文字
推薦閱讀
史海拾趣
在電子行業的初期,Coil-Q Corporation以其獨特的線圈技術嶄露頭角。公司創始人發現了傳統線圈在效率和穩定性上的不足,于是投入大量資源進行研發,成功開發出一種新型高效線圈。這一創新不僅提高了電子設備的性能,還降低了能耗,迅速贏得了市場的青睞。隨著技術的不斷完善和市場的擴大,Coil-Q逐漸成為了電子線圈領域的領軍企業。
隨著公司規模的逐漸擴大,喜美克斯公司開始思考如何進一步拓展市場。他們深入研究市場趨勢和消費者需求,制定了針對不同市場的精準營銷策略。通過與當地合作伙伴的緊密合作,喜美克斯成功地將產品打入了多個新興市場,實現了銷售額的快速增長。
喜美克斯公司深知人才是企業發展的核心動力。因此,他們高度重視人才的引進和培養。公司建立了一套完善的人才選拔和培養機制,通過內部培訓、外部引進等多種方式,不斷為公司注入新鮮血液。同時,公司還為員工提供廣闊的職業發展空間和優厚的福利待遇,激發了員工的工作熱情和創造力。這些舉措為喜美克斯公司的長期發展提供了堅實的人才保障。
1968年,勝利公司(VICTOR)在臺灣創立,創始人李明懷揣著對羽毛球運動的熱愛和對品質的執著,決定進入羽毛球用品制造行業。他帶領團隊克服技術難關,不斷研發新產品,逐漸在市場上嶄露頭角。
面對日益激烈的市場競爭和不斷變化的市場需求,Fairchild Imaging制定了面向未來的戰略布局。公司將繼續加大在成像技術領域的研發投入,推動技術創新和產品升級。同時,Fairchild Imaging還將積極拓展國際市場,加強與全球客戶的合作與交流。此外,公司還將注重人才培養和團隊建設,為公司的長期發展提供有力保障。
Corsair Memory Inc公司,由Don Lieberman、John Beekley與Andy Paul于1994年在美國加州佛利蒙創立。起初,公司專注于為英特爾系統生產Cache-On-A-Stick (COAST)模組。然而,隨著英特爾將快取內存由主板移至處理器晶體中,Corsair迅速調整戰略,將注意力轉向電腦內存市場。這一轉變不僅使Corsair避開了潛在的市場風險,更為其后續的內存業務奠定了堅實的基礎。
大家幫忙給看一個單片機程序哪出錯了 4*4鍵盤+lcd1602 我做的程序的一部分是 從液晶屏顯示鍵盤輸入 寫完之后發現運行總是出錯不管摁一下什么總是顯示很多0 但如果一步一步調試的話顯示正確 自己看不出來哪錯了 大家幫忙給看一下吧 程序如下: key.c #include "key.h" #include "SPC ...… 查看全部問答∨ |
|
好像IE把windows目錄設置為cache了,下載大的mp3/rar文件出現空間不足。其實我外部有SD卡 修改了registry,設置cache為外部,還是不行 … 查看全部問答∨ |
|
本人第1次用CE。。。。 剛裝好platform builder時。馬上Build了一個NK。BIn 放在目標機上可以好好的運行。目標機上的media player可以打開windows media server編碼出來的WMV9的MMS流。 后來我更改了一些東西。。。再BUILd就打不能MMS流了。。連 ...… 查看全部問答∨ |
本人用F412做儀表,設置一個按鍵P16來關機,關機后進入LPM4,同時設定IO口中斷,結果發現進入休眠以后P1IE莫名其妙地被清零,硬件仿真的時候讀出來的P1IE為0,從而導致不能再次開機,修改內存把它改為0x40(BIT6)后才能進入中斷喚醒,再次進入休眠 ...… 查看全部問答∨ |
本帖最后由 paulhyde 于 2014-9-15 09:47 編輯 、基本儀器清單 20MHz普通示波器(雙通道,外觸發輸入,有X軸輸入) 60MHz雙通道數字示波器 低頻信號發生器(1Hz~1MHz) 標準高頻信號發生器(1MHz~30MHz,可輸出1mV小信號) 函數發生器(10 M ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 利用STM32MP1和STM32MP2在嵌入式 Linux 平臺上部署有效的安全保護機制
- 超小但強大:MCU 的小尺寸封裝和集成如何幫助優化空間受限的設計
- 德州儀器推出全球超小型 MCU,助力微型應用創新
- Microchip推出電動兩輪車(E2W)生態系統,加速電動出行創新
- 意法半導體推出STM32U3微控制器,面向遠程、智能和可持續應用,拓展超低功耗系列創新
- (一) ECloudIDE入門STM32-CubeMX工程創建與導入
- (二)ECloudIDE入門STM32-官方寄存器版例程使用
- Simulink STM32F407VGT6實現硬件在環
- openharmony:hilog_lite組件移植