搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2008-10-8 15:55:22 | 显示全部楼层 |阅读模式
;-------------------------------------------------------------------------------



;  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

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

出0入0汤圆

发表于 2008-12-29 10:48:58 | 显示全部楼层
假设有一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.

出0入0汤圆

 楼主| 发表于 2008-10-8 16:00:06 | 显示全部楼层
公司的老工程师跳槽了,留下一个风光互补发电系统的远程监控程序代码让我啃。

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

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

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



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



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



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





   

本贴被 eagle_avr 编辑过,最后修改时间:2008-10-08,16:05:01.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 20:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表