找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3342|回復(fù): 31
打印 上一主題 下一主題
收起左側(cè)

怎么簡潔的把0X138C轉(zhuǎn)換成ASCII碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
把0X138C轉(zhuǎn)換成ASCII '5004'怎么寫最簡單。因?yàn)楂@取的是電壓,我現(xiàn)在是先轉(zhuǎn)換成10進(jìn)制,再用十進(jìn)制每位+0x30得到ASCII碼。請教簡單的高效的寫法
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:879809 發(fā)表于 2022-2-10 23:42 | 只看該作者
  1. int n=0x138c;
  2. char *ptr=&ch[3];
  3. for(int i=0;i<4;i++){
  4.   *ptr--="0123456789"[n%/10];
  5.   n/=10;
  6. }
復(fù)制代碼

評分

參與人數(shù) 1黑幣 +5 收起 理由
名字不是重點(diǎn) + 5 很給力!

查看全部評分

回復(fù)

使用道具 舉報(bào)

板凳
ID:311903 發(fā)表于 2022-2-11 09:33 | 只看該作者
sprintf
回復(fù)

使用道具 舉報(bào)

地板
ID:939710 發(fā)表于 2022-2-11 09:56 | 只看該作者
用sprintf直接打印到字符串比較簡單
回復(fù)

使用道具 舉報(bào)

5#
ID:94031 發(fā)表于 2022-2-11 10:28 | 只看該作者

數(shù)組 DisBuf 里就是你要的“5004”.
回復(fù)

使用道具 舉報(bào)

6#
ID:824490 發(fā)表于 2022-2-11 11:24 | 只看該作者
        int n=0x138c;
        unsigned char k10 [5];       
        k10[0]=n / 10000 + 0x30;
        k10[1]=n / 1000 % 10+0x30;
        k10[2]=n / 100 % 10+0x30;
        k10[3]=n / 10 % 10+0x30;
        k10[4]=n % 10 + 0x30;
回復(fù)

使用道具 舉報(bào)

7#
ID:956872 發(fā)表于 2022-2-11 12:03 | 只看該作者

額,51單片機(jī)中沒有printf這個(gè)函數(shù)啊
回復(fù)

使用道具 舉報(bào)

8#
ID:956872 發(fā)表于 2022-2-11 12:04 | 只看該作者
lishengaha 發(fā)表于 2022-2-11 09:56
用sprintf直接打印到字符串比較簡單

51單片機(jī)中沒有printf這個(gè)函數(shù)啊
回復(fù)

使用道具 舉報(bào)

9#
ID:277550 發(fā)表于 2022-2-11 13:45 | 只看該作者
PEB188 發(fā)表于 2022-2-11 12:04
51單片機(jī)中沒有printf這個(gè)函數(shù)啊

看人家的例子,就是C51中的。

一直在用6樓說的做法,直截了當(dāng)。
回復(fù)

使用道具 舉報(bào)

10#
ID:824490 發(fā)表于 2022-2-11 14:09 | 只看該作者
用sprintf打印字符串的方法可以是可以,但的消耗的代碼空間是很嚇人的。能不用,則盡量不用。。
回復(fù)

使用道具 舉報(bào)

11#
ID:956872 發(fā)表于 2022-2-11 14:40 | 只看該作者
名字不是重點(diǎn) 發(fā)表于 2022-2-11 11:24
int n=0x138c;
        unsigned char k10 [5];       
        k10[0]=n / 10000 + 0x30;

我目前就是用這種方法啊
回復(fù)

使用道具 舉報(bào)

12#
ID:956872 發(fā)表于 2022-2-11 14:49 | 只看該作者
xuyaqi 發(fā)表于 2022-2-11 10:28
數(shù)組 DisBuf 里就是你要的“5004”.

要的就是這種函數(shù)轉(zhuǎn)換
回復(fù)

使用道具 舉報(bào)

13#
ID:956872 發(fā)表于 2022-2-11 15:18 | 只看該作者
名字不是重點(diǎn) 發(fā)表于 2022-2-11 14:09
用sprintf打印字符串的方法可以是可以,但的消耗的代碼空間是很嚇人的。能不用,則盡量不用。。

