標(biāo)題: 提問個(gè)OLED的顯示程序問題 [打印本頁]

作者: 高手本人    時(shí)間: 2018-11-16 14:40
標(biāo)題: 提問個(gè)OLED的顯示程序問題
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;  
while(n--)result*=m;   
return result;
}       //這一段我理解的。

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
{         
u8 t,temp;
u8 enshow=0;         
for(t=0;t<len;t++)
{
  temp=(num/oled_pow(10,len-t-1))%10;//這里算出來到底是什么數(shù)
  if(enshow==0&&t<(len-1))
  {
   if(temp==0)
   {
    OLED_ShowChar(x+(size2/2)*t,y,' ');//這里的' '怎么和阿斯克碼表對(duì)上的
    continue;
   }else enshow=1;
     
  }
   OLED_ShowChar(x+(size2/2)*t,y,temp+'0'); //這里又為什么+0
}
}   



作者: 凌凈清河    時(shí)間: 2018-11-17 17:44
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;  
while(n--)result*=m;   
return result;
}

這個(gè)函數(shù)我覺得你并不理解,不然也就不會(huì)不明白temp指的是什么了,F(xiàn)在我給你分析一下,就按照我最開始的思路來讀程序,跟著我一步一步走好了:

根據(jù)函數(shù)名,我們可以大概了解這個(gè)函數(shù)的功能是顯示一個(gè)數(shù)字,傳入的參數(shù)是X坐標(biāo)(字符在一行的哪一個(gè)位置)、y坐標(biāo)(字符顯示在哪一個(gè)行)、一個(gè)待顯示的數(shù)據(jù)、數(shù)據(jù)的長度和顯示字符的跨度

enshow是一個(gè)使能標(biāo)志,那么這個(gè)使能位是在什么時(shí)候起作用,什么時(shí)候關(guān)閉呢?

if(enshow==0&&t<(len-1))

這一句的意思你明白,是當(dāng)這個(gè)enshow為0并且再數(shù)據(jù)長度范圍內(nèi)的時(shí)候,進(jìn)行temp==0的判斷,而不滿足這個(gè)條件,enshow就會(huì)置1,顯然,是在判斷數(shù)據(jù)傳輸是否完成,并且在達(dá)到給定的數(shù)據(jù)長度后終止傳輸。

縱觀函數(shù)的結(jié)構(gòu)可以看出,在許可長度范圍內(nèi),函數(shù)循環(huán)計(jì)算一個(gè)temp量,從最后一句
OLED_ShowChar(x+(size2/2)*t,y,temp+'0');
可以看到,這個(gè)temp實(shí)際上是待顯示位數(shù)字,比如1,2,3...而不是數(shù)字的ASCII碼,所以這里需要以‘0’做基準(zhǔn)把數(shù)字轉(zhuǎn)換為其ASCII碼,可以猜測(cè),OLED_ShowChar()函數(shù)是傳入一個(gè)ASCII碼,在ASCII碼字模表中取模顯示對(duì)應(yīng)的字符。






知道了temp是什么意思,我們反過來看temp是如何求得的:

temp=(num/oled_pow(10,len-t-1))%10

這句中,num是待顯示的數(shù)據(jù),我們知道了該顯示函數(shù)是按位取出num,那么這一句的作用必然是按位取數(shù),結(jié)尾的%10(取余運(yùn)算)表明所取的數(shù)是前面所求整數(shù)數(shù)據(jù)的最后一位。

現(xiàn)在到了最關(guān)鍵的部分了
oled_pow(10,len-t-1)返回的是一個(gè)什么數(shù)據(jù)?

將實(shí)參代入形參即m為累乘數(shù)據(jù),n為數(shù)據(jù)長度-已處理位數(shù)-1
(此處的減一是為了適應(yīng)C語言計(jì)數(shù)到“0”為止)

u32 oled_pow(u8 m,u8 n)
{
u32 result=1;  
while(n--)result*=m;   
return result;
}
翻譯一下:
結(jié)果值result初始值為1;
當(dāng) 在長度范圍內(nèi) 時(shí),結(jié)果值=結(jié)果值*累乘數(shù)據(jù)
返回 結(jié)果值

也就是說,返回的是(10)^(顯示的長度)

