久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9774|回復: 11
打印 上一主題 下一主題
收起左側

提問個OLED的顯示程序問題

  [復制鏈接]
跳轉到指定樓層
樓主
ID:355729 發表于 2018-11-16 14:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
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;//這里算出來到底是什么數
  if(enshow==0&&t<(len-1))
  {
   if(temp==0)
   {
    OLED_ShowChar(x+(size2/2)*t,y,' ');//這里的' '怎么和阿斯克碼表對上的
    continue;
   }else enshow=1;
     
  }
   OLED_ShowChar(x+(size2/2)*t,y,temp+'0'); //這里又為什么+0
}
}   


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:362076 發表于 2018-11-17 17:44 | 只看該作者
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碼。


打字不易,希望認真讀懂為好。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:480106 發表于 2019-7-20 20:00 | 只看該作者
凌凈清河 發表于 2018-11-17 17:44
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;  

感謝一樓大佬的仔細講解。多謝大佬
回復

使用道具 舉報

地板
ID:602896 發表于 2019-8-24 01:40 | 只看該作者
太厲害,佩服學習了
回復

使用道具 舉報

5#
ID:600305 發表于 2019-11-18 15:07 | 只看該作者
感謝大佬的講解,一目了然
回復

使用道具 舉報

6#
ID:658310 發表于 2020-1-20 19:38 | 只看該作者
謝謝一樓大佬的細心講解
回復

使用道具 舉報

7#
ID:687851 發表于 2020-1-22 15:46 | 只看該作者
謝謝一樓大佬
回復

使用道具 舉報

8#
ID:355729 發表于 2020-4-30 12:42 | 只看該作者
感謝一樓大佬耐心講解
回復

使用道具 舉報

9#
ID:875128 發表于 2021-1-8 00:29 | 只看該作者
凌凈清河 發表于 2018-11-17 17:44
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;  

1325416不是應該顯示為7位嗎?為什么是說顯示為5位呢?

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

10#
ID:875128 發表于 2021-1-8 00:47 | 只看該作者
凌凈清河 發表于 2018-11-17 17:44
u32 oled_pow(u8 m,u8 n)
{
u32 result=1;  

非常感謝您的講解,我已經理解這個函數的功能和作用過程了。再次表示深切的感謝。

評分

參與人數 2黑幣 +25 收起 理由
凌凈清河 + 5 不用客氣~&gt;v&lt;
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

11#
ID:567009 發表于 2021-2-14 19:10 | 只看該作者
謝大佬,自己看了半天也沒明白,看了講解瞬間理解,太強了
回復

使用道具 舉報

12#
ID:456595 發表于 2021-11-26 09:37 | 只看該作者
例如:num=1325416;顯示長度為5,那么num/oled_pow(10,len-t-1)運算之后就是13。在這個結果上再對10取余就是最后一位。
改為下面這種說法容易懂一些(“顯示長度為5”的說法太突然,的確令人困惑):
例如:num=1325416;如果己經顯示了25416這五位數,緊接著需要顯示“3”,那么可以用語句num/oled_pow(10,len-t-1)進行運算得到結果“13”。在這個結果上“13”再對10取余就得到“3”。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美黄 片免费观看 | www四虎影视 | 日本一区二区三区在线观看 | 81精品国产乱码久久久久久 | 特级丰满少妇一级aaaa爱毛片 | 中文字幕成人免费视频 | 中文字幕日韩欧美 | 精品视频一区二区 | 全免费a级毛片免费看视频免 | 婷婷国产一区二区三区 | 五月婷婷在线播放 | 亚洲在线免费 | 亚洲国产中文字幕 | 一区二区在线免费播放 | 日本精品一区二区 | 亚洲国产精品自拍 | 中文字幕在线视频精品 | 91不卡| 亚洲精品无 | 国产精品高潮呻吟久久久久 | 精品久久久久久久久久久久久久 | 国产美女在线观看 | 日日碰狠狠躁久久躁婷婷 | 色永久| www.一区二区 | 成人教育av | 天堂一区二区三区四区 | 精品久久久网站 | 日本成年免费网站 | 特级黄色毛片 | 欧美精品一区二区三区在线播放 | a级免费黄色片 | 国产精品欧美一区二区三区不卡 | 一区二区三区视频在线观看 | 91久久北条麻妃一区二区三区 | 久久视频精品在线 | 国产第一区二区 | 波多野结衣精品 | 一区二区影院 | av在线免费观看网站 | 国产精品久久久久无码av |