- 單片機C語言程序設計實訓100例
- 彭偉編著
- 806字
- 2018-12-27 05:12:04
3.10 8只數(shù)碼管滾動顯示數(shù)字串
本例電路與此前案例電路相同,但運行時不是一次顯示8位不同數(shù)字,而是僅顯示3位不同數(shù)碼,且實現(xiàn)了3位數(shù)字的滾動顯示效果。
程序設計調試與實訓:
程序將所有待顯示的數(shù)碼10,10,10,10,10,10,10,10,2,9,8存放于Num數(shù)組中,其中10表示黑屏,顯示時取碼過程如下:
當取前8個數(shù)顯示時為全黑;
取第2個數(shù)開始的8個數(shù)時,最后一個是2;
取第3個數(shù)開始的8個數(shù)時,最后兩個是2,9;
取第4個數(shù)開始的8個數(shù)時,最后三個是2,9,8;
取第5個數(shù)開始的8個數(shù)時,會發(fā)現(xiàn)剩下的只有7個。
為解決這個問題,本例將數(shù)組Num看做環(huán)形隊列,從任何一個元素開始取8個元素時,如果后面不足8個數(shù),程序會自動從前面開始繼續(xù)取得其余元素。代碼中(k + j ) % 11即實現(xiàn)了這個功能,它表示從第k個開始取第j個元素,k+j超過最后位置時會自動從第0個元素開始繼續(xù)取值。
主程序中使用了雙重for循環(huán),內層循環(huán)用于8位數(shù)碼管的掃描顯示,包括黑屏部分,外層還添加了for循環(huán),這是為了使每次8位數(shù)碼的掃描顯示重復若干遍,形成一組數(shù)字串的保持顯示效果。
最后一行代碼遞增取值起點k,因為取值起點在雙重循環(huán)后遞增,也就是在同一組數(shù)字刷新顯示若干遍,形成一小段延時后遞增,從而產(chǎn)生滾動顯示效果。
讀者可修改代碼,嘗試改變滾動方向和滾動顯示的數(shù)字個數(shù)。
源程序代碼:
//----------------------------------------------------------------- // 名稱: 8只數(shù)碼管滾動顯示數(shù)字串 //----------------------------------------------------------------- // 說明: 數(shù)碼管向左滾動顯示3個字符構成的數(shù)字串。 //----------------------------------------------------------------- #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int //數(shù)字0~9的數(shù)碼管段碼,最后一個為黑屏的段碼 uchar code DSY_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0xFF}; //程序將下面的數(shù)組看做環(huán)形隊列,顯示從某個數(shù)開始的8個數(shù)(10表示黑屏) uchar Num[] = {10,10,10,10,10,10,10,10,2,9,8}; //----------------------------------------------------------------- // 延時 //----------------------------------------------------------------- void DelayMS(uint x) { uchar i; while(x--) for(i = 0; i < 120; i++); } //----------------------------------------------------------------- // 主程序 //----------------------------------------------------------------- void main() { uchar i,j,k,m; P0 = 0xFF; P2 = 0x00; m = 0x80; k = 0; while(1) { //刷新若干次,保持一段時間的穩(wěn)定顯示 for (i = 0;i < 15;i++) { for(j = 0; j < 8; j++) { m = _crol_(m,1); P2 = m; //采用環(huán)形取法,從第k個開始取第j個 P0 = DSY_CODE[ Num[ (k + j) % 11 ] ]; DelayMS(2); } } //環(huán)形隊列首指針k遞增,Num的下標范圍為0~10,因此對11取余 k = ( k + 1) % 11; } }
推薦閱讀
- Visual Basic 6.0程序設計計算機組裝與維修
- Go語言高效編程:原理、可觀測性與優(yōu)化
- 基于Java技術的Web應用開發(fā)
- 零基礎學Python數(shù)據(jù)分析(升級版)
- Java應用開發(fā)技術實例教程
- 組態(tài)軟件技術與應用
- Python算法詳解
- MongoDB,Express,Angular,and Node.js Fundamentals
- 編寫高質量代碼:改善Objective-C程序的61個建議
- 零代碼實戰(zhàn):企業(yè)級應用搭建與案例詳解
- 現(xiàn)代C:概念剖析和編程實踐
- Web前端開發(fā)技術:HTML、CSS、JavaScript
- DB2SQL性能調優(yōu)秘笈
- C# 7 and .NET Core 2.0 Blueprints
- PHP程序設計高級教程