[PIC®/AVR®/dsPIC®产品]

关于PIC16F的乘除法

[复制链接]
2413|3
手机看帖
扫描二维码
随时随地手机跟帖
jesdin|  楼主 | 2017-4-15 22:33 | 显示全部楼层 |阅读模式
本帖最后由 jesdin 于 2017-4-16 09:31 编辑

看到很多人说PIC16F系列没有乘除法指令,我对汇编不太懂,平时用C写的,单片机会用到乘除法,请问这个和各位说的没有乘除法指令有什么关系吗?用PIC16F做乘或除有什么不好吗
UPS2015| | 2017-4-18 09:56 | 显示全部楼层
void mul(void)                //a0为乘数,a1为被乘数,a2为输出结果的低位,a3为输出结果的高位
{               
                #asm
                clrf  STATUS    //选择bank0
                clrf _a3
                clrf _a2
                movf  _a0,w
                bcf STATUS,CARRY
               
// mult   0
                btfsc _a1,0       
                addwf _a3
                rrf _a3
                rrf _a2       
               
// mult   1
                btfsc _a1,1       
                addwf _a3
                rrf _a3
                rrf _a2       
               
// mult   2
                btfsc _a1,2       
                addwf _a3
                rrf _a3
                rrf _a2       
               
// mult   3
                btfsc _a1,3       
                addwf _a3
                rrf _a3
                rrf _a2       
               
// mult   4
                btfsc _a1,4       
                addwf _a3
                rrf _a3
                rrf _a2       
               
// mult   5
                btfsc _a1,5       
                addwf _a3
                rrf _a3
                rrf _a2       
               
// mult   6
                btfsc _a1,6       
                addwf _a3
                rrf _a3
                rrf _a2       
               
// mult   7
                btfsc _a1,7       
                addwf _a3
                rrf _a3
                rrf _a2       

        #endasm

}

这个函数大概要消耗20us,能用!

使用特权

评论回复
wanhaijd| | 2017-4-19 08:48 | 显示全部楼层
PIC16F系列单片机没有乘除法指令,乘除法运算需用程序完成。师兄UPS2015介绍了8位乘除法运算的汇编语言解决方案,一下是本人常用的16位乘除法汇编语言程序,供大家参考,指正。

…………
TEMP        EQU                2AH                        ;临时工作
BAHI        EQU                33H
BALO        EQU                34H
BBHI        EQU                35H
BBLO        EQU                36H
BCHI        EQU                37H
BCLO        EQU                38H
BDHI        EQU                39H
BDLO        EQU                3AH
BEHI        EQU                3BH
BELO        EQU                3CH
…………
;=====双精度乘法
;16位被乘数 BBHI,BBLO
;16位乘数  BAHI,BALO
;32位乘积 BBHI,BBLO,BCHI,BCLO       
MPYS        CALL        SETUP
MLOOP        CLRWDT
                RRF                BDHI,F
                RRF                BDLO,F
                BTFSC        STATUS,C
                CALL        D_ADD
                RRF                BBHI,F
                RRF                BBLO,F
                RRF                BCHI,F
                RRF                BCLO,F
                DECFSZ        TEMP,F
                GOTO        MLOOP
                RETURN
SETUP        MOVLW        010H
                MOVWF        TEMP
                MOVF        BBHI,W
                MOVWF        BDHI
                MOVF        BBLO,W
                MOVWF        BDLO
                CLRF        BBHI
                CLRF        BBLO
                RETURN
D_ADD        MOVF        BALO,W
                ADDWF        BBLO,F
                BTFSC        STATUS,C
                INCF        BBHI,F
                MOVF        BAHI,W
                ADDWF        BBHI,F
                RETURN
;--------------------------------------
;=====双精度除法
;32位被除乘数 BBHI,BBLO,BCHI,BCLO
;16位乘除数  BAHI,BALO
;16位商 BBHI,BBLO,余数 BCHI,BCLO       
DIVS        CALL        SETUPD
DLOOP        CLRWDT
                BCF                STATUS,C
                RLF                BELO,F
                RLF                BEHI,F
                RLF                BDLO,F
                RLF                BDHI,F
                RLF                BCLO,F
                RLF                BCHI,F
                MOVF        BAHI,W
                SUBWF        BCHI,W
                BTFSS        STATUS,Z
                GOTO        NOCHK
                MOVF        BALO,W
                SUBWF        BCLO,W
NOCHK        BTFSS        STATUS,C
                GOTO        NOGO
                MOVF        BALO,W
                SUBWF        BCLO,F
                BTFSS        STATUS,C
                DECF        BCHI,F
                MOVF        BAHI,W
                SUBWF        BCHI,F
                BSF                STATUS,C
NOGO        RLF                BBLO,F
                RLF                BBHI,F
                DECFSZ        TEMP,F
                GOTO        DLOOP
                RETURN
SETUPD        MOVLW        020H
                MOVWF        TEMP
                MOVF        BBHI,W
                MOVWF        BDHI
                MOVF        BBLO,W
                MOVWF        BDLO
                MOVF        BCHI,W
                MOVWF        BEHI
                MOVF        BCLO,W
                MOVWF        BELO
                CLRF        BBHI
                CLRF        BBLO
                CLRF        BCHI
                CLRF        BCLO
                RETURN
;=====双精度减加法
;16位被减数 BBHI,BBLO
;16位减数  BAHI,BALO
;16位差 BBHI,BBLO
DSUB        CALL        NEGA       
;=====双精度加法
;16位被加数 BBHI,BBLO
;16位加数  BAHI,BALO
;16位和 BBHI,BBLO
DADD        MOVF        BALO,W
                ADDWF        BBLO,F
                BTFSC        STATUS,C
                INCF        BBHI,F
                MOVF        BAHI,W
                ADDWF        BBHI,F
                RETURN
NEGA        COMF        BALO,F
                INCF        BALO,F
                BTFSC        STATUS,Z
                DECF        BAHI,F
                COMF        BAHI,F
                RETURN
;----------------------                       

使用特权

评论回复
大笨象会跳舞| | 2017-4-20 15:26 | 显示全部楼层
没有乘除法是指不支持硬件乘除法,软件还是可以实现滴,就是执行周期会比硬件自带的要长

使用特权

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

本版积分规则

31

主题

39

帖子

0

粉丝