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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

怎么簡潔的把0X138C轉換成ASCII碼

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

使用道具 舉報

沙發
ID:879809 發表于 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. }
復制代碼

評分

參與人數 1黑幣 +5 收起 理由
名字不是重點 + 5 很給力!

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

數組 DisBuf 里就是你要的“5004”.
回復

使用道具 舉報

6#
ID:824490 發表于 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;
回復

使用道具 舉報

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

額,51單片機中沒有printf這個函數啊
回復

使用道具 舉報

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

51單片機中沒有printf這個函數啊
回復

使用道具 舉報

9#
ID:277550 發表于 2022-2-11 13:45 | 只看該作者
PEB188 發表于 2022-2-11 12:04
51單片機中沒有printf這個函數啊

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

一直在用6樓說的做法,直截了當。
回復

使用道具 舉報

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

使用道具 舉報

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

我目前就是用這種方法啊
回復

使用道具 舉報

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

要的就是這種函數轉換
回復

使用道具 舉報

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

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

使用道具 舉報

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

Data_Send可以是整型,也可以是浮點型
#include "stdio.h" 這個就包含了sprintf函數
回復

使用道具 舉報

15#
ID:824490 發表于 2022-2-11 17:01 | 只看該作者
PEB188 發表于 2022-2-11 14:49
要的就是這種函數轉換

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

使用道具 舉報

16#
ID:824490 發表于 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).
//////////////////////////////////////////////////       
回復

使用道具 舉報

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

使用道具 舉報

18#
ID:879809 發表于 2022-2-12 17:09 | 只看該作者
名字不是重點 發表于 2022-2-11 17:06
void main()
{
  int n=0x138c;

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

使用道具 舉報

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

評分

參與人數 1黑幣 +5 收起 理由
名字不是重點 + 5 絕世好帖!

查看全部評分

回復

使用道具 舉報

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

19樓已給出結果了。。
另外:用Sprintf的方法,運行結果明顯比老方法耗費更多的時間。
回復

使用道具 舉報

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

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

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

這個方法減少多次除法運算 效率比從大頭拆高很多 很棒 供你參考 但因為我自己沒用 根據自己理解寫的程序可能有問題 你試試 理解意思即可 如果有疑問 可找一下原帖

我沒用這個方法 因為這樣還是需要運算 我本來用的是查表法 另一位大佬教我用更簡潔的代碼實現查表 但查表法要占用更大程序空間 因為要存放表格 尤其在數字很大的時候 所以沒推薦給你 對我來說運算比空間重要 寧可犧牲空間也要減少每次運算量

評分

參與人數 1黑幣 +5 收起 理由
名字不是重點 + 5 贊一個!

查看全部評分

回復

使用道具 舉報

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

uint a=5004; ...

贊!學習了!
你這個方法,運行得出結果的速度最快,美中不足有2點:
空間占用略大(16+420),且結果是逆向的。數據的后期處理要注意點。
回復

使用道具 舉報

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

uint a=5004; ...

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

使用道具 舉報

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

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

使用道具 舉報

25#
ID:824490 發表于 2022-2-12 20:58 | 只看該作者
回復

使用道具 舉報

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

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

使用道具 舉報

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

應該是讓數組掉個頭。

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).
*/////////





回復

使用道具 舉報

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

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

使用道具 舉報

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

是的,寫代碼還要兼顧到應用場景。ARM內核的單片用sprintf就是很方便。但用在小體量的51內核上,就要認真考量一下了。
回復

使用道具 舉報

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

這個for里面兩句是什么意思啊
回復

使用道具 舉報

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

使用道具 舉報

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

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

//明白了嗎?不明白我再來
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人a | 久久国产精品一区 | 久久精品国产一区二区电影 | 国产三级电影网站 | 欧美国产视频 | 欧美日韩黄色一级片 | 一区二区视频在线观看 | 免费网站国产 | 在线视频中文字幕 | 国产美女一区 | 午夜综合 | 日韩免费av网站 | 97伦理最新伦理 | 夜夜爽99久久国产综合精品女不卡 | 国产精品视频网 | 国产福利在线播放麻豆 | 色综合天天综合网国产成人网 | 日韩久久综合网 | 超碰在线97国产 | 国产精品久久国产精品 | 亚洲成网 | 一级黄色毛片a | 国产精品久久久久久久久久 | 日韩中文字幕一区 | 成人精品 | 91精品一区| 久久精品久久久久久 | 成人一区二 | 国产成人久久 | 国产亚洲成av人片在线观看桃 | 91大神新作在线观看 | 国产激情在线看 | 99re99 | 久久精品国产一区二区三区不卡 | 一级片在线免费播放 | 激情综合五月天 | 一二三四在线视频观看社区 | 亚洲一区精品在线 | 国产一区欧美 | 黄色播放 | 午夜激情影院 |