打印

大于65536的5位BCD码怎样转换成HEX?

[复制链接]
4684|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wwdyl|  楼主 | 2007-8-2 09:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
烦劳各位大侠,帮忙看一下有无现成的程序或链接,比较急,偶找变了网上的程序大都是小于65536的4位BCD码转换成2字节HEX的程序。
多谢了!

相关帖子

沙发
coldra| | 2007-8-2 09:25 | 只看该作者

C语言里好写,多少位都没问题

定义一个long型变量,计算a*10000+b*1000+c*100+d*10+e,可得。
也可用(((a*10+b)*10+c)*10+d)*10+e,容易写成循环形式

使用特权

评论回复
板凳
wwdyl|  楼主 | 2007-8-2 09:33 | 只看该作者

难的是偶的这个程序用的是汇编,不好写啦。

谢谢楼上大侠哈。
请继续出招。

使用特权

评论回复
地板
maychang| | 2007-8-2 09:38 | 只看该作者

你把它当8位BCD处理就是了

方法是一样的,多循环几次而已。

使用特权

评论回复
5
twz8858877| | 2007-8-2 10:05 | 只看该作者

有一个,网上下的。

BCD最大范围到999999
CONV1:      MOV B,#24              ;定点整数二翻十
            CLR  A
            MOV  R5,A              ;(R1 R2 R3)→R5 R6 R7
            MOV  R6,A
            MOV  R7,A
CV1:        CLR C
            CALL LR0
            MOV  A,R7
            ADDC A,R7
            DA   A
            MOV  R7,A
            MOV  A,R6
            ADDC A,R6
            DA   A
            MOV  R6,A
            MOV  A,R5
            ADDC A,R5
            DA   A
            MOV  R5,A
            DJNZ B,CV1
            RET
LR0:        XCH A,R3               ;尾数带进位位左移1位子程序
            RLC A
            XCH A,R3
            XCH A,R2
            RLC A
            XCH A,R2
            XCH A,R1
            RLC A
            XCH A,R1
            RET

使用特权

评论回复
6
coldra| | 2007-8-2 10:07 | 只看该作者

你不是会四位的嘛

可以把万位列一个表格(一万是2710h,九万是15f90h),计算低四位值,最后加上万位数得到三字节结果

使用特权

评论回复
7
ayb_ice| | 2007-8-2 10:31 | 只看该作者

google...

使用特权

评论回复
8
twz8858877| | 2007-8-2 10:41 | 只看该作者

还有BCD转HEX的

CONV2:      MOV B,#24              ;定点整数十翻二
CONV21:     CLR A
            MOV R5,A               ;R5 R6 R7←(R1 R2 R3)
            MOV R6,A
            MOV R7,A
CV2:        CLR C
            CALL RR0
            CALL SRA
            XCH A,R1
            LCALL BB
            XCH A,R1
            XCH A,R2
            LCALL BB
            XCH A,R2
            XCH A,R3
            LCALL BB
            XCH A,R3
            DJNZ B,CV2
            RET
RR0:        XCH A,R1               ;尾数带进位位右移1位子程序
            RRC A
            XCH A,R1
            XCH A,R2
            RRC A
            XCH A,R2
            XCH A,R3
            RRC A
            XCH A,R3
            RET
SRA:        XCH A,R5               ;尾数带进位位右移1位
SRA1:       RRC A                  ;R5 R6 R7带进位位右移1位,结果在R5 R6 R7中
            XCH A,R5
            XCH A,R6
            RRC A
            XCH A,R6
            XCH A,R7
            RRC A
            XCH A,R7
            RET
BB:         JNB ACC.7,BB1
            ADD  A,#0D0H           ;右移后,BCD码最高位为1(代表8)变为5
BB1:        JNB ACC.3,BB2
            ADD A,#0FDH
BB2:        RET

使用特权

评论回复
9
wwdyl|  楼主 | 2007-8-2 12:36 | 只看该作者

先谢谢各位大侠

RE:twz8858877 您给的BCD转HEX的CONV2子程序经测试后结果不对。

使用特权

评论回复
10
fuzichun| | 2007-8-2 15:45 | 只看该作者

用6楼的方法

使用特权

评论回复
11
twz8858877| | 2007-8-2 20:56 | 只看该作者

我测试过了,绝对是对的

我现在也在用
R1、R2、R3中存放压缩式BCD码,R5、R6、R7存放转换后的结果。

使用特权

评论回复
12
wwdyl|  楼主 | 2007-8-3 09:49 | 只看该作者

