电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

bcd码改换成十进制 bcd码怎样改换为十进制

2017-09-17 09:57分类:电子技术 阅读:

 

bcd码改换成十进制 bcd码怎样改换为十进制
  BCD码的运算规矩:BCD码是十进制数,而运算器对数据做加减运算时,都是按二进制运算规矩进行处理的。这么,当将 BCD码传送给运算器进行运算时,其作用需求批改。批改的规矩是:当两个BCD码相加,假定和等于或小于 1001(即十进制数9),不需求批改;假定相加之和在 1010 到1111(即十六进制数0AH~0FH)之间,则需加 6 进行批改;假定相加时,本位发作了进位,也需加 6 进行批改。这么做的要素是,机器按二进制相加,所以 4 位二进制数相加时,是按“逢十六进一”的准则进行运算的,而实质上是 2 个十进制数相加,应当按“逢十进一”的准则相加,16 与10相差 6,所以当和逾越 9或有进位时,都要加 6 进行批改。下面举例阐明。
  【例 1.3】 需求批改 BCD码运算值的举例。
  (1) 核算 5+8;(2) 核算 8+8
  解:(1) 将 5 和 8 以 8421 BCD输入机器,则运算如下:
  0 1 0 1
  +) 1 0 0 0
  1 1 0 1 作用大于 9
  +) 0 1 1 0 加 6 批改
  1 0 0 1 1 即13 的 BCD码
  作用是 0011,即十进制数3,还发作了进位。5+8=13,定论准确。
  (2)将8以8421 BCD输入机器,则运算如下:
  1 0 0 0
  +)1 0 0 0
  1 0 0 0 0 作用大于9
  +)0 1 1 0 加6批改
  1 0 1 1 0 16的BCD码
  作用是0110,即十进制的6,并且发作进位。8+8=16,定论准确。
  微机原理代码: (AL=BCD 5,BL=BCD 8) 设AH=0,则
  ADD AL,BL
  AAA
  作用为 AX=0103H,标明非紧缩十进制数,CF=1,AF=1,AH=1,AL=3
  运用AAA指令,能够不必屏蔽高半字节,只需在相加后当即施行AAA指令,便能在AX中得到一个准确的非紧缩十进制数

在读写DS1302时需求把读写数据BCD码改换成十进制
//*****************************************************************
//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

上一篇:数字电路符号包含哪些内容?数字电路符号大全

下一篇:空心线圈电感核算公式

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部