16进制数转换成8421BCD编码函数.doc

上传人:白大夫 文档编号:3235002 上传时间:2019-08-03 格式:DOC 页数:8 大小:33.50KB
返回 下载 相关 举报
16进制数转换成8421BCD编码函数.doc_第1页
第1页 / 共8页
亲,该文档总共8页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《16进制数转换成8421BCD编码函数.doc》由会员分享,可在线阅读,更多相关《16进制数转换成8421BCD编码函数.doc(8页珍藏版)》请在三一文库上搜索。

1、16进制数转换成8421BCD编码函数十六进制十六进制(英文名称:Hexadecimal),是计算机中数据的一种表示方法。同我们日常生活中的表示法不一样。它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;A-F对应10-15;N进制的数可以用0(N-1)的数表示,超过9的用字母A-F。1、BCD码与十进制数的转换BCD码与十进制数的转换关系很直观,相互转换也很简单,将十进制数75.4转换为BCD码:7-0111,5-0101,4-0100所以拼成8421BCD码的结果是:(0111 0101.0100)BCD;若将BCD码1000 0101.0101转换为十进

2、制数:1000-8,0101-5,0101-5所以结果是:(85.5)D。注意:同一个8位二进制代码表示的数,当认为它表示的是二进制数和认为它表示的是二进制编码的十进制数时,数值是不相同的。例如:00011000,当把它视为二进制数时,其值为24;但作为2位BCD码时, 其值为18。又例如00011100,如将其视为二进制数,其值为28,但不能当成BCD码,因为在8421BCD码中,它是个非法编码 。2、BCD码的格式计算机中的BCD码,经常使用的有两种格式,即分离BCD码,组合BCD码。所谓分离BCD码,即用一个字节的低四位编码表示十进制数的一位,例如数82的存放格式为:_ _ _1 0 0

3、 0 _ _ _ _0 0 1 0 其中_表示无关值。组合BCD码,是将两位十进制数,存放在一个字节中,例82的存放格式是1000 00103、BCD码的加减运算由于编码是将每个十进制数用一组4位二进制数来表示,因此,若将这种BCD码直接交计算机去运算,由于计算机总是把数当作二进制数来运算,所以结果可能会出错。例:用BCD码求38+49。解决的办法是对二进制加法运算的结果采用“加6修正,这种修正称为BCD调整。即将二进制加法运算的结果修正为BCD码加法运算的结果,两个两位BCD数相加时,对二进制加法运算结果采用修正规则进行修正。修正规则:(1)如果任何两个对应位BCD数相加的结果向高一位无进位

4、,若得到的结果小于或等于9,则该位不需修正;若得到的结果大于9且小于16时,该位进行加6修正。(2)如果任何两个对应位BCD数相加的结果向高一位有进位时(即结果大于或等于16,注意不是修正时的进位),该位进行加6修正。(3)低位修正结果使高位大于9时,高位进行加6修正。下面通过例题验证上述规则的正确性。a)用BCD码求35+2135- 0011 0101+21- 0010 0001=0101 0110-56注意:0101+0001并没有满足上述3条规则,同时0011+0010也没有满足上述3条规则,所以结果不作处理。b)BCD码求25+3725-0010 0101+37-0011 0111=0

5、101 1100+(低位0101+0111=1100-129所以需要调整)06- 0110=0110 0010-62注意:在给低位加0110调整时也有向高位进位发生,但是这是在调整时的进位,故不做处理。c)用BCD码求38+4938-0011 1000+49-01001001=1000 0001+(低位1000+1001相加时有进位发生,所以需要给低位加0110-调整)06- 0110=10000111-87注意调整后的结果也不满足上述(3)的条件所以不再调整d)用BCD码求42+9542-0100 0010+95-1001 0101=11010111-13 7+(1101是一个非法8421B

6、CD码,事时上0100+1001相加满足(1)条件)06-0110(注意是给1001+0100加0110调整)00010011 0111-1 3 7注意结果不满足(3)条件所以不再调整。c)用BCD码求91+8391-1001 0001+83-1000 0011=00010001 0100 +(1001+1000有进位发生所以需要给1001+1000相加结果0001+0110调整)06-0110 =00010111 0100-174注意结果不满足(3)条件所以不再调整。d)用BCD码求94+794-1001 0100+07-0000 0111=10011011+(由于结果的两位编码数满足上述条

7、件1所以需要给0100+0111+0110调整)06-0110=1010 0001+(由于结果的高位1010-109所以满足上述(3)条件给高位加0110调整)06-0110 =0001 0000 0001-101注意:对于调整我们只需要关心结果是不是满足上述(3)条件,不满足不予调整。e)用BCD码求76+4576-0111 0110+45-0100 0101=1011 1011+(注意这里0101+1011和0111+0100都满足上述(1)条件所以需要都调整)06-01100110=000100100001-121注意结果满足上述(3)条件所以不再调整。(例子补充于2015-1-11)两