TO twz8858877

R1=9 R2=99 R3=99 在调上面的子程序CONV2结果为1786B 而实际结果是1869F
楼上大侠怎么测的,能否告知?
COLDRA 6楼提的方法不错,不过偶不想用查表的方法。

使用特权

评论回复
13
wwdyl|  楼主 | 2007-8-3 10:18 | 只看该作者

dengm大侠能否给出【非典】3字节BIN TO BCD的子程序?

久仰dengm的在汇编领域中的的大名,能否帮忙?

使用特权

评论回复
14
twz8858877| | 2007-8-4 07:55 | 只看该作者

大哥,服你了

装载r1、r2、r3时请用:
MOV R1,#09H
MOV R2,#99H
MOV R3,#99H
这个才是压缩式BCD码
不要用
MOV R1,#09
MOV R2,#99
MOV R3,#99

使用特权

评论回复
15
懒人| | 2007-8-4 21:45 | 只看该作者

看看这个怎么样?应该能满足你要求



;==========压缩BCD码数据,转换为16进制数据子程序========
;函数名称:BCD2_HEX
;功能:    压缩BCD码数据,转换为16进制数据
;入口参数:(R0) 压缩BCD码数据(L--H),R7 = 压缩BCD码字节数
;出口参数:(R1) = 16进制数据(L--H)
;影响资源:C,A,B,R2,R3,R4,R5,R6,R7
;其他:       压缩BCD码
;===================================================
    BCD_HEX:
            push    PSW
            push    Acc
            push    B
            mov    A,R1
            mov    R6,A
            mov    A,R7
            mov    R3,A
            clr    A
    BCD_HEX0:
            mov    @R1,A
            inc    R1
            djnz    R3,BCD_HEX0
            mov    A,R7
            mov    R3,A        ;清零
    BCD_HEX1:
            lcall    BCD_HEX2
            mov    A,@R0
            anl    A,#0F0H
            swap    A
            lcall    BCD_HEX4
            lcall    BCD_HEX2
            mov    A,@R0
            anl    A,#0FH
            lcall    BCD_HEX4
            dec    R0
            djnz    R3,BCD_HEX1
            pop    B
            pop    Acc
            pop    PSW
            dec    R1
            ret

    BCD_HEX2:
            mov    A,R7        ;*10
            mov    R4,A
            mov    A,R6
            mov    R1,A
            clr    C
            mov    R2,#00H
    BCD_HEX3:
            mov    A,@R1
            mov    B,#0AH
            push    PSW
            mul    AB
            pop    PSW
            addc    A,R2
            mov    @R1,A
            mov    R2,B
            inc    R1
            djnz    R4,BCD_HEX3
            ret            ;*C10 End
    BCD_HEX4:
            mov    R5,A        ;+
            mov    A,R6
            mov    R1,A
            mov    A,R7
            mov    R4,A
            mov    A,R5
            addc    A,@R1
            mov    @R1,A
            inc    R1
            dec    R4
            mov    A,R4
            jnz    BCD_HEX5
            ljmp    BCD_HEXEND
    BCD_HEX5:
            mov    A,@R1
            addc    A,#00H
            mov    @R1,A
            inc    R1
            djnz    R4,BCD_HEX5
    BCD_HEXEND:
            ret

使用特权

评论回复
16
hotpower| | 2007-8-5 15:17 | 只看该作者

5位BCD转换为16位BIN码宏定义(PIC)

;-------5位BCD转换为16位BIN码宏定义-----------------------
;入口
;       TEMPH   暂存器高8位
;       TEMPL   暂存器低8位
;       BCDX    BCD码原码高高4位
;       BCDH    BCD码原码高8位
;       BCDL    BCD码原码低8位
;出口
;       BINH    BCD码高4位
;       BINL    BCD码低8位
Macro_BcdToBinWord MACRO BCDL,BCDH,BCDX,BINL,BINH,TEMPL,TEMPH
        LOCAL   BCD2BINFWEXIT,BCD2BINFWSUB1,BCD2BINFWSUB2
        CLRF    BINH
        MOVFW   BCDX
        ANDLW   0X0F
        MOVWF   BINL
        CALL    BCD2BINFWSUB2
        SWAPF   BCDH,W
        CALL    BCD2BINFWSUB1
        MOVFW   BCDH
        CALL    BCD2BINFWSUB1
        SWAPF   BCDL,W
        CALL    BCD2BINFWSUB1
        MOVFW   BCDL
        ANDLW   0X0F
        ADDWF   BINL,F
        BTFSC   STATUS,C
        INCF    BINH,F
        GOTO    BCD2BINFWEXIT
