1.代碼選擇
有時(shí)我們需要6個(gè)數(shù)碼管顯示我們想要看到的數(shù)字,比如計(jì)算結(jié)果呈現(xiàn)在數(shù)碼管上,然而當(dāng)要顯示的數(shù)為“520”時(shí)又不想前面的3個(gè)數(shù)碼管亮(也就是高位為0不顯示),我們把這部分功能代碼封裝為帶參數(shù)的函數(shù),傳入的參數(shù)就是要顯示的數(shù)值。參數(shù)定義的是unsigned long類型,也就是支持0~4294967296的數(shù)值(2的32次方等于4294967296)。
示例1:
void ShowNumber(u32 num) { LedBuff[0]=LedChar[num%10]; LedBuff[1]=LedChar[(num/10)%10]; LedBuff[2]=LedChar[(num/100)%10]; LedBuff[3]=LedChar[(num/1000)%10]; LedBuff[4]=LedChar[(num/10000)%10]; LedBuff[5]=LedChar[(num/100000)%10]; if(num<100000)LedBuff[5] = 0xFF; if(num<10000) LedBuff[4] = 0xFF; if(num<1000) LedBuff[3] = 0xFF; if(num<100) LedBuff[2] = 0xFF; if(num<10) LedBuff[1] = 0xFF; }
示例2:
void ShowNumber(u32 num) { u32 i; u8 x=5;//每次被調(diào)用都會(huì)從5開始 for(i=100000;i>0;i/=10) { if(num<i)LedBuff[x] = 0xFF; else LedBuff[x]=LedChar[(num/i)%10]; x--; } }
這兩段代碼都能實(shí)現(xiàn)我們想要的功能,示例1可讀性強(qiáng),讓人一看就明白了代碼的作用。而示例2書寫量少,比較簡潔,但在閱讀理解上需要我們轉(zhuǎn)一下彎,筆者測試了這兩段代碼的執(zhí)行時(shí)間,發(fā)現(xiàn)示例1比示例2快5ms左右,這種情況下毫無疑問我們肯定是選擇示例1暫時(shí)作為實(shí)用代碼。
可是在后期的教程中用到定時(shí)器中斷來掃描數(shù)碼管顯示時(shí),示例1的代碼效果不盡人意,關(guān)于漏洞在哪大家后面可以嘗試自己尋找。
在使用示例2時(shí)雖然顯示效果比示例1的好,但是費(fèi)時(shí)長,所以這兩段代碼都不是實(shí)用型代碼。
2.代碼參考
參考了宋老師的這部分代碼以及測試結(jié)果都非常高效,所以我們選擇這部分代碼作為實(shí)用型代碼。
void ShowNumber(u32 num) { char i;//取值范圍-128~127 u8 buf[6]; for (i=0; i<6; i++) //把長整型數(shù)轉(zhuǎn)換為6位十進(jìn)制的數(shù)組 { buf[i] = num % 10; num = num / 10; //舍掉個(gè)位數(shù),重新裝載 } for (i=5; i>=1; i--) //從最高位起,遇到0填充不顯示的代碼,遇到非0則退出循環(huán) { if (buf[i] == 0) LedBuff[i] = 0xFF; else break; } for ( ; i>=0; i--) //剩余低位都如實(shí)轉(zhuǎn)換為數(shù)碼管顯示字符 { LedBuff[i] = LedChar[buf[i]]; } }
這部分代碼我們來舉個(gè)例子理解,假如傳入的參數(shù)為125,第一個(gè)for循環(huán)就是實(shí)現(xiàn)以下功能
buf[5]=0; buf[4]=0; buf[3]=0; buf[2]=1; buf[1]=2; buf[0]=5;
第二個(gè)for循環(huán)i等于2之后就退出了循環(huán),第三個(gè)for循環(huán)i是等于2,然后填充好要顯示的1,2,5給數(shù)碼管緩存區(qū)。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程