请教二进制转BCD码程序的困惑【恢复】

2020-02-10 08:46发布

;-------------------------------------------------------------------------------



;  Function:       // BIN__BCD



;  Description:    // 二进制到十进制转换



;  Calls:          // 



;  Called By:      // DISP_BCD(DS1820.inc) send_digt(modem_init.inc)



;                                send_digt_RS232(modem_init.inc) sel_t_1(fgjk.asm)



;  Input:          // H_BYTE  L_BYTE



;  Output:         // R222  R111   R000



;  Return:         // 



;  Others:         // 



;-------------------------------------------------------------------------------

BIN__BCD

        CLRWDT

        BCF        STATUS,C

        MOVLW        .16

        MOVWF        COUNT

        CLRF        R000                

        CLRF        R111

        CLRF        R222        ;初始化结果寄存器

LOOP16

        RLF        L_BYTE,F

        RLF        H_BYTE,F

        RLF        R222,F

        RLF        R111,F        ;左移至结果寄存器 从低位到高位

        RLF        R000,F        ;R000<--R111<--R222<--H_BYTE<--L_BYTE



        DECFSZ        COUNT,F

        GOTO        ADJDEC

        RETLW        0

        

ADJDEC

        MOVLW        R222

        MOVWF        FSR        ;指针指向R222

        CALL        ADJBCD        ;调用BCD码校正子程序

        

        MOVLW        R111

        MOVWF        FSR        ;指针指向R111

        CALL        ADJBCD        ;调用BCD码校正子程序

        

        MOVLW        R000

        MOVWF        FSR        ;指针指向R000

        CALL        ADJBCD        ;调用BCD码校正子程序

        GOTO        LOOP16

;-------------------------------------------------------------------------------



;  Function:       // ADJBCD



;  Description:    // BCD码校正  ????????????



;  Calls:          // EEPROM_R  EE_Byte_Write  delays_delay_5500us



;  Called By:      // DISP_9



;  Input:          // 



;  Output:         // 



;  Return:         // 



;  Others:         // 



;-------------------------------------------------------------------------------

ADJBCD

        MOVLW        3

        ADDWF        INDF,W

        MOVWF        TEMP

        BTFSC        TEMP,3        ;判断低位>7

        

        MOVWF        INDF        ;是,低位加3

        

        MOVLW        30        ;否

        ADDWF        INDF,W

        MOVWF        TEMP

        BTFSC        TEMP,7        ;判断高位>7

        MOVWF        INDF        ;是,高位加3

        RETLW        0        ;否,返回0

;-------------------------------------------------------------------------------
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
qbellwu
1楼-- · 2020-02-10 12:19
假设有一2进制数Bin,用bit表示Bin的位,2进制数的值用换算成10进制就是,

bit7 *2^7 + bit6 *2^6 + bit5 *2^5 + ... + bit0 * 2^0

整理得

 ((...(((0+ bit7) *2 +bit6) *2 +bit5) ...) + bit0)



原理就是当低4位大于9时进行加6操作。因为采用左移操作,左移相当于乘2,

也就是当低4位乘2 大于9时进行加6操作, 也就是在未左移之前大于4时直接加3了



本贴被 qbellwu 编辑过,最后修改时间:2008-12-29,10:51:58.
eagle_avr
2楼-- · 2020-02-10 12:47
公司的老工程师跳槽了,留下一个风光互补发电系统的远程监控程序代码让我啃。

他的代码非常精简值得学习,而且让我受益匪浅啊!可惜代码什么注释的偶没有,我只得一句句的啃了。

有一个二进制到BCD码的转换程序看得小弟我云里雾里的!

有如下问题迷惑我不解:请高手帮忙!



(1)LOOP16标号里的五个右移语句是不是实现R000<--R111<--R222<--H_BYTE<--L_BYTE功能?



(2)ADJBCD校正子程序是干什么的?



这些问题可能是我不懂二进制转BCD码算法的缘故吧!希望可以听听高手们怎么理解的!!





   

本贴被 eagle_avr 编辑过,最后修改时间:2008-10-08,16:05:01.

一周热门 更多>