BCD2BINFWSUB1
        ANDLW   0X0F
        ADDWF   BINL,F
        BTFSC   STATUS,C
        INCF    BINH,F
BCD2BINFWSUB2
        BCF     STATUS,C
        RLF     BINL,W
        MOVWF   TEMPL
        RLF     BINH,W
        MOVWF   TEMPH
        BCF     STATUS,C
        RLF     BINL,F
        RLF     BINH,F
        BCF     STATUS,C
        RLF     BINL,F
        RLF     BINH,F
        BCF     STATUS,C
        RLF     BINL,F
        RLF     BINH,F
        MOVFW   TEMPL
        ADDWF   BINL,F
        BTFSC   STATUS,C
        INCF    BINH,F
        MOVFW   TEMPH
        ADDWF   BINH,F
        RETLW   0
BCD2BINFWEXIT
        ENDM

使用特权

评论回复
17
hotpower| | 2007-8-5 15:19 | 只看该作者

16位BIN转换为5位BCD码宏定义(PIC)

;-------16位BIN转换为5位BCD码宏定义-----------------------
;入口
;       BINH    BCD码原码高4位
;       BINL    BCD码原码低8位
;出口
;       BCDX    BCD码高高4位
;       BCDH    BCD码高8位
;       BCDL    BCD码低8位
;------------------------------------------------------
Macro_WordBinToBcd MACRO BINL,BINH,BCDL,BCDH,BCDX,TEMP,COUNT
        LOCAL   BIN2BCDFWLOOP,BIN2BCDFWNEXT,BIN2BCDFWEXIT
        MOVLW   16
        MOVWF   COUNT
        CLRF    BCDX
        CLRF    BCDH
        CLRF    BCDL
        BCF     STATUS,C
BIN2BCDFWLOOP
        RLF     BINL,F
        RLF     BINH,F
        RLF     BCDL,F
        RLF     BCDH,F
        RLF     BCDX,F
        DECFSZ  COUNT,F
        GOTO    BIN2BCDFWNEXT;BCD调整
        GOTO    BIN2BCDFWEXIT;结束
BIN2BCDFWNEXT
;---------------------------------
        MOVLW   0X03
        ADDWF   BCDL,W
        MOVWF   TEMP
        BTFSC   TEMP,BIT3
        MOVWF   BCDL
        MOVLW   0X30
        ADDWF   BCDL,W
        MOVWF   TEMP
        BTFSC   TEMP,BIT7
        MOVWF   BCDL
;---------------------------------
        MOVLW   0X03
        ADDWF   BCDH,W
        MOVWF   TEMP
        BTFSC   TEMP,BIT3
        MOVWF   BCDH
        MOVLW   0X30
        ADDWF   BCDH,W
        MOVWF   TEMP
        BTFSC   TEMP,BIT7
        MOVWF   BCDH
;---------------------------------
        MOVLW   0X03
        ADDWF   BCDX,W
        MOVWF   TEMP
        BTFSC   TEMP,BIT3
        MOVWF   BCDX
;------------------------
        MOVLW   0X30
        ADDWF   BCDX,W
        MOVWF   TEMP
        BTFSC   TEMP,BIT7
        MOVWF   BCDX
        GOTO    BIN2BCDFWLOOP
BIN2BCDFWEXIT
        ENDM

使用特权

评论回复
18
conwh| | 2007-8-5 15:36 | 只看该作者

hot把PIC的都拿出来了

使用特权

评论回复
19
hotpower| | 2007-8-5 15:38 | 只看该作者

哈哈~~~因为51基本不用汇编~~~

使用特权

评论回复
20
WWDYL| | 2007-8-6 15:34 | 只看该作者

谢谢各位大侠

不好意思,今日得以上网,答复各位大侠:
RE:twz8858877你说的对,您提供的两个子程序经测试都完全正确,偶已经使用了,非常感谢您至始至终的帮助。
RE:懒人您提供的子程序偶看的不是很清楚(本人比较菜),不过还是要谢谢你。
RE:HOTPOWER您提供的是PIC的,偶用的是51的,因为是要大量使用RAM,PIC扩展RAM不如51扩展的方便,就是这样子,不过还是要谢谢您的参与。

使用特权

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

本版积分规则

1

主题

12

帖子

0

粉丝