二进制转BCD码
【C语言】8421BCD码与二进制的转换
【C语⾔】8421BCD码与⼆进制的转换#define BCD2TODEC(bcd) (bcd) = ((bcd) & 0x0f)+ ((bcd)>>4)*10
#define BIN2BCD(bcd) (bcd) = ((val/10)<<4) + ((val)%10)
两个宏定义即可实现
二进制,十进制,十六进制,ASCII,BCD码的转换,单片机
1.在片内RAM 30H单元有-个8位二进制数,将其转换成压缩BCD码,存于片内RAM 41H(高位)40H(低位)中。方法:2^8=256,所以8位二进制
A<=256,A/100商是百位数,存放到41h单元,余数再除以10,再得商是10位数,高低位互换,) ORG 0100H
START:
MOV A,30H ;取来8位二进制数
MOV B,#100
DIV AB ;除以100
MOV 41H,A ;商是百位数,存放到41h单元
MOV A,B ;取回余数
MOV B,#10
DIV AB ;再除以10
SWAP A ;商是10位数,高低位互换
ORL A,B
MOV 40H,A ;将十位数与个位位数存入40h
SJMP $
END
2.一个字节(8位)BCD码转换为二进制数(方法:先将高半字节乘以10,再加上低半字节)设待转换的BCD码存放于R2中
DTOB:MOV A,R2
ANL A,#0F0H
SWAP A
MOV B,#0AH
MUL AB
MOV R3,A
MOV A,R2
ANL A,#0FH
ADD A,R3
RET
3.二进制数转换为ASCII码
设(30H)=4BH,将高4位的ASCII码放在31H单元,低4位的ASCII码放在32H单元,程序具有通用性,向入口参数30H存入任何数,都能将其变成相应的ISCII 码.
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:MOV SP,#60H
MOV 30H,#4BH
MOV R2,30H
MOV A,R2
ANL A,#0FH
CJNE A,#0AH,NEQ
16位二进制转换为BCD码的C51汇编程序
16位二进制转BCD码的程序算法及51汇编实现:n=b15~b0n=[b15~b8]*256+[b7~b0]=[b15~b12]*4096+[b11~b0],高四位[b15~b12]取值范围为0~15,代表了4096的个数n=[b15~b12]*4000+{[b15~b12]*(100-4)+[b11~b0]}用x 代表[b15~b12],有:n=x*4000+{x*(100-4)+[b11~b0]即:n=4*x(千位)+x(百位)+[b11~b0]-4*x上式中后面的位:[b11~b0]-4*x,如果小于356,就直接转换成BCD码,如果数值较大,就要把11~7位看成128的个数y,在百位中加上y,在十位加上3*y,并在[b6~b0]中减去2*y就有:n=n=4*x(千位)+(x+y)(百位)+3*y(十位)+[b6~b0]-2*y由此,就可以明确由高9位[b15~b7]变换出来十进制的各个位的数值,可能大于9,到最后整理一下即可。剩下的低7位变成BCD 码已经很简单了。这是别人的思路,容易理解,但用汇编也不太好写,期待有人能写出来,下面是我同学的一个算法:高八位减一,让第八位加上256,(存放压缩BCD码的三个字节百位加2,十位加5,各位加6)ORG 0000HAJMP MAINORG 0003H AJMP int0ORG 0100HMAIN: MOV SP,#60HMOV R4,#30MOV TMOD,#01H MOV TH0,#00HMOV TL0,#00H MOV IE,#81HSETB TR0 SETB IT0LOOP: LCALL BCD LCALL UBCD LOOP1: LCALL XIANSHI LCALL DELAYDJNZ R4,LOOP1AJMP LOOP BCD: MOV A,#00H MOV 38H,41HMOV 37H,40HMOV 34H,AMOV 35H,AMOV 36H,AMOV A,37HMOV B,#100DIV ABMOV 35H,AMOV A,BMOV B,#10DIV ABSWAP AADD A,BMOV 36H,AMOV R3,38HCJNE R3,#0,JIAAJMP RETURNJIA: CLR CMOV A,36HADDC A,#56HDA AMOV 36H,AMOV A,35HADDC A,#02HDA AMOV 35H,AMOV A,34HADDC A,#0MOV 34H,ADJNZ R3,JIARETURN:RETUBCD: MOV A,34HCJNE A,#00H,WUWEI MOV R1,#35H MOV R0,#36H MOV A,#00HXCHD A,@R0 MOV 30H,AMOV A,@R0 SWAP AMOV 31H,A MOV A,#00HXCHD A,@R1 MOV 32H,AMOV A,@R1 SWAP AADD A,#10 MOV 33H,ARETWUWEI: MOV R1,#34H MOV R0,#35HMOV A,#00HXCHD A,@R0MOV 31H,AMOV A,@R0SWAP AADD A,#10 MOV 32H,AMOV A,#00HXCHD A,@R1MOV 33H,AMOV A,@R1SWAP AANL 36H,#0F0HMOV A,36HSWAP AMOV 30H,A
BCD编码——精选推荐
BCD编码
概述:
编码就是信息从⼀种格式转换为另⼀种格式。计算机硬件处理只能识别⼆进制数,因此许多种类的信息都需要编码称为⼆进制数才能处理。数值编码:
BCD(Binary Coded Decimal)码
⽤4位⼆进制码表⽰1位⼗进制数,⼜称8421码。
⽤⼆进制表⽰的⼗进制数
具有保留⼗进制的权,但数字⽤⼆进制表⽰的特点。
备注:
因为⼗进制中仅有10个数字符号,⽽4位⼆进制有16种组合,因此1010到1111不是BCD码,⽽是16进制数。
BCD码与⼗进制数之间存在直接对应关系,例如:
利⽤8421法则可以直接得到结果,每4位对应1个⼗进制数,将得到的每个⼗进制数拼接起来,即为BCD码表⽰的⼗进制数。
BCD码与⼆进制数的互换
⽆论是⼆进制数转换为BCD码,还是BCD码转⼆进制数,都需要先转为⼗进制数,再转换为其他类型数。
⼗进制数转换为⼆进制数详见
BCD码在计算机中的存储⽅式
以压缩BCD码形式存放:
⽤4位⼆进制码表⽰1位BCD码。
⼀个字节存放2位BCD码。例:10010010B表⽰⼗进制数92。
以扩展BCD码形式存放:
⽤8位⼆进制码表⽰1位BCD码,即⾼4位为0,低4位为有效位。
每个字节存放1位BCD。例:00001001 00000010位⾮压缩的BCD码。
ASCII码的奇偶校验
奇校验:
加上校验位后编码中"1"的个数为奇数。
例:A的ASCII码是41H(1000001B),以奇校验传送"A"的ASCII码为C1H(11000001B)。
偶校验:
加上校验位后编码中"1"的个数为偶数。
例:以偶校验传送A的ASCII码为41H(1000001B)。
74ls48的功能级原理
74ls48的功能级原理
74LS48是一种数字集成电路,具有四位二进制BCD编码器功能。BCD编码器将4位的二进制数转换为BCD码,BCD码用4位二进制数表示十进制数字0-9。
74LS48的功能原理如下:
1. 数据输入:74LS48有四个输入引脚(A, B, C 和D),输入为4位二进制数。
2. BCD编码:根据输入的4位二进制数,74LS48会将其转换为对应的BCD码。BCD码共有四位,每位用一个输出引脚(a, b, c 和d)表示。
3. 数据输出:74LS48的BCD码输出通过四个共阳极七段数码管(使用a, b, c 和d引脚)显示。每个引脚对应一个数码管的一段,通过控制某一段的高低电平,来实现显示0-9的数字。
4. 输入使能控制:74LS48还拥有一个输入使能引脚(G),通过使能引脚控制,可以选择是否使能BCD编码器的工作。当使能为低电平时,BCD编码器将停止工作,数码管显示为空。
5. 码无效检测:在74LS48中,如果输入的二进制数超出了0-9的范围,并且使能为高电平,则显示“E”。这个功能可以用来检测输入的二进制数是否有效。
总结:74LS48是一种用于将4位二进制数转换为BCD码的编码器,通过控制四个七段数码管的高低电平,实现在数码管上显示对应的十进制数字。
码制转换十二进制数ASCII码之间的互相转换BCD
STR1
0A
02
32
36
0D …
STR2
0A
02
33 33
0D …
NUM
1A
00
21
00
SUM
3B
00
OVER
‘O’
…
…
10个
10个 ? ?
若键入 ‘1234’
STR1
0A
04
31
‘1’
32
‘2’
33
‘3’
34
‘4’
0D …
…
12
本例题重点掌握: *如何从键盘输入一个字符串 *ASCII→未组合BCD→二进制 *有符号数的运算,对负数和溢出如何处理
;指向 ;将串2 ASCII码→二进制 ;(AX)=[NUM]=001AH ;两数相加,(AX)=003BH ;存和 ;无溢出,转NEXT
;显示’Overflow!’
;返回DOS
9
CHANGE
号吗? NEXT1: LP1:
PROC MOV MOV MOV CMP
JNZ DEC INC ADD MOV DEC JZ MOV AND ADD ADC
思考题: 若键入第一个数26,第二个数为-4,填写
各变量结果。
13
③二进制数→BCD
➢ 方法1 计算二进制数中所包含的1000的个数、 100的个数、10的个数和1的个数。
bcd码转换成二进制
BCD码转换成二进制
什么是BCD码?
BCD(Binary-Coded Decimal)码是一种用二进制编码的十进制数表示方法。在
BCD码中,每个十进制数的每位都用4位二进制数表示,称为“BCD位”。
比如,十进制数23的BCD码为00100011,其中“0010”表示2,“0011”表示3。BCD码可以用于数字显示、计算机存储和传输等领域。
BCD码的转换方法
将BCD码转换成二进制的方法非常简单。对于每一个BCD位,只需要将其转换成对应的4位二进制数即可。
以十进制数23的BCD码为例,我们需要将其转换成二进制数。
1.首先,将BCD码的第一个BCD位“0010”转换成4位二进制数“0010”;
2.接下来,将BCD码的第二个BCD位“0011”转换成4位二进制数“0011”;
3.最后,将这两个4位二进制数连接起来,得到十进制数23的二进制表示:
“0010 0011”。
BCD码转换成二进制的算法
为了更好地理解BCD码转换成二进制的算法,我们可以先将十进制数转换成BCD码,然后再将BCD码转换成二进制。
下面是BCD码转换成二进制的算法:
1.将BCD码的第一个BCD位转换成4位二进制数;
2.将BCD码的第二个BCD位转换成4位二进制数;
3.重复上述步骤,直到所有的BCD位都被转换成4位二进制数;
4.将所有的4位二进制数连接起来,得到最终的二进制表示。
BCD码转换成二进制的示例
让我们通过一个具体的例子来演示BCD码转换成二进制的过程。
假设我们要将十进制数27转换成BCD码,然后再将BCD码转换成二进制。
bcd转换为二进制
bcd转换为二进制
BCD码(Binary-Coded Decimal,二进制编码十进制)是一种用二进制数码来表示十进制数的方法,即将0-9十个数字分别进行二进制编码,可以被计算机直接处理。由于它的特殊性质,使得BCD码不同于其他的编码方式,同时也使得BCD码可以被应用于很多领域,例如金融、准确度要求高的计算等。然而,很多时候我们需要将BCD码转换成二进制数,在本篇文章中将详细讲述BCD码转换成二进制码的方法。
一、什么是BCD码?
BCD码是一种二进制编码,可以用于表示数字0-9。使用BCD码表示一个数时,将这个数的每一位数字转换成BCD码(即用4位二进制数来表示),拼接而成。例如,数字29的BCD码是0010 1001。
二、BCD码转二进制码的基本方法
将BCD码转换为二进制码,只需要将每一位的BCD码拆分后转换成二进制码,再将这些二进制码按位拼接在一起即可。具体操作步骤如下:
1. 选中一个BCD码。
2. 查看BCD码最高位(MSB,即最左边那一位),如果是1,则表示这个十进制数字大于或等于5;如果是0,则表示这个十进制数字小于5。因此,可以根据最高位的值,做出递归处理。
3. 如果MSB是1,那么将这个BCD码减去5,然后按照步骤1和步骤2递归处理。
4. 如果MSB是0,那么将这个BCD码乘以2,然后按照步骤1和步骤2递归处理。
5. 递归处理这个BCD码的每个数字,把它们的二进制码连接成一个二进制数。
6. 完成后得到的就是BCD码转换后的二进制码。
三、实例讲解
以BCD码1001(即数字9的BCD码)为例,通过上述步骤,将其转换为二进制码的过程如下:
2进制-10进制40;BCD码41;数码转换器设计
目录
摘要 (1)
1原理分析 (2)
2设计思路 (3)
3设计程序 (4)
3.1二-十进制转换 (4)
3.2对十进制数分位 (6)
3.3分别输出十进制数 (7)
3.4输出到数码管 (9)
3.5显示位数 (11)
4整体设计电路图与仿真结果分析 (12)
4.1整体设计电路图 (12)
4.2仿真结果 (12)
4.3仿真结果分析 (13)
5小结与体会 (13)
参考文献 (15)
摘要
BCD码亦称二进码十进数或二-十进制代码.用4位二进制数来表示1位十进制数中地0~9这10个数码.是一种二进制地数字编码形式,用二进制编码地十进制代码.BCD码这种编码形式利用了四个位元来储存一个十进制地数码,使二进制和十进制之间地转换得以快捷地进行.本文就是在quartus软件环境下利用VHDL语言将输入地八位二进制转换为BCD十进制数并且在数码管中显示出来.
关键词:二--十进制转换器,BCD码,quartus,VHDL.
2进制-10进制(BCD码)数码转换器设
计
1原理分析
BCD 码这种编码形式利用了四个位元来储存一个十进制地数码,使二进制和十进制之间地转换得以快捷地进行.这种编码技巧,最常用于会计系统地设计里,因为会计制度经常需要对很长地数字串作准确地计算.相对于一般地浮点式记数法,采用BCD码,既可保存数值地精确度,又可免却使电脑作浮点运算时所耗费地时间.此外,对于其他需要高精确度地计算,BCD编码亦很常用.
此处要介绍地是八位二进制转BCD码地硬件实现,采用左移加3地算法,具体描述如下:
(1)、左移要转换地二进制码1位
BCD码(二-十进制)
BCD码(⼆-⼗进制)
⽤4位来表⽰1位中的0~9这10个数码,简称
即BCD代码。Binary-Coded Decimal??,简称BCD,称或⼆-⼗进制代码,亦称⼆进码⼗进数。是⼀种⼆进制的数字编码形式,⽤的⼗进制代码。这种编码形式利⽤了四个位元来储存⼀个⼗进制的数码,使⼆进制和⼗进制之间的转换得以快捷的进⾏。这种编码技巧,最常⽤于的设计⾥,因为经常需要对很长的数字串作准确的计算。相对于⼀般的浮点式记数法,采⽤,既可保存数值的,⼜可免却使电脑作时所耗费的时间。此外,对于其他需要⾼的计算,BCD编码亦很常⽤。
由于共有0、1、2、……、9⼗个数码,因此,⾄少需要4位⼆进制码来表⽰1位。4位⼆进制码共有2^4=16种码组,在这16种代码中,可以任选10种来表⽰10个⼗进制数码,共有N=16!/(16-10)!约等于2.9乘以10的1种⽅案。常⽤的BCD代码列于末。
最常⽤的BCD编码,就是使⽤"0"⾄"9"这⼗个数值的⼆进码来表⽰。这种,在中国⼤陆称之为“”。除此以外,对应不同需求,各⼈亦开发了不同的编码⽅法,以适应不同的需求。这些编码,⼤致可以分成有权码和⽆权码两种:
有权BCD码,如:8421(最常⽤)、2421、5421…
⽆权BCD码,如:余3码、…
以下为三种常见的BCD编码的⽐较。
⼗进数 8421-BCD码余3-BCD码 2421-A码
(M10) D C B A C3 C2 C1 C0 a3 a2 a1 a0
0 0 0 0 0 0 0 1 1 0 0 0 0
1 0 0 0 1 0 1 0 0 0 0 0 1
八位二进制码转化为BCD码及余三码、BCD码转化余三码
河南科技大学
课程设计说明书
课程名称 EDA技术
题目八位二进制转化为BCD码及
余三码、BCD码转化为余三码
学院车辆与动力工程学院
班级
学生姓名
指导教师
日期2012年7月14号
八位二进制码转化为BCD码及余三码、BCD码转化余三码
摘要
八位二进制数转化为BCD码和余三码的转换在计算机语言中起到了非常重要的作用,通过这次的课程设计让我们更好地掌握二进制数转化为BCD 码和余三码。二进制转化为余三码不能直接转化,只能通过BCD码为中介进而转化成余三码。余三码(余3码)是由8421BCD码加上0011形成的一种无权码,由于它的每个字符编码比相应的8421BCD码多3,故称为余三码。BCD码的一种。余三码是一种对9的自补代码,因而可给运算带来方便。其次,在将两个余三码表示的十进制数相加时,能正确产生进位信号,但对“和”必须修正。修正的方法是:如果有进位,则结果加3;如果无进位,则结果减3。如,(526)10进制=(0101 0010 0110)8421BCD码=(1000 0101 1001)余3码
EDA技术打破了软件和硬件间的壁垒,使计算机的软件技术与硬件实现、设计效率与产品性能合二为一,它代表了电子设计技术和应用技术的发展方向。VHDL主要用于描述数字系统的接口,结构和功能,它的语法简单易懂,移植性好。
本设计采用VHDL,Altera公司的Quartus II软件仿真,来实现八位二进制到BCD和BCD到余三码的转换。由于八位二进制的最大范围是0~255,而八位BCD码的范围是0~99,故在转换时输入信号只能取99以内的数。
单片机实验二进制BCD码转换
实验二二进制BCD码转换
一、实验目的
1.掌握简单的数值转换算法
2.基本了解数值的各种表达方法
二、实验说明
单片机中的数值有各种表达方式,这是单片机的基础。掌握各种数制之间的转换是一种基本功。我们将给定的一字节二进制数,转换成二十进制(BCD)码。将累加器A的值拆为三个BCD码,并存入RESULT开始的三个单元,例程A赋值#123。
三、实验内容及步骤
1.安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,插上仿真器电源插头(USB线)。
2.启动PC机,打开KEIL软件,软件设置为模拟调试状态。在所建的Project文件中添加TH2.ASM源程序进行编译,编译无误后,全速运行程序,打开数据窗口(DATA) (在MEMORY#1中输入D:30H 回车),点击暂停按钮,观察地址30H、31H、32H的数据变化,30H更新为01,31H更新为02,32H更新为03。用键盘输入改变地址30H、31H、32H的值,点击复位按钮后,可再次运行程序,观察其实验效果。修改源程序中给累加器A的赋值,重复实验,观察实验效果。
3.打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解。
四、流程图及源程序(见光盘中的程序文件夹)
1.源程序
RESULT EQU 30H
ORG 0000H
LJMP START
BINTOBCD:
MOV B,#100
DIV AB
MOV RESULT,A ;除以100得百位数
MOV A,B
二进制转化bcd
二进制码转BCD码
在单片机里面,如:显示个温度值,这时,要取一个数的个位、十位、百位,可以用/和 %(求商和求余)来解决。
但是,在FPGA里面用求商和求余将会非常消耗资源,这样就必须用到二进制转BCD码了,这里介绍一种简单的加3移位算法。
注:B代表二进制,D代表十进制,0x代表十六进制,BCD为BCD 码,下同。
1、加3移位法
以二进制数(0000_101 Xn)B=(10+Xn)D为例,
串行输入三位后,(0101)B=5(D)
左移一位后:(0000_101Xn)B=(10+Xn)D
如果(0000_101Xn)B直接输出显示为:
当Xn=0时,0000_1010=0x0A。此为错误的BCD码。
采用加3移位法,修正移位结果:
串行输入三位后,结果大于4
(0101)B=5(D)
加3:(0101)B+(0011)B=(1000)B --十进制表示:5+3=8 再左移一位后:
(1000Xn)B=(0001_000Xn)BCD
对应十进制显示:1 Xn
每四位BCD码对应一位十进制数,即:(10+Xn)D,转换成功
注:Xn为下一位串行输入的二进制数。
2、设计思路
这里一共需要四个模块:计数器、移位器、加法器、寄存器输出。分别设计好之后,用状态机控制它们,就完成了。
3、仿真结果
注:图中clk为时钟,en为高电平使能,rst为高电平复位,
data_in为输入的12位二进制码,以十进制的形式显示在时序图;qout为输出的16位BCD码,以十六进制的形式显示在时序图,17个时钟上升沿可完成转换任务。
4、综合结果
汇编程序设计—二进制码转换为BCD码
汇编程序设计—二进制码转换为BCD码
一、算法原理
BCD(Binary Coded Decimal)码是把十进制数据以二进制的方式进
行编码,每四位二进制数字表示一个十进制的数字,比如数字“7”用二
进制表示为“0111”,把“0111”放在一起就是十进制数“7”的BCD码。
1)对任意两个BCD码,可以按位相加,得到结果,其运算规则如下:(1)如果两个BCD码都是规范的BCD码,其相加结果也是BCD码;
(2)如果两个BCD码的相加结果不是正确的BCD码,则可以在最高
位1的位置添加1,使之成为BCD码,另一个BCD位置上也添加1,然后
最低位置上的1被移位,最终结果也是BCD码。
2)工程实现
该BCD码转换程序主要由二进制转换为BCD码的过程组成,根据算法
原理,实现程序如下:
1.首先把输入的二进制码按4位1组进行分组,得到分组后的二进制数,如果分组后的高位不足4位,则用0补足,得到规范的二进制码;
2.对二进制码进行转换,将2进制码转换成BCD码,得到相应的BCD 码;
3.对于每组BCD码,检查它是否是正确的BCD码,如果不是则需要添
加1;
4.最后将BCD码拼接起来,就是最终的BCD码结果。
二、汇编代码
MOV AL, offset BinaryCode ; 把二进制码移到AL中MOVCL,4;CL设置为4
bcd码的转换
bcd码也叫8421码就是将十进制的数以8421的形式展开成二进制,大家知道十进制是0~9十个数组成,着十个数每个数都有自己的8421码:
0=0000
1=0001
2=0010
3=0011
4=0100
5=0101
6=0110
7=0111
8=1000
9=1001
举个例子:
321的8421码就是
3 2 1
0011 0010 0001
二进制编码的十进制数,简称BCD码(Binarycoded Decimal). 这种方法是用4位二进制码的组合代表十进制数的0,1,2,3,4,5,6 ,7,8,9 十个数符。4位二进制数码有16种组合,原则上可任选其中的10种作为代码,分别代表十进制中的0,1,2,3,4,5,6,7,8,9 这十个数符。最常用的BCD码称为8421BCD 码,8.4.2.1 分别是4位二进数的位取值。右图为十进制数和8421BCD编码的对应关系表:
1、BCD码与十进制数的转换
BCD码与十进制数的转换.关系直观,相互转换也很简单,将十进制数75.4转换为BCD码如:
75.4=(0111 (0101.0100)BCD 若将BCD码1000 0101.0101转换为十进制数如: (1000 0101.0101)BCD=85.5
注意:同一个8位二进制代码表示的数,当认为它表示的是二进制数和认为它表示的是二进制编码的十进制数时,数值是不相同的。
例如:00011000,当把它视为二进制数时,其值为24;但作为2位BCD码时,其值为18。
又例如00011100,如将其视为二进制数,其值为28,但不能当成BCD码,因为在8421BCD码中,它是个非法编码.
bcd码的转换
bcd码的转换
bcd码也叫8421码就是将⼗进制的数以8421的形式展开成⼆进制,⼤家知道⼗进制是0~9⼗个数组成,着⼗个数每个数都有⾃⼰的8421码:
0=0000
1=0001
2=0010
3=0011
4=0100
5=0101
6=0110
7=0111
8=1000
9=1001
举个例⼦:
321的8421码就是
3 2 1
0011 0010 0001
⼆进制编码的⼗进制数,简称BCD码(Binarycoded Decimal). 这种⽅法是⽤4位⼆进制码的组合代表⼗进制数的
0,1,2,3,4,5,6 ,7,8,9 ⼗个数符。4位⼆进制数码有16种组合,原则上可任选其中的10种作为代码,分别代表⼗进制中的0,1,2,3,4,5,6,7,8,9 这⼗个数符。最常⽤的BCD码称为8421BCD 码,8.4.2.1 分别是4位⼆进数的位取值。右图为⼗进制数和8421BCD编码的对应关系表:
1、BCD码与⼗进制数的转换
BCD码与⼗进制数的转换.关系直观,相互转换也很简单,将⼗进制数75.4转换为BCD码如:
75.4=(0111 (0101.0100)BCD 若将BCD码1000 0101.0101转换为⼗进制数如: (1000 0101.0101)BCD=85.5
注意:同⼀个8位⼆进制代码表⽰的数,当认为它表⽰的是⼆进制数和认为它表⽰的是⼆进制编码的⼗进制数时,数值是不相同的。
例如:00011000,当把它视为⼆进制数时,其值为24;但作为2位BCD码时,其值为18。
⼜例如00011100,如将其视为⼆进制数,其值为28,但不能当成BCD码,因为在8421BCD码中,它是个⾮法编码.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二进制转换成十进制 BCD码(加3移位法
底下还附带了BCD码转二进制码转化的VHDL程序
算法
"二进制数调整BCD码的方法是将二进制码左移8次,每次移位后都检查低四位LSD+3是否大于7,如是则加3,否则不加,高4位MSD作同样处理"
一、为什么左移8次
原寄存器是存二进制数的,新寄存器是存十进制数的,当然要左移8次,把数据全部移进去。
但这里要注意两件事,第一,如果只安排一个字节作十进制寄存器,原数据要小于 64H (即100)。第二,由于新寄存器是十进制的,要随时调整。
二、检查半字节+3 是否大于 7,是,则 +3
在 51 系列里有十进制调节指令(半字节大于 9,则加 6,应该不难理解),PIC 里没有,只好采取变通的方法。
检查半字节+3 是否大于 7,也就是检查半字节是否大于 4。因为,如果大于 4(比如5、6),下一步左移就要溢出了,所以加 3,等于左移后的加 6,起到十进制调节的作用。
那为什么要绕个圈子去检测半字节+3 是否大于 7 呢?这样程序编起来会简练一些。
一个例子
假如有一个八位二进制数255,我把他转255的十进制数
0 1111 1111 原数
1 0000 0001 ;左移一次
2 0000 0011 ; 左移二次
3 0000 0111 ;左移三次,检查低四位+3>7?
3.1 0000 1010 ;大于7,加3进行调整
4 0001 0101 ;左移四次, 检查低四位+3>7?
4.1 0001 1000 ;大于7,加3进行调整
5 0011 0001 ;左移五次
6 0110 0011 ;左移六次,检查高四位+3>7?
6.1 1001 0011 ;大于7,加3进行调整
7 1 0010 0111 ;左移七次,检查低四位+3>7?
7.1 1 0010 1010 ;大于7,加3进行调整
8 10 0101 0101 ;左移八次(得到BCD码255
Library ieee; --16位二进制转BCD码(0到9999)
Use ieee.std_logic_unsigned.all;
Use ieee.std_logic_1164.all;
Entity B_BCD is
Port ( clk,ena:in std_logic;
a: in std_logic_vector(15 downto 0);
q: out std_logic_vector(15 downto 0));
end B_BCD;
architecture behav of B_BCD is
begin
process(clk,a)
variable i: std_logic_vector(4 downto 0);
variable in_a,out_a :std_logic_vector(15 downto 0);
begin
if ena='0'then
in_a:=a; i:="00000"; out_a:="0000000000000000";
elsif clk'event and clk='1' then
if i="10000" then out_a:=out_a;
else out_a:=out_a(14 downto 0)&in_a(15);
in_a:=in_a(14 downto 0)&'0';
i:=i+1;
if i<"10000" then
if out_a( 3 downto 0)>4 then out_a( 3 downto 0):=out_a( 3 downto 0)+3;
end if;
if out_a( 7 downto 4)>4 then out_a( 7 downto 4):=out_a( 7 downto 4)+3;
end if;
if out_a(11 downto 8)>4 then out_a(11 downto 8):=out_a(11 downto 8)+3;
end if;
if out_a(15 downto 12)>4 then out_a(15 downto 12):=out_a(15 downto 12)+3;
end if;
end if;
end if;
end if ;
q<=out_a;
end process;
end behav;
以下为(0到99)BCD码转二进制码
Library ieee; --(0到99)BCD码转二进制码
Use ieee.std_logic_unsigned.all;
Use ieee.std_logic_1164.all;
Entity BCD_B is
Port ( a: in std_logic_vector(7 downto 0);
q: out std_logic_vector(7 downto 0));
end BCD_B;
architecture behav of BCD_B is
signal a1,a2,a3,a4,cq: std_logic_vector(7 downto 0);
begin
process(a)
begin
a1<="0000"&a(3 downto 0);
a2<="0000"&a(7 downto 4);
a3<=a2(6 downto 0)&'0';
a4<=a2(4 downto 0)&"000";
cq<=a4+a3+a1;
q<=cq;
end process;
end behav;