8、个组合BCD码进行减法运算时,当低位向高位有借位时,由于”借一作十六“与”借一作十“的差别,将比正确的结果多6,所以有借位时,可采用”减6修正法“来修正。两个BCD码进行加减时,先按二进制加减指令进行运算,再对结果用BCD调整指令进行调整,就可得到正确的十进制运算结果。 实际上,计算机中既有组合BCD数的调整指令,也有分离BCD数的调整指令。另外,BCD码的加减运算,也可以在运算前由程序先变换成二进制数,然后由计算机对二进制数运算处理,运算以后再将二进制数结果由程序转换为BCD码。16进制数转换成8421BCD编码函数.INCLUDE hardware.inc.IRAM_Led_Out:.dw

9、 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000_List_8421_Data: /16进位数转换成8421码的位权表,万位每千位进位,千位每百位进位,百位每十位进位.dw 0xFFFF,0xEA60,0xC350,0x9C40,0x7530,0x4E20,0x2710/60000-10000.dw 0x2328,0x1F40,0x1B58,0x1770,0x1388,0x0FA0,0x0BB8,0x07D0,0x03E8/9000-1000.dw 0x0384,0x0320,0x02BC,0x0258,0x01F4,0x0190

10、,0x012C,0x00C8,0x0064/900-100.dw 0x005A,0x0050,0x0046,0x003C,0x0032,0x0028,0x001E,0x0014,0x000A/90-10/.RAM/.DATA.code/=/函数: hex_to_8421()/语法:hex_to_8421(被转换数,符号标记)/描述:16进位数转换成8421码,存放在C段中定义好的数组当中/须定义一个下标8位的整数数组,C段中如下书写/extern int led_out 8=0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0;/参数:被转换数小于0xFFFF的数,符号标记0或非零的

11、数/返回:无/=.PUBLIC _hex_to_8421;_hex_to_8421: .PROCpush bp to sp;bp=sp+1; /基址重定位,准备取参数r1=bp+3; /备转换成8421码的16进位数字r3=bp+4; /符号位标志,为0,则做无符号整数处理,非1做有符号数处理R4=_Led_Out; /输出数据的地址*可修改输出名称bp=_List_8421_Data; /基址定位到位权表头*对应.IRAM段,可修改输入名称/-test R3,0xFFFF; /检查R3是否非0,如果非零,做有符号数处理,如果为0,做无符号数处理je _hex_loop0; /为0,做无符号数

12、处理,跳到_hex_loop0R3=0xF000; /非0,做有符号数处理R4=门狗BP+=0X0001; /基址加1,定位到位权表第一个有效数字R2-=0X0001; /位权减1,准备输出位权表第一个有效数字所对应的位数字cmp r1,bp; /比较被转换数和当前位权的大小jb _hex_loop2; /如果被转换数小于当前位权,则跳到“_hex_loop1”,继续比较jmp _hex_loop3; /如果被转换数大于当前位权,则跳到“_hex_loop3”,进行转换_hex_loop2: /R2进位循环处理的标记CMP R2,0X0002;JB _hex_loop4; /包括上1步,如果R

13、2小于2,跳到_hex_loop4,将R2置为10JMP _hex_loop1; /如果R2大于等于2,跳到“_hex_loop1”,继续比较_hex_loop4:R2=0x000A; /包括下1步,将R2置为10,跳到“_hex_loop1”,继续比较JMP _hex_loop1;/-_hex_loop3: /判断并输出数据的标记cmp r1,0x2710;jnb _hex_2710; /包括上1步,如果R1大于等于0x2710(10000),跳到_hex_2710处理cmp r1,0x03e8;jnb _hex_03e8; /包括上1步,如果R1大于等于0x03E8(1000),跳到_he

14、x_03E8处理cmp r1,0x0064;jnb _hex_0064; /包括上1步,如果R1大于等于0x0064(100),跳到_hex_0064处理cmp r1,0x000a;jnb _hex_000a; /包括上1步,如果R1大于等于0x000A(10),跳到_hex_000A处理/-R3=R4+5; /包括下2步,输出10进制第1位,跳到“_hex_000”,结束转换R3=R1;jmp _hex_over;_hex_2710:R3=R4+1; /包括下3步,输出10进制第5位,被转换数减位权,做被转换数,跳到“_hex_loop1”,继续比较R3=R2;r1-=bp;jmp _hex

15、_loop1;_hex_03e8:R3=R4+2; /包括下3步,输出10进制第4位,被转换数减位权,做被转换数,跳到“_hex_loop1”,继续比较R3=R2;r1-=bp;jmp _hex_loop1;_hex_0064:R3=R4+3; /包括下3步,输出10进制第3位,被转换数减位权,做被转换数,跳到“_hex_loop1”,继续比较R3=R2;r1-=bp;jmp _hex_loop1;_hex_000a:R3=R4+4; /包括下3步,输出10进制第2位,被转换数减位权,做被转换数,跳到“_hex_loop1”,继续比较R3=R2;r1-=bp;jmp _hex_loop1;_hex_over:pop bp from sp;RETF.ENDP;.PUBLIC _Clear_WatchDog;_Clear_WatchDog: .PROCPUSH R1 TO SP;R1 = 0x0001;ASM_Port_Watchdog_Clear = R1;POP R1 FROM SP;RETF.ENDP;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1