一開始不知道。。。確實(shí),就用這一句,占用了差不多1K代碼空間。
回復(fù)

使用道具 舉報(bào)

14#
ID:401564 發(fā)表于 2022-2-11 15:38 | 只看該作者
char   k[10];        //指定數(shù)組長度
char a;
sprintf(k,"%.d",Data_Send);//把數(shù)據(jù)分割成字符串,并存放在k數(shù)組中

Data_Send可以是整型,也可以是浮點(diǎn)型
#include "stdio.h" 這個(gè)就包含了sprintf函數(shù)
回復(fù)

使用道具 舉報(bào)

15#
ID:824490 發(fā)表于 2022-2-11 17:01 | 只看該作者
PEB188 發(fā)表于 2022-2-11 14:49
要的就是這種函數(shù)轉(zhuǎn)換

這種方式看上去簡單,消耗空間可不簡單!多出幾百個(gè)字節(jié)不在話下!你還要效率不?
回復(fù)

使用道具 舉報(bào)

16#
ID:824490 發(fā)表于 2022-2-11 17:06 | 只看該作者
void main()
{
  int n=0x138c;
  unsigned char k10[5];

        k10[0]=n/10000 + 0x30;
        k10[1]=n/1000 % 10+0x30;
        k10[2]=n/100 % 10+0x30;
        k10[3]=n/10 % 10+0x30;
        k10[4]=n%10 + 0x30;
       
while(1);       
}
//////////////////////////////////////////////////       
編譯后的信息:
Build target 'Target 1'
compiling hex2dec.c...
linking...
Program Size: data=14.0 xdata=0 code=257
"hex2dec" - 0 Error(s), 0 Warning(s).

///////////////////////////////////////////////////


#include <reg52.h>
#include <stdio.h>


void main()
{
int k=0x138c;
unsigned char disbuf[5];
       
        sprintf(disbuf,"%05d",k);
       
while(1);       
}       

       
//////////////////////////////////////////////////       
編譯后的信息:
Build target 'Target 1'
compiling hex2dec.c...
linking...
Program Size: data=40.1 xdata=0 code=1087
"hex2dec" - 0 Error(s), 0 Warning(s).
//////////////////////////////////////////////////       
回復(fù)

使用道具 舉報(bào)

17#
ID:1004705 發(fā)表于 2022-2-12 14:34 | 只看該作者
用sprintf可以
回復(fù)

使用道具 舉報(bào)

18#
ID:879809 發(fā)表于 2022-2-12 17:09 | 只看該作者

能不能幫我測試下沙發(fā)的代碼占用多少資源,我沒有C51,用gcc測試可以用,有個(gè)小筆誤,[n%/10]應(yīng)該是[n%10],其他代碼無問題。
回復(fù)

使用道具 舉報(bào)

19#
ID:290373 發(fā)表于 2022-2-12 18:18 | 只看該作者
要代碼簡潔用sprintf,代價(jià)是多幾百個(gè)字節(jié);
沙發(fā)的有一些小錯誤,看似是兼顧程序量與大小的最優(yōu)解法了,附上程序編譯結(jié)果。

評分

參與人數(shù) 1黑幣 +5 收起 理由
名字不是重點(diǎn) + 5 絕世好帖!

查看全部評分

回復(fù)

使用道具 舉報(bào)

