;-------------------------------------------------------------------------------
; 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
;-------------------------------------------------------------------------------
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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.
他的代码非常精简值得学习,而且让我受益匪浅啊!可惜代码什么注释的偶没有,我只得一句句的啃了。
有一个二进制到BCD码的转换程序看得小弟我云里雾里的!
有如下问题迷惑我不解:请高手帮忙!
(1)LOOP16标号里的五个右移语句是不是实现R000<--R111<--R222<--H_BYTE<--L_BYTE功能?
(2)ADJBCD校正子程序是干什么的?
这些问题可能是我不懂二进制转BCD码算法的缘故吧!希望可以听听高手们怎么理解的!!
本贴被 eagle_avr 编辑过,最后修改时间:2008-10-08,16:05:01.
一周热门 更多>