数码之家

 找回密码
 立即注册
搜索
查看: 3617|回复: 10

[STM] 求助:16进制变量转成字符串

[复制链接]
发表于 2019-10-13 16:16:23 | 显示全部楼层 |阅读模式
300家元
本帖最后由 zhuls 于 2019-10-13 16:20 编辑

输入的是一个16进制的变量,比如 u16  Color=0xFEE7
输出的是一个字符串 “0xFEE7"
   MDK5.21中,有什么好方法可以实现?
最好能给中完整的代码
u8 VolumeToString(u16 Volume)
{



}
调用时:
Lcd_Disply_string(0,23,VolumeToString(Color),Color);这样就OK了
就是让Color的值,用字符串的形式出现在LCD上,并且字体颜色就等于Color的值。

发表于 2019-10-13 19:30:13 | 显示全部楼层
著名函数:sprintf
就是占用储存比较多
回复

使用道具 举报

发表于 2019-10-13 19:56:48 | 显示全部楼层
告诉你思路自己写
先左右移位获取单个16进制数 比如0xFEE7 运算后结果0x7;
小于A的直接加0x30 即可获得‘0-9’的ACSII码;
大于9的先减10再加0x41即可获得‘A-F’的ACSII码;
回复

使用道具 举报

 楼主| 发表于 2019-10-13 21:04:45 | 显示全部楼层
xpicompany 发表于 2019-10-13 19:30
著名函数:sprintf
就是占用储存比较多

能给出代码不?我对这个函数不熟:sweat:
回复

使用道具 举报

 楼主| 发表于 2019-10-13 21:05:37 | 显示全部楼层
红色海螺 发表于 2019-10-13 19:56
告诉你思路自己写
先左右移位获取单个16进制数 比如0xFEE7 运算后结果0x7;
小于A的直接加0x30 即可获得‘0 ...

能给出代码不?
回复

使用道具 举报

发表于 2019-10-13 21:18:00 | 显示全部楼层
u16  Color=0xFEE7
u8 s[4];
s[0] = (Color>>12)+'0';
s[1] = ((Color>>8) & 0xf)+'0';
s[2] = ((Color>>4)&0xf)+'0';
s[3] = (Color & 0xf)+'0';
s[4]=0;

回复

使用道具 举报

发表于 2019-10-14 11:10:20 | 显示全部楼层
本帖最后由 huaweiwx 于 2019-10-22 21:01 编辑

你的函数要求原型:
u8 VolumeToString(u16 Volume){
?
?
?
}

1  对于写一个函数,首先需要确定的是,输入参数,在c中可以是直接传递数据(值)或指向数据的指针(地址),这里是数值 u16 Volume,其次是返回结果的方式及放在哪里的问题,对于字符串这样的返回值,因为长度通常是不定的,显然用指针较好;这里用u8值,只有一个字符长度显然是不够的;

2 给你写个参考并加上了注释:

void  u16ToString(u16 Volume, char *hexStr) {    /* hexStr 为转换后的字符串 0xXXXX*/
  u8  j;
  char  str[] = "0123456789ABCDEF";   /*16进制字符表,用查表法高效快速*/
  for (j = 5; j > 1; j--) {                        /* 从个位起开始查表,共 5-1 = 4 次 */
    hexStr[j] = str[Volume & 0x0f];        /*Volume & 0x0f:取得 该位的16进制值,对应的就是str数组的ascii码*/
    Volume = Volume >> 8;                                /*右移 8bit 就是取得下个 16进制位值,供循环下次使用 */
  }
  hexStr[0] = '0'; hexStr[1] = 'x';         /*  最后 在 头部补上表示hex字符串的 0x 标识*/
  hexStr[6] = 0;                                 /*              尾部补上字符串结束符*/
}

3 调用方法,需要先定义一个返回结果的字符空间,调用时将转换的数值和这个空间位置一并传递给u16ToString函数,如下:

char   strBuf[6+1];   /*0xXXXX 长度6,字符串需要补个结束符 0 */
u16   Color = 0xFEE7;
......
// 调用 改成:
u16ToString(Color,strBuf);   /*转换调用,结果在 strBuf*/

Lcd_Disply_string(0,23, strBuf,Color);


回复

使用道具 举报

发表于 2019-10-14 11:45:15 | 显示全部楼层
本帖最后由 huaweiwx 于 2019-10-22 21:02 编辑

如果,你一定想用字符指针作为返回值,也可以这样写:
char* VolumeToString(u16 Volume) {    /*  声明返回类型为8 位char 指针(字符串)*/
  u8  j;
  char  str[] = "0123456789ABCDEF";    /* 16进制字符表,用查表法高效快速*/
  static char hexStr[6+1] = "0xXXXX";        /* 用 static 类型,退出函数后仍然能保存,同时初始化字符串0x 和 结束符*/
  for (j = 5; j > 1; j--) {                        /* 从个位起开始查表,共 5-1 = 4 次 */
    hexStr[j] = str[Volume & 0x0f];        /*Volume & 0x0f:取得 该位的16进制值,对应的就是str数组的ascii码*/
    Volume = Volume >> 8;                                /*右移 8bit 就是取得下个 16进制位值,供循环下次使用 */
  }
  return hexStr;
}

3 调用方法,就不需要定义一个返回结果的字符空间,可直接调用:
u16   Color = 0xFEE7;
Lcd_Disply_string(0,23,VolumeToString(Color),Color);


回复

使用道具 举报

 楼主| 发表于 2019-10-14 15:25:15 | 显示全部楼层
huaweiwx 发表于 2019-10-14 11:45
如果,你一定想用字符指针作为返回值,也可以这样写:
char* VolumeToString(u16 Volume) {    /*  声明返 ...

好的,我晚上回家试一下,正在扛水泥包呢~~
回复

使用道具 举报

发表于 2019-10-14 16:06:50 | 显示全部楼层
本帖最后由 netbeetle 于 2019-10-14 16:17 编辑
zhuls 发表于 2019-10-13 21:04
能给出代码不?我对这个函数不熟

char *  VolumeToString(u16 Volume)
{
static char Temp[7];
sprintf(Temp,"Ox%X",Volume);
return Temp;
}
回复

使用道具 举报

发表于 2019-10-16 21:37:07 | 显示全部楼层
sprintf(buff, "0x%08X", val);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-25 16:33 , Processed in 0.327600 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表