u32 oled_pow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
這個函數我覺得你并不理解,不然也就不會不明白temp指的是什么了。現在我給你分析一下,就按照我最開始的思路來讀程序,跟著我一步一步走好了:
根據函數名,我們可以大概了解這個函數的功能是顯示一個數字,傳入的參數是X坐標(字符在一行的哪一個位置)、y坐標(字符顯示在哪一個行)、一個待顯示的數據、數據的長度和顯示字符的跨度
enshow是一個使能標志,那么這個使能位是在什么時候起作用,什么時候關閉呢?
if(enshow==0&&t<(len-1))
這一句的意思你明白,是當這個enshow為0并且再數據長度范圍內的時候,進行temp==0的判斷,而不滿足這個條件,enshow就會置1,顯然,是在判斷數據傳輸是否完成,并且在達到給定的數據長度后終止傳輸。
縱觀函數的結構可以看出,在許可長度范圍內,函數循環計算一個temp量,從最后一句
OLED_ShowChar(x+(size2/2)*t,y,temp+'0');
可以看到,這個temp實際上是待顯示位數字,比如1,2,3...而不是數字的ASCII碼,所以這里需要以‘0’做基準把數字轉換為其ASCII碼,可以猜測,OLED_ShowChar()函數是傳入一個ASCII碼,在ASCII碼字模表中取模顯示對應的字符。
知道了temp是什么意思,我們反過來看temp是如何求得的:
temp=(num/oled_pow(10,len-t-1))%10
這句中,num是待顯示的數據,我們知道了該顯示函數是按位取出num,那么這一句的作用必然是按位取數,結尾的%10(取余運算)表明所取的數是前面所求整數數據的最后一位。
現在到了最關鍵的部分了
oled_pow(10,len-t-1)返回的是一個什么數據?
將實參代入形參即m為累乘數據,n為數據長度-已處理位數-1
(此處的減一是為了適應C語言計數到“0”為止)
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
翻譯一下:
結果值result初始值為1;
當 在長度范圍內 時,結果值=結果值*累乘數據
返回 結果值
也就是說,返回的是(10)^(顯示的長度)
這樣,num/oled_pow(10,len-t-1)指的是對指定長度取模(取num定長)
例如:num=1325416;顯示長度為5,那么num/oled_pow(10,len-t-1)運算之后就是13。在這個結果上再對10取余就是最后一位。
由于t的變化,可以遍歷每一位。
但是如果數據在變化,那當數據位數過少的時候,前面位會顯示什么呢?是0。例如規定顯示5位,但是實際上數據只有2位,那顯示就會變成000XX,為了美觀,也要把這個0干掉。
事實上,
if(temp==0)
{
OLED_ShowChar(x+(size2/2)*t,y,' ');
continue;
}
就是干這個工作的,當取出的位為0的時候,就用空格代替改數值達到消隱無效0的作用。從上面的分析我們可以知道,這個傳入的ASCII碼應該是由一個char類型的值在接收,所以這里的空格會以ASCII碼的形式存入形參。
我想我應該講完了,你的三個問題答案整理如下:
1.temp=(num/oled_pow(10,len-t-1))%10;//這里算出來到底是什么數
答:該出算出的是本次要顯示的位對應的數值
2.OLED_ShowChar(x+(size2/2)*t,y,'');//這里的''怎么和阿斯克碼表對上的
答:猜測接收的形參是char類型,所以空格直接以字符型存入了(即存入的是空格的ASCII碼)
3.OLED_ShowChar(x+(size2/2)*t,y,temp+'0'); //這里又為什么+0
答:因為需要以0為基準將數字類型轉為對應的ASCII碼。
打字不易,希望認真讀懂為好。 |