IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> C语言实现十进制转十六进制--为单片机编写(数据转换,并非单纯显示) -> 正文阅读

[嵌入式]C语言实现十进制转十六进制--为单片机编写(数据转换,并非单纯显示)

关于十进制转十六进制,网上的方法很多,但其中相当一部分是基于显示上的转换,或是利用一些其他的库或头文件。对初学者或是希望代码在单片机环境下运行的人来说,这些代码并不是非常有用。
本文基于本站一位作者的文章所给出的方法和代码进行了一些修改简化(链接如下),得出以下代码。

参考文章链接:https://blog.csdn.net/Deheng_Kong/article/details/115550227

代码实现:
此方法主要使用位操作对十进制数进行系列处理,得到对应十六进制数。

#include<stdio.h>
#define length_8 100

typedef unsigned short int usint;

usint HexData_8[length_8];        //用于缓存8位十六进制数的区域
/* --------------十进制(8位)数组转换为十六进制数组---------------- */
void Dec2Hex_8(usint* temp)		//由于没有8位的数据类型,我们只能“假装”它是8位
{
	int i,n,x,Rem;
	usint Hex = 0xFF;
	usint Dec = 0;
	usint rem = 0;    //定义余数变量
	usint mer = 0;    //定义商变量
	for(i = 0;i < length_8;i++)   //有几个数要转换,length_8就等于几
	{
		Dec = temp[i];		//取第i个十进制数进行操作
		Hex = 0xFF;			//用来写对应十六进制数的“十六进制格式白纸”
		if(Dec >= 16 && Dec < 256){
			for(n = 0;n < 2;n++){
				rem = Dec % 16;		//获得对应十六进制数的低位(低4位)
				mer = Dec / 16;		//获得对应十六进制数的高位(高4位)
				Dec = mer;
				Rem=(rem>>4|(rem<<4))+15;	//获得0x'rem'F
				Hex &=(Rem>>4|(Rem<<4));	//Hex&=0xF'rem'   每执行一次rem>>4|(rem<<4)将rem的高4位与低4位对调
				Hex=(Hex>>4|((Hex<<4)-((Hex<<4)-(Hex<<4)%256)));
				/*
				上面这步比较麻烦,为的是将0xF'rem'变成0x'rem'F
				但是这里的变量Hex并不是8位,0xFA<<4会变成0xFA0,而不是我想要的0xA0,大家懂我意思吧
				所以要手动把最高的4位抹掉
				*/
			}
		}
		else if(Dec > 0 && Dec < 16){
			for(x = 0;x < 1;x++){
				rem = Dec % 16;
				mer = Dec / 16;
				Dec = mer;
				Rem=(rem>>4|(rem<<4))+15;
				Hex &=(Rem>>4|(Rem<<4));
				Hex=(Hex>>4|((Hex<<4)-((Hex<<4)-(Hex<<4)%256)));
				Hex>>=4;
			}
		}
		else
		{
			Hex = 0x00;
		}
		HexData_8[i] = Hex;
	}
}

/* ---------------------测试----------------------- */
int main(void){
	int i=0;
	usint x[100]={23,55,77,26,34,65,76,23,45,86,34,45,34,3,23,65,34,24,76,
	34,78,43,23,46,23,56,84,34,74,34,56};
	Dec2Hex_8(x);
	for(i=0;i<30;i++){
		if(x[i]!=HexData_8[i]){
			printf("Wrong!\n,第%d个\n",i);
			printf("十六进制数%02x",HexData_8[i]);
			printf("不等于%d\n",x[i]);
		}
	}
	printf("Right!");
	return 0;
} 

代码大概就是这样了,建议先看那位作者的代码会更易懂些。

最后我还粗略地测了下速度:

P1: 以上代码运行前
以上代码运行前
P2: 运行后
运行后
P3: 原作者代码运行前
原作者代码运行前
P4: 运行后
运行后

以上代码运行时间: 0.000 78600
原作者代码运行时间:0.000 48850

(测速的代码原作者的代码我没有修改,也就是说是算16位十六进制数的代码,所以我这种写法虽然代码少一些,但是会慢很多)

如果大家发现上面有不对的的地方或是其他更好的想法,欢迎提出一起讨论。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-19 12:12:44  更:2021-08-19 12:12:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:45:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码