1、二进制 转换成十进制 BCD 码(加 3 移位法) (2010-07-05 15:53) 分类: 算法 “原来的二进制数十几位,则左移时就要左移几位”“二进制数调整 BCD 码的方法是将二进制码左移 8 次,每次移位后都检查低四位 LSD+3 是否大于 7,如是则加 3,否则不加,高 4 位 MSD 作同样处理“一、为什么左移 8 次原寄存器是存二进制数的,新寄存器是存十进制数的,当然要左移 8 次,把数据全部移进去。但这里要注意两件事,第一,如果只安排一个字节作十进制寄存器,原数据要小于 64H(即 100)。第二,由于新寄存器是十进制的,要随时调整。二、检查 半字节+3 是否大于 7,是,
2、则 +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 ;左移三次,检查低四位+37?3.
3、1 0000 1010 ;大于 7,加 3 进行调整4 0001 0101 ;左移四次, 检查低四位+37?4.1 0001 1000 ;大于 7,加 3 进行调整5 0011 0001 ;左移五次6 0110 0011 ;左移六次,检查高四位+37?6.1 1001 0011 ;大于 7,加 3 进行调整7 1 0010 0111 ;左移七次,检查低四位+37?7.1 1 0010 1010 ;大于 7,加 3 进行调整8 10 0101 0101 ;左移八次(得到 BCD 码 255)附上 Verilog 代码:/17 位二进制数转 BCD 码(基本思想是逢十进 1)module BIN_
4、BCD_4 (CLK, A, BW, BQ, BB, BS, BG);input CLK;input 16:0A; /二进制输入数据output 3:0BW, BQ, BB, BS, BG;/BCD 数据输出寄存器reg 3:0BW, BQ, BB, BS, BG;integer I;reg 19:0TEMP;reg 16:0C;always (posedge CLK)beginC=A;TEMP=0;for (I=1; I4b0100)beginTEMP3:0=TEMP3:0+3;/ 4 则加 3end if (TEMP7:44b0100)beginTEMP7:4=TEMP7:4+3;end if (TEMP11:84b0100)beginTEMP11:8=TEMP11:8+3;end if (TEMP15:124b0100)beginTEMP15:12=TEMP15:12+3;end if (TEMP19:164b0100)beginTEMP19:16=TEMP19:16+3;end BW, BQ, BB, BS, BG=TEMP18:0, A0;endendendmodule