关于HEX转换为BCD码的一些理解
- 格式:doc
- 大小:405.00 KB
- 文档页数:7
16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。
程序可见:/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/6154551f93ba561440341732. html中的HEX2BCD子程序。
.说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。
做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。
但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。
上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。
.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。
为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的1/4!.近来,在网上发现了一个链接:/news/Article/uc/uc8051/200803/4751.html,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。
这篇文章提到的程序,一直也没有找到,也难辩真假。
这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。
比如说文中提到的:“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。
51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。
.下面说说做而论道的编程思路。
;-----------------------------------------------------------------------;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。
BCD码、十六进制与十进制互转•在做嵌入式软件的设计中,经常会遇到十六进制、BCD码与十进制之间的转换,最近做M1卡的应用中,涉及了大量的十六进制、BCD码与十进制之间的转换。
笔者通过对BCD码、十六进制权的理解,轻松的实现了他们之间的互换。
#include <stdio.h>#include <string.h>/////////////////////////////////////////////////////////功能:二进制取反////输入:const unsigned char *src 二进制数据// int length 待转换的二进制数据长度////输出:unsigned char *dst 取反后的二进制数据////返回:0 success////////////////////////////////////////////////////////int convert(unsigned char *dst, const unsigned char *src, int length) {int i;for(i=0; i<length; i++){dst[i] = src[i]^0xFF;}return 0;}//////////////////////////////////////////////////////////////功能:十六进制转为十进制////输入:const unsigned char *hex 待转换的十六进制数据// int length 十六进制数据长度////输出:////返回:int rslt 转换后的十进制数据////思路:十六进制每个字符位所表示的十进制数的范围是0 ~255,进制为256 // 左移8位(<<8)等价乘以256///////////////////////////////////////////////////////////unsigned long HextoDec(const unsigned char *hex, int length){int i;unsigned long rslt = 0;for(i=0; i<length; i++){rslt += (unsigned long)(hex[i])<<(8*(length-1-i));}return rslt;}///////////////////////////////////////////////////////// ////功能:十进制转十六进制////输入:int dec 待转换的十进制数据// int length 转换后的十六进制数据长度////输出:unsigned char *hex 转换后的十六进制数据////返回:0 success////思路:原理同十六进制转十进制////////////////////////////////////////////////////////// int DectoHex(int dec, unsigned char *hex, int length){int i;for(i=length-1; i>=0; i--){hex[i] = (dec%256)&0xFF;dec /= 256;}return 0;}///////////////////////////////////////////////////////// ////功能:求权////输入:int base 进制基数// int times 权级数////输出:////返回:unsigned long 当前数据位的权//////////////////////////////////////////////////////////// unsigned long power(int base, int times){int i;unsigned long rslt = 1;for(i=0; i<times; i++)rslt *= base;return rslt;}/////////////////////////////////////////////////////////////功能:BCD转10进制////输入:const unsigned char *bcd 待转换的BCD码// int length BCD码数据长度////输出:////返回:unsigned long 当前数据位的权////思路:压缩BCD码一个字符所表示的十进制数据范围为0 ~ 99,进制为100 // 先求每个字符所表示的十进制值,然后乘以权////////////////////////////////////////////////////////// unsigned long BCDtoDec(const unsigned char *bcd, int length){int i, tmp;unsigned long dec = 0;for(i=0; i<length; i++){tmp = ((bcd[i]>>4)&0x0F)*10 + (bcd[i]&0x0F);dec += tmp * power(100, length-1-i);}return dec;}/////////////////////////////////////////////////////////////功能:十进制转BCD码////输入:int Dec 待转换的十进制数据// int length BCD码数据长度////输出:unsigned char *Bcd 转换后的BCD码////返回:0 success////思路:原理同BCD码转十进制//////////////////////////////////////////////////////////// int DectoBCD(int Dec, unsigned char *Bcd, int length){int i;int temp;for(i=length-1; i>=0; i--){temp = Dec%100;Bcd[i] = ((temp/10)<<4) + ((temp%10) & 0x0F);Dec /= 100;}return 0;}int main(){register int i;unsigned char tmp_bff[12] = "";//十六进制转十进制unsigned char HEX[4] = {0x34, 0xFE, 0x3E, 0xFF};unsigned long dec_hex = 0;dec_hex = HextoDec(HEX, 4);printf("dec_hex = %d\n", dec_hex);//十进制转十六进制DectoHex(dec_hex, tmp_bff, 4);for(i=0; i<5; i++){printf("tmp_bff[%d] = 0x%02X\n",i, tmp_bff[i]);}//BCD码转十进制unsigned long dec_bcd = 0;unsigned char BCD[4] = {0x98, 0x23, 0x45, 0x78};dec_bcd = BCDtoDec(BCD, 4);printf("dec_bcd = %d\n", dec_bcd);//十进制转BCD码DectoBCD(dec_bcd, tmp_bff, 4);for(i=0; i<5; i++){printf("tmp_bff[%d] = 0x%02X\n", i, tmp_bff[i]);}getchar();}如果有其他的方法可以一起讨论。
ASCII码、HEX、字符、BCD等等基础知识思考每每遇到这些问题就要想个半天,想不明⽩还不舒服,今天特别把所想整理下避免以后再次进⼊思想漩涡计算机存储和传输都是以字节为单位1 bit = 1 ⼆进制数据1 byte = 8 bit1 字母 = 1 byte = 8 bit1 汉字 =2 byte = 16 bit1. bit:位⼀个⼆进制数据0或1,是1bit;2. byte:字节存储空间的基本计量单位,如:MySQL中定义 VARCHAR(45) 即是指 45个字节;1 byte = 8 bit3. ⼀个英⽂字符占⼀个字节;1 字母 = 1 byte = 8 bit4. ⼀个汉字占2个字节;1 汉字 =2 byte = 16 bit5. 标点符号A>. 汉字输⼊状态下,默认为全⾓输⼊⽅式;B>. 英⽂输⼊状态下,默认为半⾓输⼊⽅式;C>. 全⾓输⼊⽅式下,标点符号占2字节;D>. 半⾓输⼊⽅式下,标点符号占1字节;故:汉字输⼊状态下的字符,占2个字节 (但不排除,⾃⼰更改了默认设置);英⽂输⼊状态下的字符,占1个字节 (但不排除,⾃⼰更改了默认设置);ASCII码 因为信息在计算机上是⽤⼆进制表⽰的,这种表⽰法让⼈理解就很困难。
因此计算机上都配有输⼊和输出设备,这些设备的主要⽬的就是以⼀种⼈类可阅读的形式将信息在这些设备上显⽰出来供⼈阅读理解。
为保证⼈类和设备,设备和计算机之间能进⾏正确的信息交换,⼈们编制的统⼀的信息交换代码,这就是ASCII码表,它的全称是“美国信息交换标准代码”。
BCD码 BCD码(Binary-Coded Decimal?)亦称⼆进码⼗进数或⼆-⼗进制代码。
⽤4位⼆进制数来表⽰1位⼗进制数中的0~9这10个数码。
是⼀种⼆进制的数字编码形式,⽤⼆进制编码的⼗进制代码。
BCD码这种编码形式利⽤了四个位元来储存⼀个⼗进制的数码,使⼆进制和⼗进制之间的转换得以快捷的进⾏。
hex转bcd最快算法(实用版)目录1.HEX 转 BCD 的背景和意义2.HEX 转 BCD 的算法原理3.最快算法的实现和优化4.算法的优点和应用场景正文1.HEX 转 BCD 的背景和意义HEX(十六进制)和 BCD(二 - 十进制)是计算机中常用的数制表示方式。
在数字电路和计算机系统中,为了提高数据表示的精度和减少存储空间,常常需要将 HEX 数转换为 BCD 数。
HEX 转 BCD 的算法研究一直是计算机科学领域的热门话题,研究者们致力于寻找更快、更精确的转换算法。
2.HEX 转 BCD 的算法原理HEX 转 BCD 算法的原理是将每一位 HEX 数转换为相应的 BCD 数。
具体来说,每一位 HEX 数都有 4 位二进制表示,而每一位 BCD 数有 10 位二进制表示。
因此,每一位 HEX 数可以转换为两位半的 BCD 数,即 4 位二进制表示可以转换为 10 位二进制表示。
3.最快算法的实现和优化目前,最快的 HEX 转 BCD 算法是基于位运算的算法。
该算法利用位运算的快速和低耗特点,将每一位 HEX 数直接转换为相应的 BCD 数。
具体来说,每一位 HEX 数可以通过以下步骤转换为 BCD 数:- 将 HEX 数的 4 位二进制表示中的每一位与相应的权重相乘,权重分别为 1、2、4 和 8。
- 将乘积相加,得到 BCD 数的 10 位二进制表示。
- 将 10 位二进制表示中的前 6 位保留,后 4 位舍去,得到 BCD 数的 10 位二进制表示。
4.算法的优点和应用场景基于位运算的 HEX 转 BCD 算法具有速度快、精度高和占用资源少等优点。
hex2bcd的c函数在编程中,十六进制(hexadecimal)和二进制编码(binary-coded decimal,BCD)是常见的数据表示方式。
在某些特定的场景中,我们可能需要将十六进制转换为BCD格式,这就需要用到一个名为hex2bcd的C函数。
本文将一步一步地回答关于hex2bcd函数的问题,以帮助读者更好地理解和使用这个函数。
第一步:了解hex2bcd函数的基本原理hex2bcd函数的主要作用是将十六进制数转换为BCD格式。
BCD是一种用四位二进制表示一个十进制数字的编码方式。
例如,数字5在BCD中表示为0101,数字12表示为0001 0010。
hex2bcd函数通过位运算和移位操作,将十六进制数的每一位转换为相应的BCD格式。
第二步:理解hex2bcd函数的参数和返回值在C语言中,函数的参数和返回值是非常重要的。
我们首先需要了解hex2bcd 函数所需的参数和返回值。
一般而言,hex2bcd函数通常具有以下形式:uint8_t hex2bcd(uint8_t hex)hex2bcd函数只有一个参数hex,该参数为要转换的十六进制数。
返回值是一个无符号8位整数,表示转换后的BCD数。
第三步:实现hex2bcd函数在了解hex2bcd函数的基本原理和参数后,我们可以开始实现这个函数。
具体的实现方式可能因不同的编程语言而有所不同,这里我们以C语言为例给出一个简单的实现示例:cuint8_t hex2bcd(uint8_t hex) {uint8_t low = hex % 10;uint8_t high = hex / 10;return (high << 4) low;}上述代码中,我们首先通过取模运算得到hex的个位数(low)和十位数(high)。
然后,我们将十位数左移4位,并与个位数进行位运算,最终得到转换后的BCD 数。
第四步:使用hex2bcd函数进行转换编写完hex2bcd函数后,我们可以在实际应用中使用它进行转换。
十六进制数转BCD码的几种方法1.按位转换法:这种方法是将十六进制数的每一位转换成对应的BCD码。
将每一位数字转换成4位的BCD码,即用0000表示数字0,用0001表示数字1,以此类推,用1001表示数字9、例如,对于十六进制数0x2D,将2转换成0010,将D转换成1101,最终得到的BCD码就是001011012.分离法:这种方法将十六进制数的每一位数字分离出来,然后将每一位数字转换成对应的BCD码。
先将十六进制数分离成两个部分,高位和低位。
例如,对于十六进制数0x2D,高位是2,低位是D。
将2转换成0010,将D转换成1101,最终得到的BCD码就是001011013.ASCII码法:这种方法将十六进制数转换成ASCII码,然后将每个ASCII码转换成对应的BCD码。
每个字符的ASCII码都是8位二进制数,可以将8位二进制数分割成两个4位二进制数,然后将每个4位二进制数转换成对应的BCD码。
例如,对于十六进制数0x2D,将2转换成ASCII码0x32,将D转换成ASCII码0x44,然后将0x32转换成00110010的BCD码,将0x44转换成01000100的BCD码,最终得到的BCD码就是0011001001000100。
4.除2取余法:这种方法将十六进制数除以2,然后求余数,再将余数转换成对应的BCD码。
例如,对于十六进制数0x2D,将它除以2得到21,余数为1,将1转换成0001的BCD码,然后再将21除以2得到10,余数为0,将0转换成0000的BCD码,最终得到的BCD码就是00010000。
以上是几种常见的将十六进制数转换成BCD码的方法。
这些方法都是将十六进制数的每一位数字转换成对应的BCD码,只是实现方式不同。
根据具体的需求和编程环境,可以选择合适的方法进行转换。
C语⾔:⼗进制,BCD码互换详解⽬录1、复杂版2、简易版总结最近写单⽚机 RTC ⽇期、时间配置,需要实现⼗进制、BCD码互换,将⽰例Demo分享给各位朋友:BCD是指⽤⼆进制来表⽰⼗进制数的编码,即:⽤4位⼆进制来表⽰⼀位⼗进制数,因此4位⼆进制数表⽰最⼤的⼗进制数9(1001)。
⼀个四位的BCD码不能够表达⼗进制的两位数,因此当数字⼤于九时,我们需要⽤⼋位BCD码来表⽰。
⾼位只需要逢九进⼀即可。
⼗进制是逢⼗进⼀,⽽⼗六进制是逢⼗六进⼀,它们之间的每次进位差6,所以⼀个⼗进制数要转换成BCD码,要先算清多进位的位数。
当两个BCD码相加,如果和等于或⼩于 1001(即⼗进制数9),不需要修正。
如果相加之和在 1010 到1111(即⼗六进制数 0AH~0FH)之间,则需加 6 进⾏修正。
例如,⼗进制99进位了99/10=9次,每次进位和⼗六进制进位相⽐差6,所以⼀共差了9×6=54,即BCD码为:99+54=153(⼗六进制:0X99)。
BCD码转化成⼗进制码也⼀样原理。
1、复杂版⼗进制转换为BCD码,代码如下所⽰:int decimal_bcd_code(int decimal){int sum = 0; //sum返回的BCD码for (int i = 0; decimal > 0; i++){sum |= ((decimal % 10 ) << ( 4*i));decimal /= 10;}return sum;}BCD码转换为⼗进制,代码如下所⽰:int bcd_decimal_code( int bcd){int sum = 0, c = 1; // sum返回⼗进制,c每次翻10倍for(int i = 1; bcd > 0; i++){if( i >= 2){c*=10;}sum += (bcd%16) * c;bcd /= 16; // 除以16同理与⼗进制除10将⼩数点左移⼀次,取余16也同理}return sum;}2、简易版⼗进制转换为BCD码,代码如下所⽰:int bcd_decimal_code( int bcd){return (bcd + (bcd/10) * 6);}BCD码转换为⼗进制,代码如下所⽰:int decimal_bcd_code(int decimal){return (decimal - (decimal>>4) * 6);}参考资料:1、2、总结本篇⽂章就到这⾥了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!。
十进制数转化为bcd码
BCD码(Binary Coded Decimal)是一种二进制编码方式,用于表
示十进制数。
它采用四位二进制数来表示一个十进制数的一位,即每
位十进制数可表示为四个二进制数,常用于计算机与数码管之间的数
据转换。
将一个十进制数转化为BCD码的过程是较为简单的,下面将简要介绍
一下具体实现方法。
1. 确定BCD码的位数。
对于一个十进制数,每一位对应四个二进制位,所以BCD码的位数是原数位数的四倍。
2. 将十进制数每一位分离。
首先将十进制数的各位数分离出来,从低
位到高位依次分离出十位、百位、千位等。
3. 将分离出来的各位数分别转换为BCD码。
每个十进制数位都可以用
四位二进制数表示,因此可以将每个十进制数位分别转换为四位的二
进制数,即BCD码。
4. 拼接各位的BCD码。
将各位的BCD码按照十进制数从低位到高位
的顺序拼接在一起,即得到该数的BCD码表示。
例如,对于十进制数357,它的BCD码表示为0011 0101 0111。
在实际应用中,BCD码常用于数码管的控制和显示、密码输入、金融交易等场合。
DA指令和十六进制数转BCD码的几种方法2008年07月04日星期五11:28DA指令和十六进制数转BCD码的几种方法2008-06-20 14:32例2、设(A)= 56H 为56的压缩的BCD 码数,(R3)= 67H,(CY)=1执行ADDC A,R3DA A结果为:124注意:1)DA指令只能跟在加法指令后面使用;2)调整前参与运算的两数是BCD码数;3)DA指令不能与减法指令配对使用,但可以实现对A中压缩BCD减一操作。
例3、设(A)=30H(压缩BCD码数),执行:ADD A,#99HDA A后,便实现了30 -1 = 29的操作。
例4、两个4位BCD码相加,一个存放在(31H)(30H);另一个存放在(33H)(32H);和数拟回存在(31H)(30H)中,试编程实现之。
解:MOV R0,#30HMOV R1,#32HMOV A,@R0ADD A,@R1DA AMOV @R0,AINC R0INC R1MOV A,@R0ADDC A,@R1DA AMOV @R0,A在进行单片机系统开发时,有很多地方需要用到十六进制数和BCD码的转换。
比如说在需要将数据在显示器上显示时,因为参与系统内部计算的数据多为二进制数,而为了显示的时候直观方便,我们通常会将数据显示为常见的十进制形式。
这时在系统内部就必须进行十六进制到BCD码的转换。
关于十六进制到BCD码的转换,算法很多,我这里介绍三种方法。
三种方法在使用的时候各有优劣,后面会进行简单的比较。
一、方法一:;功能;单字节十六进制数转三位单字节BCD码;入口:单字节十六进制数存R5;出口:单字节BCD码存:百位R2,十位R3,个位R4;影响单元:中间寄存R5的高四位:R0,低四位:R1HEX2BCD:MOV A,R5ANL A,#0FHMOV R1,AMOV A,R5ANL A,#0F0HSWAP AMOV R0,AMOV R2,#00HMOV R3,#00HMOV R4,#00HMOV A,R1LCALL SUBMOV A,R0MOV R5,ASTART_1:CJNE R5,#00H,DEC_1AJMP NRET_1DEC_1:DEC R5MOV A,#10HLCALL SUBAJMP START_1NRET_1:MOV 7FH,R4MOV 7EH,R3MOV 7DH,R2RETSUB: ;子函数开始ADD A,R4 ;开始处理个位进十位CJNE A,#14H,JIN1;若A>=20则跳JIN2,否则跳NRET结束AJMP JIN2 ;JIN1: ;JNC JIN2 ;AJMP JIN3 ;JIN2:INC R3INC R3CLR CSUBB A,#14HAJMP JIN5JIN3:CJNE A,#0AH,JIN_3;若A>=10则跳JIN4,否则跳NEXT结束AJMP JIN4 ;JIN_3: ;JNC JIN4 ;AJMP NEXT ;JIN4:INC R3CLR CSUBB A,#0AHJIN5:MOV R4,A ;个位进十位处理完毕MOV A,R3 ;开始处理十位进百位CJNE A,#0AH,JIN6;若A>=10则跳JIN6,否则跳NEXT结束AJMP JIN7 ;JIN6: ;JNC JIN7 ;AJMP NEXT ;JIN7:INC R2CLR CSUBB A,#0AHMOV R3,A ;十位进百位处理完毕NEXT:RET ;子函数结束二、方法二:;功能;单字节十六进制数转三位单字节BCD码;入口:单字节十六进制数存R5;出口:单字节BCD码存:百位R2,十位R3,个位R4 ;影响单元:中间寄存R5的高四位:R0,低四位:R1HEX2BCD:MOV A,R5ANL A,#0FHMOV R1,AMOV A,R5ANL A,#0F0HSWAP AMOV R0,AMOV R2,#00HMOV R3,#00HMOV R4,#00HMOV A,R1LCALL SUBMOV A,R0MOV R5,ASTART_1:CJNE R5,#00H,DEC_1AJMP NRET_1DEC_1:DEC R5MOV A,#10HLCALL SUBAJMP START_1NRET_1:MOV 7FH,R4MOV 7EH,R3MOV 7DH,R2RETSUB: ;子函数开始ADD A,R4MOV B,#0AHDIV ABMOV R4,BADD A,R3MOV R3,AMOV B,#0AHDIV ABMOV R3,BADD A,R2MOV R2,ARET ;子函数结束三、方法三:;功能;单字节十六进制数转三位单字节BCD码;入口:单字节十六进制数存R5;出口:单字节BCD码存:百位R2,十位R3,个位R4;影响单元:R0,R1,R6HEX2BCD:CLR A ;BCD码初始化MOV R0, AMOV R1, AMOV R6, #08H ;转换单字节八进制整数HEX2BCD_N0:MOV A, R5RLC A ;从高端移出待转换数的一位到CY中MOV R5, AMOV A, R1 ;BCD码带进位自身相加,相当于乘2 ADDC A, R1DA A ;十进制调整MOV R1, AMOV A, R0ADDC A, R0MOV R0, A ;百位不可能超过2,故不需十进制调整DJNZ R6, HEX2BCD_N0 ;处理完8BITMOV A,R1 ;压缩BCD码转单字节BCD码ANL A,#0FH ;MOV R4,A ;MOV A,R1 ;SWAP A ;ANL A,#0FH ;MOV R3,A ;MOV A,R0 ;ANL A,#0FH ;MOV R2,A ;RET以上三种方法都是以51单片机的基础的汇编程序,功能是实现单字节十六进制数到BCD 码的转换,三个程序都已在KEIL C里调试运行正确的。
十进制转8421bcd码
十进制转8421BCD码是一种常用的数值编码方法,主要用于将十进制数转换为二进制码。
在这种编码方式中,每个十进制数位都用4位二进制码表示,其中每一位二进制码的取值为0或1。
8421BCD码的名称来源于其权重分配方式,即每一位的权重分别为8、4、2和1。
具体转换步骤如下:
1. 将十进制数的每一位拆分出来,例如十位数、百位数等。
2. 将每一位十进制数转换为4位二进制码,即用二进制表示该位上的数值。
3. 将得到的4位二进制码按照8421的权重分配方式进行排列,即将最高位的二进制码乘以8,次高位乘以4,依次类推。
4. 将各位乘积相加,即可得到对应的8421BCD码。
举个例子,将十进制数57转换为8421BCD码的步骤如下:
1. 拆分出个位数和十位数,得到5和7。
2. 将5转换为二进制码0101,将7转换为二进制码0111。
3. 按照权重分配方式排列,将0101排在前面,0111排在后面。
4. 将0101乘以8得到40,将0111乘以1得到7,相加得到47,即57的8421BCD码为0101 0111。
十进制转8421BCD码的实质就是将十进制数转换为二进制码,并按照一定的规则排列。
这种编码方式的优点是易于理解和实现,且不需要进行二进制与十进制的转换,便于数字的显示和计算。
然而,8421BCD 码的缺点是占用空间较大,相比于其他二进制码,其表示同样大小的数字所需的位数更多。
十六进制数转BCD码的几种方法要将一个十六进制数转换为BCD码,有以下几种方法可以使用。
方法1:使用位操作符将每个十六进制数转换为BCD码首先,将十六进制数的每个位拆分开来,例如将十六进制数0x1A拆分为1和A。
然后,将每个位转换为四位的BCD码。
对于十六进制数A来说,对应的BCD码为1010。
使用位操作符将每个十六进制数转换为BCD码,可以采用以下步骤:1.从右至左依次处理每个位。
2.对于每个位,将其与0x0F进行按位与操作,将十六进制位的值提取出来。
3.检查提取出的值是否大于9、如果大于9,则加上6、这是因为BCD 码的十进制位比十六进制位大64.将处理后的值左移四位,以腾出位置存储下一个位的BCD码。
5.重复以上步骤,直到处理完所有的位。
方法2:使用查表法将十六进制数转换为BCD码可以通过查找预先准备好的表格将十六进制数转换为BCD码。
表格中列出了每个十六进制数对应的BCD码。
可以使用以下步骤进行转换:1.创建一个查找表格,将十六进制数的每个位与对应的BCD码进行配对。
2.从右至左依次处理每个位。
3.从查找表格中查找对应的BCD码,将其加入到结果中。
4.重复以上步骤,直到处理完所有的位。
方法3:使用算术运算将十六进制数转换为BCD码可以使用一系列算术操作将十六进制数转换为BCD码,具体步骤如下:1.将十六进制数转换为十进制数。
2.将十进制数除以10,获取商和余数。
3.商即为对应的BCD码,余数即为下一个位的十进制数。
4.重复以上步骤,直到十进制数为0。
以上是将十六进制数转换为BCD码的几种方法。
每种方法都有其特点和适用场景,可以根据具体的需求选择合适的方法进行转换。
BCD码转HEX,HEX转BCD码代码//+++++++++++++++++++++++++ FUNCTION DESCRIPTION ++++++++++++++++++++++++++++++ // // NAME : Hex2Bcd//// DESCRIPTION : 无符号数的Hex到BCD的转换//// COMPLETION// INPUT : data pdest dest_len pdest_buf destbuf_len// OUTPUT :// STATUS : VOID////-----------------------------------------------------------------------------VOID Hex2Bcd(INT32U data, INT8U *pdest, INT16U dest_len, INT8U *pdest_buf, INT16U destbuf_len){INT8U temp, i;//判断内存区域的合法性//if(!((pdest >= pdest_buf) &&// ((pdest + dest_len) <= (pdest_buf + destbuf_len)))) {// ASSERT_FAILED();// return;//}if (IS_MEM_OUTOF_RANGE(pdest, dest_len, pdest_buf, destbuf_len)) {ASSERT_FAILED();return;}i = 0;//置缓冲区为0MemSet(pdest, 0, dest_len, pdest_buf, destbuf_len);while(data != 0 && i < dest_len) {temp = (INT8U) (data % 10);pdest[i] |= temp;temp = (INT8U) ((data / 10) % 10);pdest[i] |= (temp << 4);data = data / 100;i++;}}//+++++++++++++++++++++++++ FUNCTION DESCRIPTION ++++++++++++++++++++++++++++++ // // NAME : Hex2Bcd_S//// DESCRIPTION : 有符号数的Hex到BCD的转换//// COMPLETION// INPUT : data pdest dest_len pdest_buf destbuf_len// OUTPUT :// STATUS : VOID////-----------------------------------------------------------------------------VOID Hex2Bcd_S(INT32S data, INT8U *pdest, INT16U dest_len,INT8U *pdest_buf, INT16U destbuf_len){INT8U temp, i;INT8U s_flag = FALSE;//判断内存区域的合法性//if (!((pdest >= pdest_buf) &&// ((pdest + dest_len) <= (pdest_buf + destbuf_len)))) {// ASSERT_FAILED();// return;//}if (IS_MEM_OUTOF_RANGE(pdest, dest_len, pdest_buf, destbuf_len)) {ASSERT_FAILED();return;}i = 0;//源数据是负数if (data < 0) {data = 0 - data;s_flag = TRUE;}//置缓冲区为0MemSet(pdest, 0, dest_len, pdest_buf, destbuf_len);while(data != 0 && i < dest_len) {temp = data % 10;pdest[i] |= temp;temp = (data / 10) % 10;pdest[i] |= (temp << 4);data = data / 100;i++;}//负数最高位置1if (TRUE EQ s_flag) {*(pdest + dest_len - 1) |= 0x80;}}//+++++++++++++++++++++++++ FUNCTION DESCRIPTION ++++++++++++++++++++++++++++++ // // NAME : Bcd2Hex//// DESCRIPTION : 无符号的BCD到HEX的转换//// COMPLETION// INPUT : pdata data_len// OUTPUT :// STATUS : INT32U////-----------------------------------------------------------------------------INT32U Bcd2Hex(INT8U *pdata, INT8U data_len){INT8U result;INT32U data, i;//判断data_len的合法性if (data_len > 5) {ASSERT_FAILED();//return 0;}//检查BCD数据的合法性result = CheckBcdData(pdata, data_len);if (result EQ FALSE) {ASSERT_FAILED();//return 0;}i = 0; data = 0;while(i < data_len) {data = data * 100;data += (pdata[data_len - i - 1] & 0x0F) +((pdata[data_len - i - 1] & 0xF0) >> 4) * 10;i++;}return data;}//+++++++++++++++++++++++++ FUNCTION DESCRIPTION ++++++++++++++++++++++++++++++ // // NAME : Bcd2Hex_S//// DESCRIPTION : BCD转换为有符号数,最高位为符号位//// COMPLETION// INPUT : pdata data_len// OUTPUT :// STATUS : INT32S////-----------------------------------------------------------------------------INT32S Bcd2Hex_S(INT8U *pdata, INT8U data_len){INT8U temp;INT32S result;INT8U s_flag = FALSE;temp = pdata[data_len - 1];//是否是负数if ((pdata[data_len - 1] & 0x80) != 0) {s_flag = TRUE;}//将最高位置为0pdata[data_len - 1] = pdata[data_len - 1] & 0x7F; result = (INT32S) Bcd2Hex(pdata, data_len);if(s_flag EQ TRUE) {result = 0 - result;}pdata[data_len - 1] = temp;return result;}。
hex转bcd最快算法【实用版】目录1.引言2.HEX 转 BCD 的背景和意义3.最快算法的原理4.最快算法的具体实现5.算法的优点和局限性6.结论正文1.引言在电子计算机中,数字的表示方式有多种,其中 HEX(十六进制)和BCD(二 - 十进制)是两种常见的表示方式。
HEX 是一种基于 16 的数制,常用于简化二进制的表示,而 BCD 则是一种基于 10 的数制,可以简化计算机中数字的运算。
因此,将 HEX 数转换为 BCD 数在计算机科学中有着重要的意义。
本文将介绍一种 HEX 转 BCD 的最快算法。
2.HEX 转 BCD 的背景和意义HEX 和 BCD 都是数字的表示方式,它们之间的转换在计算机科学中十分常见。
例如,在嵌入式系统中,BCD 数制由于其特殊的运算规则,可以大大简化硬件的设计和软件的编写。
因此,将 HEX 数转换为 BCD 数,可以提高计算机系统的运行效率。
3.最快算法的原理HEX 转 BCD 的最快算法的原理是基于位运算,它利用了计算机中位运算的高速性,将 HEX 数直接转换为 BCD 数。
具体来说,对于一个 HEX数,我们可以通过将其每个位上的数字乘以相应的权值(16 的幂),然后将结果相加,得到对应的 BCD 数。
4.最快算法的具体实现具体来说,最快算法的实现步骤如下:(1)将 HEX 数每一位上的数字提取出来,存放在一个数组中;(2)计算每一位上的数字对应的权值,即 16 的幂;(3)将每一位上的数字乘以对应的权值,然后将结果相加,得到 BCD 数的值;(4)将得到的 BCD 数按照位数进行拆分,得到最终的 BCD 数。
5.算法的优点和局限性最快算法的优点在于其转换速度快,因为它利用了计算机中位运算的高速性。
然而,该算法的局限性在于,它只适用于单个 HEX 数的转换,对于多个 HEX 数的转换,需要进行额外的处理。
6.结论HEX 转 BCD 的最快算法是一种高效、快速的算法,可以大大提高计算机系统的运行效率。
hex转数组-回复Hex转数组是一种常见的数据转换技术,它将十六进制表示的数据转换为数组形式。
在计算机科学和信息技术领域,这种技术被广泛应用于数据存储、数据传输和数据处理等方面。
本文将以"Hex转数组"为主题,一步一步回答相关问题,介绍这种技术的原理、应用和实现方法。
第一步:了解Hex转数组的原理及作用Hex转数组是指将十六进制形式的数据转换为数组形式的过程。
在计算机中,数据以二进制形式存储和传输,而人类更习惯于使用十进制数进行表示。
因此,当需要在计算机中处理和传输数据时,就需要将其转换为计算机可识别的形式,如数组。
Hex转数组的作用就是将十六进制表示的数据转换为计算机可识别的数组形式,以便进行数据处理和传输。
第二步:了解Hex转数组的应用领域Hex转数组在计算机科学和信息技术领域有着广泛的应用。
其中包括但不限于以下方面:1. 数据存储:当需要将数据以十六进制形式存储时,可以使用Hex转数组将其转换为数组形式后存储。
这样可以有效地节省存储空间和提高数据读写效率。
2. 数据传输:在数据传输过程中,特别是在网络通信中,数据通常以十六进制形式进行传输。
在接收方收到数据后,需要将其转换为数组形式以进行后续的数据处理。
3. 数据处理:在进行数据处理时,有时候需要直接对十六进制数据进行操作,如进行位运算、加密解密等。
这时就需要将十六进制数据转换为数组形式进行处理。
第三步:了解Hex转数组的实现方法实现Hex转数组的方法有很多种。
下面介绍两种常见的方法:1. 手动转换:这种方法适用于简单的十六进制数转换为十进制数的情况。
首先,将十六进制数按位拆分为单个数字或字符,然后根据十六进制数值与十进制数值的对应关系,将其转换为十进制数。
最后,将所有的十进制数按顺序存储在数组中即可。
2. 编程实现:使用编程语言编写程序来实现Hex转数组是更常见和便捷的方法。
例如,在Python语言中,可以使用内置函数或库函数来进行Hex 转数组。
DA指令和十六进制数转BCD码的几种方法2008年07月04日星期五11:28DA指令和十六进制数转BCD码的几种方法2008-06-20 14:32例2、设(A)= 56H 为56的压缩的BCD 码数,(R3)= 67H,(CY)=1执行ADDC A,R3DA A结果为:124注意:1)DA指令只能跟在加法指令后面使用;2)调整前参与运算的两数是BCD码数;3)DA指令不能与减法指令配对使用,但可以实现对A中压缩BCD减一操作。
例3、设(A)=30H(压缩BCD码数),执行:ADD A,#99HDA A后,便实现了30 -1 = 29的操作。
例4、两个4位BCD码相加,一个存放在(31H)(30H);另一个存放在(33H)(32H);和数拟回存在(31H)(30H)中,试编程实现之。
解:MOV R0,#30HMOV R1,#32HMOV A,@R0ADD A,@R1DA AMOV @R0,AINC R0INC R1MOV A,@R0ADDC A,@R1DA AMOV @R0,A在进行单片机系统开发时,有很多地方需要用到十六进制数和BCD码的转换。
比如说在需要将数据在显示器上显示时,因为参与系统内部计算的数据多为二进制数,而为了显示的时候直观方便,我们通常会将数据显示为常见的十进制形式。
这时在系统内部就必须进行十六进制到BCD码的转换。
关于十六进制到BCD码的转换,算法很多,我这里介绍三种方法。
三种方法在使用的时候各有优劣,后面会进行简单的比较。
一、方法一:;功能;单字节十六进制数转三位单字节BCD码;入口:单字节十六进制数存R5;出口:单字节BCD码存:百位R2,十位R3,个位R4;影响单元:中间寄存R5的高四位:R0,低四位:R1HEX2BCD:MOV A,R5ANL A,#0FHMOV R1,AMOV A,R5ANL A,#0F0HSWAP AMOV R0,AMOV R2,#00HMOV R3,#00HMOV R4,#00HMOV A,R1LCALL SUBMOV A,R0MOV R5,ASTART_1:CJNE R5,#00H,DEC_1AJMP NRET_1DEC_1:DEC R5MOV A,#10HLCALL SUBAJMP START_1NRET_1:MOV 7FH,R4MOV 7EH,R3MOV 7DH,R2RETSUB: ;子函数开始ADD A,R4 ;开始处理个位进十位CJNE A,#14H,JIN1;若A>=20则跳JIN2,否则跳NRET结束AJMP JIN2 ;JIN1: ;JNC JIN2 ;AJMP JIN3 ;JIN2:INC R3INC R3CLR CSUBB A,#14HAJMP JIN5JIN3:CJNE A,#0AH,JIN_3;若A>=10则跳JIN4,否则跳NEXT结束AJMP JIN4 ;JIN_3: ;JNC JIN4 ;AJMP NEXT ;JIN4:INC R3CLR CSUBB A,#0AHJIN5:MOV R4,A ;个位进十位处理完毕MOV A,R3 ;开始处理十位进百位CJNE A,#0AH,JIN6;若A>=10则跳JIN6,否则跳NEXT结束AJMP JIN7 ;JIN6: ;JNC JIN7 ;AJMP NEXT ;JIN7:INC R2CLR CSUBB A,#0AHMOV R3,A ;十位进百位处理完毕NEXT:RET ;子函数结束二、方法二:;功能;单字节十六进制数转三位单字节BCD码;入口:单字节十六进制数存R5;出口:单字节BCD码存:百位R2,十位R3,个位R4 ;影响单元:中间寄存R5的高四位:R0,低四位:R1HEX2BCD:MOV A,R5ANL A,#0FHMOV R1,AMOV A,R5ANL A,#0F0HSWAP AMOV R0,AMOV R2,#00HMOV R3,#00HMOV R4,#00HMOV A,R1LCALL SUBMOV A,R0MOV R5,ASTART_1:CJNE R5,#00H,DEC_1AJMP NRET_1DEC_1:DEC R5MOV A,#10HLCALL SUBAJMP START_1NRET_1:MOV 7FH,R4MOV 7EH,R3MOV 7DH,R2RETSUB: ;子函数开始ADD A,R4MOV B,#0AHDIV ABMOV R4,BADD A,R3MOV R3,AMOV B,#0AHDIV ABMOV R3,BADD A,R2MOV R2,ARET ;子函数结束三、方法三:;功能;单字节十六进制数转三位单字节BCD码;入口:单字节十六进制数存R5;出口:单字节BCD码存:百位R2,十位R3,个位R4;影响单元:R0,R1,R6HEX2BCD:CLR A ;BCD码初始化MOV R0, AMOV R1, AMOV R6, #08H ;转换单字节八进制整数HEX2BCD_N0:MOV A, R5RLC A ;从高端移出待转换数的一位到CY中MOV R5, AMOV A, R1 ;BCD码带进位自身相加,相当于乘2 ADDC A, R1DA A ;十进制调整MOV R1, AMOV A, R0ADDC A, R0MOV R0, A ;百位不可能超过2,故不需十进制调整DJNZ R6, HEX2BCD_N0 ;处理完8BITMOV A,R1 ;压缩BCD码转单字节BCD码ANL A,#0FH ;MOV R4,A ;MOV A,R1 ;SWAP A ;ANL A,#0FH ;MOV R3,A ;MOV A,R0 ;ANL A,#0FH ;MOV R2,A ;RET以上三种方法都是以51单片机的基础的汇编程序,功能是实现单字节十六进制数到BCD 码的转换,三个程序都已在KEIL C里调试运行正确的。
十六进制转bcd码c语言以十六进制转BCD码C语言为标题的文章BCD码(Binary-Coded Decimal)是一种用二进制编码表示十进制数的方法,在数字处理领域有着广泛的应用。
本文将介绍如何使用C语言将十六进制数转换为BCD码。
一、什么是BCD码BCD码是一种将十进制数转换为二进制编码的方法,它使用四位二进制数来表示一个十进制数的一位。
BCD码的范围是0-9,每个十进制数都可以用四位二进制数表示。
二、十六进制转BCD码的方法在C语言中,可以使用位运算和移位操作来实现十六进制转BCD 码的功能。
具体步骤如下:1. 将十六进制数的每一位转换为二进制数的四位表示。
例如,十六进制数0x3A可以转换为二进制数0011 1010。
2. 将转换后的二进制数按照从低位到高位的顺序,每四位分别存储到一个字节(byte)中。
对于上述例子,可以将0011保存在一个字节的低四位,将1010保存在一个字节的高四位。
3. 将每个字节的值转换为十进制数。
对于上述例子,低四位的二进制数0011转换为十进制数3,高四位的二进制数1010转换为十进制数10。
4. 将每个十进制数转换为BCD码。
对于上述例子,十进制数3的BCD码为0011,十进制数10的BCD码为0001 0000。
5. 将转换后的BCD码拼接起来,即得到最终的BCD码。
对于上述例子,最终的BCD码为0011 0001 0000。
三、C语言实现下面是一个使用C语言实现十六进制转BCD码的示例代码:```c#include <stdio.h>// 将十六进制数转换为BCD码void hexToBcd(unsigned int hex, unsigned char bcd[], int len) {int i;for (i = 0; i < len; i++) {bcd[i] = hex % 10;hex /= 10;}}int main() {unsigned int hex = 0x3A;unsigned char bcd[2];hexToBcd(hex, bcd, sizeof(bcd));printf("BCD码为: ");for (int i = sizeof(bcd) - 1; i >= 0; i--) {printf("%X", bcd[i]);}printf("\n");return 0;}```在上述代码中,`hexToBcd`函数将十六进制数转换为BCD码,并存储在`bcd`数组中。
hex还原二进制-回复关于"hex还原二进制"的主题,本文将分步回答,详细介绍如何将十六进制(hexadecimal)转换为二进制(binary)。
这种转换对于计算机科学领域的编程和数据处理非常重要。
文章将从理解十六进制和二进制的基本概念开始,然后介绍将十六进制转换为二进制的步骤。
最后,将提供一些例子来帮助读者更好地理解这个过程。
第一步:理解十六进制和二进制在计算机科学中,二进制是一种基于二的数制系统,它使用0和1表示数字。
相比之下,十六进制是一种基于十六的数制系统,它使用0-9和字母A-F表示数字。
在十六进制中,A表示10,B表示11,以此类推,直到F 表示15。
与二进制相比,十六进制更为紧凑和易读。
第二步:将十六进制拆分为数字要将十六进制转换为二进制,首先需要将十六进制拆分为各个数字。
例如,对于十六进制数"AF",拆分为"A"和"F"。
然后,将这些数字分别与其对应的二进制表示进行对应。
在这个例子中,"A"对应的二进制是1010,"F"对应的二进制是1111。
第三步:将每个十六进制数字转换为四位的二进制数字在第二步中,我们已经得到了每个十六进制数字的对应二进制表示。
然而,为了将十六进制数完全转换为二进制数,还需要将每个十六进制数字扩展为四位的二进制数字。
这可以通过在前面添加零来实现。
例如,对于"AF",我们已经得到了对应的二进制为"1010"和"1111"。
现在,我们需要将它们分别转换为四位二进制数字,即"0001 0101"和"0000 1111"。
第四步:合并所有的四位二进制数字在将十六进制数的每个数字转换成四位的二进制数字后,我们可以将所有的二进制数字合并在一起,形成完整的二进制表示。
关于HEX转BCD码的一些理解1、网上的用51汇编实现的经典方式1)首先是一个网上的经典的51汇编指令实现16bit转换的例子,具体代码如下:2)此代码的原理和分析过程如下:首先解释此段程序功能:入口参数:R6,R7,存放16位二进制数,R6为高8位。
出口参数:R3,R4,R5,存放转换后的BCD码,R3为高位。
程序思路:把16位二进制数按权展开后再进行BCD码相加。
如下图:注意此处加法是按照BCD码相加(代码中有十进制调整指令DA A)。
具体算法:把16位二进制数的每一位都先移入进位标志C,然后乘以2的n次方,这里n是该位的权值。
(此段程序是用与自身相加的方法实现乘2操作的)。
因为共有16位2进制数,所以需要进行16次循环(程序中用R2保存循环次数)。
这样最高位(即R6的最高位)最先被移出并在第一次循环中做了乘2操作并保存在R3R4R5中以供下次累加,第二次循环时该值被再次乘2并累加,以后每次循环都相当于再次进行乘2并累加,这样最高位一共进行了16次乘2累加,也就是乘以2的16次方。
同理,R6的次高位第二次被移出,所以少循环一次,相当于乘以2的15次方并累加。
举例说明:设R6=00H、R7=10H,则R7中的“1”在第12次循环时被移入C中,在以后的4次循环中实现了乘以2的4次方并进行BCD码累加,具体过程如下:R6R7=0000 0000 0001 0000。
R5=R4=R3=0第1次循环:R6最高位的0被移入C标志位后用ADDC指令与R5进行BCD码相加(如有进位则进到R4和R3中,此处无进位),R5=0第2次循环:0被移出后与R5进行BCD码相加,R5=0第3次循环:0被移出后与R5进行BCD码相加,R5=0... ...第11次循环:0被移出后与R5进行BCD码相加,R5=0第12次循环:1被移出后与R5进行BCD码相加,R5=1第13次循环:0被移出后与R5进行BCD码相加,R5=2第14次循环:0被移出后与R5进行BCD码相加,R5=4第15次循环:0被移出后与R5进行BCD码相加,R5=8第16次循环:R7最低位的0被移出后与R5进行BCD码相加,R5=16所以最终结果就是16(放在R5中)。
3)个人对这个代码的理解:a)这段代码执行效率比较高,但需要DA指令,对于某些单片机不支持DA指令需要自己编写DA指令的实现。
b)51汇编指令很多只能对寄存器A操作。
因此循环的格式是MOV A,R6;RLC A; MOV R6,A;对于能直接对其他寄存器执行循环指令的MCU修改后效率更高。
c)DA指令的实现需要辅助进位标志,若MCU无此标志位,则实现起来比较困难。
2、个人改进后的51汇编实现的方式1)基于很多单片机不带有辅助进位标志且没有DA类指令,下面是个人对这个经典算法的改进具体代码如下:DSEG AT 20H ;KEIL汇编51定义寄存器方法。
地址为20H TMP: DS 1 ;中间缓存寄存器,中间变量HEX_U: DS 1 ;HEX_U/H/L存器,3*8bit=24bit,2^24=16777216HEX_H: DS 1HEX_L: DS 1BCD4: DS 1 ;BCD4/3/2/1出口寄存器,因为入口寄存机;最大为:2^24-1=16777215BCD3: DS 1 ;共需要8位BCD码,因此需要4个寄存器用来存放压;缩BCD码BCD2: DS 1BCD1: DS 1COUNT: DS 1 ;中间变量,用来存放移位次数,本例中移位24次BSEG AT 20H ;KEIL汇编51位定义方式LL BIT 3 ;LL=20H.3=TMP.3LH BIT 7 ;LH=20H.7=TMP.7CSEG AT 0000H ;代码段定义起始位置LJMP R_MIANCSEG AT 0010HR_MIAN:HEX_TO_BCD_Init:MOV A,#24MOV COUNT,A ;循环次数24次MOV A,#0XFFMOV HEX_U,A ;HEX数据入口,此处只作赋值验证,MOV HEX_H,A ;若想写成函数在调用函数时将形参赋值即可MOV HEX_L,AMOV A,#00HMOV BCD4,A ;BCD结果初始化赋值为零MOV BCD3,AMOV BCD2,AMOV BCD1,ASHIFT_LOOP:MOV A,HEX_L ;C<---HEX_U/H/L<--RLC A ;|________________|MOV HEX_L,A ;HEX循环左移MOV A,HEX_HRLC AMOV HEX_H,AMOV A,HEX_URLC AMOV HEX_U,AMOV A,BCD1 ;C<---BCD4/3/2/1<--RLC A ;|________________|MOV BCD1,A ;BCD结果循环左移MOV A,BCD2RLC AMOV BCD2,AMOV A,BCD3RLC AMOV BCD3,AMOV A,BCD4RLC AMOV BCD4,ADEC COUNT ;移位次数减一MOV A,COUNTJNZ DA_BCD_Start ;判断是否全部移位完成SJMP $ ;运行完成停在这儿DA_BCD_Start: ;移位后调整结果为十进制BCD码;*********************************************;调整结果为十进制BCD码原理如下:;假如寄存器A,带C循环左移动相当于:B=A+A+C;我们就是要调整B为BCD码,原理详见微机原理的DAA指令;这里只是简单讲一下调整步骤:; 1、若低4位大于9或辅助标志位=1,则将B=B+0X06; 2、在步骤1基础上,若高4位大于9或进位标志=1,则将B=B+0X60 ; 3、进位C算高位;由于我们的单片机没有这个DA类指令,也没有辅助进位标志位;所以对上述原理进行了改进:B=B+0X06<===>B/2=B/2+0X03;因此我们可以再左移位之前进行:低四位加0XO3,高四位加0X30然后再移位;DAA中条件的判断可以这样做:;1、将B寄存器先加0X03,判断B.3是否为1,为1说明条件满足,否则不满足;2、在1基础B寄存器加0X30,判断B.7是否为1,为1说明条件满足,否则不满足;详细代码如下:;*********************************************DA_BCD1_Low4Bit:MOV A,BCD1 ;BCD1+0X03ADD A,#0X03MOV TMP,AJNB LL,DA_BCD1_High4BitMOV BCD1,A ;条件满足BCD0=BCD1+0X03DA_BCD1_High4Bit:MOV A,BCD1 ;BCD1+0X30ADD A,#0X30MOV TMP,AJNB LH,DA_BCD2_Low4BitMOV BCD1,A ;条件满足BCD1=BCD1+0X30DA_BCD2_Low4Bit: ;BCD2调整MOV A,BCD2ADD A,#0X03 ;此处不带进位加因为不可能产生进位,原因如下:MOV TMP,A ;高3位不可能出现111、101、110,假如上次数据是; 0101XXXX(拿这个举例),该数据会调整为1000XXXX,;;移位后本次数据高3位为000,而不是101;因此不会出现BCD1调整后C=1的情况JNB LL,DA_BCD2_High4BitMOV BCD2,ADA_BCD2_High4Bit:MOV A,BCD2ADD A,#0X30MOV TMP,AJNB LH,DA_BCD3_Low4BitMOV BCD2,ADA_BCD3_Low4Bit: ;BCD3调整MOV A,BCD3ADD A,#0X03MOV TMP,AJNB LL,DA_BCD3_High4BitMOV BCD3,ADA_BCD3_High4Bit:MOV A,BCD3ADD A,#0X30MOV TMP,AJNB LH,DA_BCD4_Low4BitMOV BCD3,ADA_BCD4_Low4Bit: ;BCD4调整MOV A,BCD4ADD A,#0X03MOV TMP,AJNB LL,DA_BCD4_High4BitMOV BCD4,ADA_BCD4_High4Bit:MOV A,BCD4ADD A,#0X30MOV TMP,AJNB LH,DA_BCD_EndMOV BCD4,ADA_BCD_End:LJMP SHIFT_LOOPEND2)该代码原理同1中的经典例子,只不过是对其的做了修改,具体不同的细节部分在代码中有详细的注释说明。
此代码已经在KEIL上验证通过,截图如下:3、关于AD指令的一些说明此指令原理同微机原理中的压缩BCD数加法调整指令DAA相同,附件为DAA指令的一些说明。
BCD数调整指令.doc。