20#
ID:824490 發(fā)表于 2022-2-12 18:18 | 只看該作者
發(fā)表于 2022-2-12 17:09
能不能幫我測試下沙發(fā)的代碼占用多少資源,我沒有C51,用gcc測試可以用,有個(gè)小筆誤,[n%/10]應(yīng)該是[n%10 ...

19樓已給出結(jié)果了。。
另外:用Sprintf的方法,運(yùn)行結(jié)果明顯比老方法耗費(fèi)更多的時(shí)間。
回復(fù)

使用道具 舉報(bào)

21#
ID:47286 發(fā)表于 2022-2-12 19:05 | 只看該作者
前一陣我也問過類似的問題 就是大數(shù)拆位 有兩位大佬給的方法都很牛 我是受益匪淺 介紹給吧

uint a=5004;//HEX還是DEC都一樣 反正值是一樣的
uchar a0[4]={0};//建立一個(gè)數(shù)組存放拆解出來的位值 順序是 個(gè) 十 百 千

for(x=0;x<4;x++)
{
a0[x]=(a%10)+0x30;//每次只獲得最末位的位值 即 個(gè)位值 然后轉(zhuǎn)換成ASCII
a=a/10;//每次把總數(shù)/10 等于把總數(shù)右移一位 注意 不是>>那種移位
}

這個(gè)方法減少多次除法運(yùn)算 效率比從大頭拆高很多 很棒 供你參考 但因?yàn)槲易约簺]用 根據(jù)自己理解寫的程序可能有問題 你試試 理解意思即可 如果有疑問 可找一下原帖

我沒用這個(gè)方法 因?yàn)檫@樣還是需要運(yùn)算 我本來用的是查表法 另一位大佬教我用更簡潔的代碼實(shí)現(xiàn)查表 但查表法要占用更大程序空間 因?yàn)橐娣疟砀?尤其在數(shù)字很大的時(shí)候 所以沒推薦給你 對我來說運(yùn)算比空間重要 寧可犧牲空間也要減少每次運(yùn)算量

評分

參與人數(shù) 1黑幣 +5 收起 理由
名字不是重點(diǎn) + 5 贊一個(gè)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

22#
ID:824490 發(fā)表于 2022-2-12 20:39 | 只看該作者
dzbj 發(fā)表于 2022-2-12 19:05
前一陣我也問過類似的問題 就是大數(shù)拆位 有兩位大佬給的方法都很牛 我是受益匪淺 介紹給吧

uint a=5004; ...

贊!學(xué)習(xí)了!
你這個(gè)方法,運(yùn)行得出結(jié)果的速度最快,美中不足有2點(diǎn):
空間占用略大(16+420),且結(jié)果是逆向的。數(shù)據(jù)的后期處理要注意點(diǎn)。
回復(fù)

使用道具 舉報(bào)

23#
ID:824490 發(fā)表于 2022-2-12 20:46 | 只看該作者
dzbj 發(fā)表于 2022-2-12 19:05
前一陣我也問過類似的問題 就是大數(shù)拆位 有兩位大佬給的方法都很牛 我是受益匪淺 介紹給吧

uint a=5004; ...

用  for(x=4;x>0;x--) 這個(gè)可以解決逆序問題
回復(fù)

使用道具 舉報(bào)

24#
ID:824490 發(fā)表于 2022-2-12 20:57 | 只看該作者
田賀 發(fā)表于 2022-2-12 18:18
要代碼簡潔用sprintf,代價(jià)是多幾百個(gè)字節(jié);
沙發(fā)的有一些小錯誤,看似是兼顧程序量與大小的最優(yōu)解法了, ...

這個(gè)好,贊!
可以說是這主題中最佳答案了。
速度快、占用空間最小的。。
回復(fù)

使用道具 舉報(bào)

25#
ID:824490 發(fā)表于 2022-2-12 20:58 | 只看該作者

學(xué)習(xí)了~~
回復(fù)

使用道具 舉報(bào)

26#
ID:879809 發(fā)表于 2022-2-12 21:43 | 只看該作者
田賀 發(fā)表于 2022-2-12 18:18
要代碼簡潔用sprintf,代價(jià)是多幾百個(gè)字節(jié);
沙發(fā)的有一些小錯誤,看似是兼顧程序量與大小的最優(yōu)解法了, ...

我用MinGW測試*ptr--沒問題啊!為啥要改成ptr[3-i]?難道C51用指針效率非常低嘛?
回復(fù)

使用道具 舉報(bào)

