打印

4位BCD码转二进制的问题

[复制链接]
5607|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
华仔2007|  楼主 | 2009-5-18 14:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我是一名单片机初学者,请多指教
关于4位BCD码转二进制的问题,我的编程思路如下,大家帮忙看看这样对吗?谢谢

4位BCD码A B C D
转二进制 存入R0 R1

C X 10 + D -> R1
A X 10 + B -> R3
R3 X 100
低字节 + R1 -> R1
高字节 + 进位 -> R0

以上是我的思路,我在网上找了个程序如下,有个地方看不懂,下面箭头的位置,为什么是乘以250,而不是乘以10呢
; 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

相关帖子

沙发
atuz| | 2009-5-18 15:41 | 只看该作者

...

程序已经给你注释过了
; 10*Y + X = (16*Y + X)-6*Y = 250 * Y + (16*Y + X) - 256 * Y    

使用特权

评论回复
板凳
dengm| | 2009-5-18 16:58 | 只看该作者

这是我写的. 比常规计算方法快2周期,短2bytes

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

常规计算方法:
    MOV R5, A
    ANL A, #0FH
    XCH A, R5
    XRL A, R5
    SWAP A
    MOV B, #10
    MUL AB
    ADD A, R5
    RET
  

使用特权

评论回复
地板
华仔2007|  楼主 | 2009-5-19 09:38 | 只看该作者

谢谢2位,我学习一下

使用特权

评论回复
5
highgear| | 2009-5-19 10:58 | 只看该作者

10Y + x

= (4y + y) *2 + x = (((y<<2) + y) << 1) + x

这种做法,全部是移位和加法,效率更高。

使用特权

评论回复
6
dengm| | 2009-5-19 18:32 | 只看该作者

re:highgear 效率高不高, 是在具体的cpu上用"周期"衡量的!

;你的计算方法在51要11周期, 我的只要10周期, 你的13字节, 我的9字节
      MOV R5, A
      ANL A, #0F0H
      SWAP A
      MOV R4, A
      RL A
      RL A
      ADD A, R4
      RL A

      XCH A, R5
      ANL A, #0FH
      ADD A, R5

    

使用特权

评论回复
7
highgear| | 2009-5-19 20:35 | 只看该作者

顶dengm!

我给出的是一种通用算法,的确没有考虑cpu的特殊性。

使用特权

评论回复
8
华仔2007|  楼主 | 2009-5-21 11:09 | 只看该作者

按照自己的想法编的,大家给把把关

4位BCD码,由高到低分别存在D24 D23 D22 D21四个单元

BCD_BIN:  MOV A,D22             ;4位BCD码转二进制数,低位存在D2L单元,高位存在D2H单元
          MOV B,#0AH
          MUL AB
          ADD A,D21
          MOV D2L,A
          MOV A,D24
          MOV B,#0AH
          MUL AB
          ADD A,D23
          MOV B,#100
          MUL AB
          MOV D2H,B
          ADD A,D2L
          JNC OVER2
          INC D2H
OVER2:    MOV D2L,A
          RET

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

83

帖子

0

粉丝