8421码转16进制的c语言,将8421BCD码转换为十进制数(转)
//*****************************************************************
//bcd hex
//此函数用于将8421BCD码转换为十进制数,从函数参数可以看出此BCD码是由两位十进制数组成的。BCD码是用二进制数对十进制数的各个位数进行编码,比如十进制数58,那么转换为BCD码为0x58,356对应BCD码就是0x356。注意这是编码不是数进制间的转换,他们之间不存在等价关系。只是进行编号,为了方便对编号后的数据用十六进制数表示。对应编码规则如下:
十进制数---8421BCD码----编码后用等价的十六进制数表示
0-----------0000----------0x0
1-----------0001----------0x1
2-----------0010----------0x2
3-----------0011----------0x3
4-----------0100----------0x4
5-----------0101----------0x5
6-----------0110----------0x6
7-----------0111----------0x7
8-----------1000----------0x8
9-----------1001----------0x9
知道了编码规则,那么将2位8421bcd码编号的数,还原为十进制数也就方便了。函数参数是一个字节那么决定了此8421BCD码是两位码即高四位是一个码值、低四位是一个码值,将高四位乘以10加上低四位码值就得到了十进制数。
byte bcd2_hex(byte val)
{
byte i;
i = val&0x0f; //按位与,i得到低四位数。
val >>= 4;
//右移四位,将高四位移到低四位的位置,得到高四位码值。
val &= 0x0f; //防止移位时高位补进1,只保留高四位码值
val *= 10; //高位码值乘以10
i += val; //然后与第四位码值相加。
return i; //将得到的十进制数返回
}
//*****************************************************************
//这个应该是一个类似I2C协议的字节写操作。
static void DS1302_WriteByte(byte val)
{
byte i;
//MinCardClk(0); //stop clk
//Sys_SetCpuClk(clockdiv1);
for(i = 0; i < 8; i++)
//通过循环将1字节也即8位二进制数送给i2c数据线。
{
if(val&0x01)DS1302_SDA_W(1);
//如果此位是1,那么送给数据线1
else DS1302_SDA_W(0); //如果是0,那么给数据线0
DS1302_SCK(0); //时钟线置0也即拉低
DS1302_SCK(1);
//时钟线置1,通过这两个动作时钟线产生一个从低到高的跳变,作用是通知从器件取走数据线上的数据。
val >>= 1;// FOR DELAY AND SHIFT
//右移数据,接着发送下一位数据,数据是从低位到高位发送。
}
//DS1302_SCK(0);
//Sys_SetCpuClk(clockdiv0);
//MinCardClk(1); //start clk
}
//*****************************************************************
//同理i2c读字节
static byte DS1302_ReadByte(void)
{
byte i,val;
//MinCardClk(0); //stop clk
//Sys_SetCpuClk(clockdiv1);
val=0;
DS1302_SDA_W(1);
for(i = 0; i < 8; i++)
//循环从数据线上读取8位数据,然后凑成一字节。
{
DS1302_SCK(1);
DS1302_SCK(0); //时钟一个从高到低的跳变,通知从器件将数据放到数据线上。
val >>= 1;
//接收完1位后右移数据,准备接收下一位,这里也是从低位到高位接收数据。
if(DS1302_SDA_R())val |= 0x80;
//如果是1那么与0x80或后就得到了1,如果是0,就不用管了因为在移位时直接补的是0.
}
//Sys_SetCpuClk(clockdiv0);
//MinCardClk(1); //start clk
return val;
}
一下是汇编的:
re: asm
BCD2BIN:
;
INPUT: R3:R2 -- BCD
; OUTPUT: R5:R4 -- BIN
; USE: A, B,
PWS
MOV A,
R2
CALL
BCD_BYTE2BIN
MOV R4,
A
MOV A,
R3
CALL
BCD_BYTE2BIN
MOV B,
#100
MUL AB
ADD A,
R4
MOV R4,
A
CLR A
ADDC A,
B
MOV R5,
A
RET
BCD_BYTE2BIN:
; 10*Y + X =
(16*Y + X)-6*Y = 250 * Y + (16*Y + X) - 256 *
Y MOV R5,
A
ANL A,
#0F0H
SWAP A
MOV B,
#250
MUL AB
ADD A,
R5
RET
8421码转16进制的c语言,将8421BCD码转换为十进制数(转)相关推荐
- c语言中如何将字符串转成16进制,用c语言写一个函数把十进制转换成十六进制,该如何处理...
用c语言写一个函数把十进制转换成十六进制 用c语言写一个函数把十进制转换成十六进制 网上找到一些,感觉有占乱 分享到: ------解决方案-------------------- #include ...
- 16进制(CRC16)(MODBUS RTU通讯)校验码在线计算器
最近在项目上遇到,用485协议命令控制灯光继电器的开关需要计算16进制(CRC16)(MODBUS RTU通讯)校验码来写控制命令,这种在网上有现成的计算器,我们直接使用即可,以下为我用的一个计算器的 ...
- ASCII码转16进制 十六进制转ASCII码
ASCII码转16进制 十六进制转ASCII码 //ASCII码转16进制 function strToHexCharCode(str) { if (str === "") { r ...
- C语言输出字符,字符串的ASCII码的16进制数
C语言输出字符,字符串的ASCII码的16进制数 /* file name : test.c cmd code : gcc -o test.exe test.c */ #include<stdi ...
- Ascii码 、16进制与 char
对于一个非计算机专业出身的人,以前只知道计算机中所有的数据都是以二进制形式进行存储,计算,通信的.但是人类文明中,主要的信息展现以文本的形式展现的.如果使用内存中的0和1来表示文本一直都是一 ...
- tostring 16进制_ToString:身份哈希码的十六进制表示形式
tostring 16进制 我以前在方便的Apache Commons ToStringBuilder上写过博客,最近有人问我,在生成的String输出中出现的看似神秘的文本是什么构成的. 询问该问题 ...
- C语言实现ASCII字符、压缩BCD码值与BIN码(16进制)互转 - (已编译,亲试可用)
目录 1.将压缩BCD码转为BIN码 2.将压缩BCD码数组转为BIN码数组 3.将BIN码转为压缩BCD码 4.将BIN码数组转为压缩BCD码数组 5.将ASCII码转为BIN码 6.将ASCII码 ...
- asic码转16进制c语言,十六进制数转换成ascii码
本文收集整理关于十六进制数转换成ascii码的相关议题,使用内容导航快速到达. 内容导航: Q1:一个十六进制数转换成ASCII码的单片机程序 HASC:MOVA,R0:从R0中取一个16进制(二进制 ...
- bcd码和16进制的区别
http://bbs.gongkong.com/D/200707/173493_1.shtml 举个例子:比如对于一个数:0000 0010 0011 1111 其16进制就是:23F 如果转换为BC ...
- C++ 中ASCII码转16进制数
工作中大佬给我布置了一个串口接收数据转换的任务,把接收的ASCII码转换成16进制数,我本来想上网找一个,但发现好像并没有什么特别有用的,所以自己研究一下,写一个吧. 我的思路是先把ASCII码强转成 ...
最新文章
- 可高效训练超大规模图模型,PyTorch BigGraph是如何做到的?
- 数据蒋堂 | 倍增分段技术
- 【KVM系列01】KVM简介及安装
- 2019_8_1python
- php 获取文件大小 修改时建,php遍历目录输出文件大小,类型,修改时间.
- Spring Boot EasyPoi导出Excel下载
- web前端的渐进增强式开发模型
- es6 数组排序_重读《学习JS数据结构与算法-第三版》- 第3章 数组 二
- 【C语言】最大的两个数(指针专题)
- Web前端的学习路线,你真的知道吗?
- Regionals 2014 Asia - Dhaka H 暴力
- Screen命令让Linux shell在后台运行
- python难学吗-Python为什么那么受欢迎?学习Python难不难?
- DirectShow录屏,帧率不可控制?
- 制作Ubuntu系统的USB启动盘
- 全链路监控及普罗米修斯学习
- 无刷直流电动机矢量控制(一)——无刷直流电机(BLDC)与永磁同步电机(PMSM)的相同点和区别
- 第十四篇,STM32的CAN总线通信
- 如何搭建java环境_vscode搭建java环境
- 数据库安全小白紧急求助论坛大神,困扰许久