這樣,num/oled_pow(10,len-t-1)指的是對(duì)指定長度取模(取num定長)

例如:num=1325416;顯示長度為5,那么num/oled_pow(10,len-t-1)運(yùn)算之后就是13。在這個(gè)結(jié)果上再對(duì)10取余就是最后一位。
由于t的變化,可以遍歷每一位。

但是如果數(shù)據(jù)在變化,那當(dāng)數(shù)據(jù)位數(shù)過少的時(shí)候,前面位會(huì)顯示什么呢?是0。例如規(guī)定顯示5位,但是實(shí)際上數(shù)據(jù)只有2位,那顯示就會(huì)變成000XX,為了美觀,也要把這個(gè)0干掉。

事實(shí)上,
if(temp==0)
{
OLED_ShowChar(x+(size2/2)*t,y,' ');
continue;
}
就是干這個(gè)工作的,當(dāng)取出的位為0的時(shí)候,就用空格代替改數(shù)值達(dá)到消隱無效0的作用。從上面的分析我們可以知道,這個(gè)傳入的ASCII碼應(yīng)該是由一個(gè)char類型的值在接收,所以這里的空格會(huì)以ASCII碼的形式存入形參。



我想我應(yīng)該講完了,你的三個(gè)問題答案整理如下:

1.temp=(num/oled_pow(10,len-t-1))%10;//這里算出來到底是什么數(shù)
答:該出算出的是本次要顯示的位對(duì)應(yīng)的數(shù)值

2.OLED_ShowChar(x+(size2/2)*t,y,'');//這里的''怎么和阿斯克碼表對(duì)上的
答:猜測(cè)接收的形參是char類型,所以空格直接以字符型存入了(即存入的是空格的ASCII碼)

3.OLED_ShowChar(x+(size2/2)*t,y,temp+'0'); //這里又為什么+0
答:因?yàn)樾枰?為基準(zhǔn)將數(shù)字類型轉(zhuǎn)為對(duì)應(yīng)的ASCII碼。


打字不易,希望認(rèn)真讀懂為好。
作者: 奇異的想法    時(shí)間: 2019-7-20 20:00
凌凈清河 發(fā)表于 2018-11-17 17:44
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;  

感謝一樓大佬的仔細(xì)講解。多謝大佬

作者: ahweixiao    時(shí)間: 2019-8-24 01:40
太厲害,佩服學(xué)習(xí)了
作者: lkjdf    時(shí)間: 2019-11-18 15:07
感謝大佬的講解,一目了然
作者: 我灑脫也木槿    時(shí)間: 2020-1-20 19:38
謝謝一樓大佬的細(xì)心講解
作者: 麗莎蘭曦    時(shí)間: 2020-1-22 15:46
謝謝一樓大佬
作者: 高手本人    時(shí)間: 2020-4-30 12:42
感謝一樓大佬耐心講解
作者: Lizhaojun97    時(shí)間: 2021-1-8 00:29
凌凈清河 發(fā)表于 2018-11-17 17:44
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;  

1325416不是應(yīng)該顯示為7位嗎?為什么是說顯示為5位呢?
作者: Lizhaojun97    時(shí)間: 2021-1-8 00:47
凌凈清河 發(fā)表于 2018-11-17 17:44
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;  

非常感謝您的講解,我已經(jīng)理解這個(gè)函數(shù)的功能和作用過程了。再次表示深切的感謝。
作者: whisper01    時(shí)間: 2021-2-14 19:10
謝大佬,自己看了半天也沒明白,看了講解瞬間理解,太強(qiáng)了
作者: 清風(fēng)竹影69    時(shí)間: 2021-11-26 09:37
例如:num=1325416;顯示長度為5,那么num/oled_pow(10,len-t-1)運(yùn)算之后就是13。在這個(gè)結(jié)果上再對(duì)10取余就是最后一位。
改為下面這種說法容易懂一些(“顯示長度為5”的說法太突然,的確令人困惑):
例如:num=1325416;如果己經(jīng)顯示了25416這五位數(shù),緊接著需要顯示“3”,那么可以用語句num/oled_pow(10,len-t-1)進(jìn)行運(yùn)算得到結(jié)果“13”。在這個(gè)結(jié)果上“13”再對(duì)10取余就得到“3”。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1