27#
ID:824490 發(fā)表于 2022-2-12 23:49 | 只看該作者
發(fā)表于 2022-2-12 21:43
我用MinGW測試*ptr--沒問題啊!為啥要改成ptr[3-i]?難道C51用指針效率非常低嘛?

應(yīng)該是讓數(shù)組掉個(gè)頭。

void main()
{
unsigned char  x;
unsigned int n=65535;
unsigned char ptr[5];

for(x=5;x>0;x--)
{
   ptr[x-1]="0123456789"[n%10]-0X30;
   n/=10;
}
while(1);
}
/*/////編譯后:
Build target 'Target 1'
linking...
Program Size: data=16.0 xdata=0 code=170
"test" - 0 Error(s), 0 Warning(s).
*/////////





回復(fù)

使用道具 舉報(bào)

28#
ID:401564 發(fā)表于 2022-2-13 01:43 | 只看該作者
名字不是重點(diǎn) 發(fā)表于 2022-2-11 14:09
用sprintf打印字符串的方法可以是可以,但的消耗的代碼空間是很嚇人的。能不用,則盡量不用。。

用C語言寫程序就是圖它省事的
sprintf會占用1K左右的代碼空間,如果單片機(jī)的內(nèi)存足夠的話,sprintf實(shí)在是個(gè)好東西
對于有十幾K或者幾十K內(nèi)存的單片機(jī),sprintf占用的那點(diǎn)內(nèi)存并不算多
主要還是自動轉(zhuǎn)換負(fù)號和小數(shù)點(diǎn)這兩個(gè)功能比較好用
回復(fù)

使用道具 舉報(bào)

29#
ID:824490 發(fā)表于 2022-2-13 10:50 | 只看該作者
Y_G_G 發(fā)表于 2022-2-13 01:43
用C語言寫程序就是圖它省事的
sprintf會占用1K左右的代碼空間,如果單片機(jī)的內(nèi)存足夠的話,sprintf實(shí)在是 ...

是的,寫代碼還要兼顧到應(yīng)用場景。ARM內(nèi)核的單片用sprintf就是很方便。但用在小體量的51內(nèi)核上,就要認(rèn)真考量一下了。
回復(fù)

使用道具 舉報(bào)

30#
ID:956872 發(fā)表于 2022-2-16 13:11 | 只看該作者
田賀 發(fā)表于 2022-2-12 18:18
要代碼簡潔用sprintf,代價(jià)是多幾百個(gè)字節(jié);
沙發(fā)的有一些小錯誤,看似是兼顧程序量與大小的最優(yōu)解法了, ...

這個(gè)for里面兩句是什么意思啊
回復(fù)

使用道具 舉報(bào)

31#
ID:526543 發(fā)表于 2022-2-16 15:10 | 只看該作者
sprintf方便
回復(fù)

使用道具 舉報(bào)

32#
ID:824490 發(fā)表于 2022-2-16 20:30 | 只看該作者
PEB188 發(fā)表于 2022-2-16 13:11
這個(gè)for里面兩句是什么意思啊

for(x=5;x>0;x--)
{
   ptr[x-1]="0123456789"[n%10]-0X30;
//x-1,配合(x=5;x>0;x--),把轉(zhuǎn)換后的數(shù)值按“萬千百十個(gè)”位的順序存到數(shù)組ptr的0-4的單元中。
  //"0123456789":相當(dāng)于一個(gè)數(shù)組碼表
  //n%10 就是取n的個(gè)位數(shù),這個(gè)數(shù)對應(yīng)的碼值從"0123456789"中取出,
  //-0X30,這個(gè)要看轉(zhuǎn)換后的數(shù)值去處,比如,用來自定義顯示段碼,可以加上,
  //畢竟沒有人能定義一個(gè)長達(dá)數(shù)10個(gè)的成 員的段碼表,數(shù)碼管的段碼表一般就20(0x14)個(gè)以內(nèi)
  //但如果是用來字庫LCD顯示,則可以不用,字庫中的數(shù)據(jù)可是從00-94的。
   n/=10;//把n縮小10倍,并去除小數(shù)部分。
}

//明白了嗎?不明白我再來
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表