请教二进制转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

;-------------------------------------------------------------------------------
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
qbellwu
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.

一周热门 更多>