PIC除法子程序(汇编)



花了一个多星期的时间,终于掌握了PIC单片机的基本用法,并且完成了一款运动器械(爬绳机)的程序。

一开始写这程序时犯了不少的错,主要是习惯了AVR单片机,一转到PIC单片机时,好多指令与AVR的搞混淆了,弄到最后调试时把我给搞晕头了,真是气啊~~~

如果你是第一次用PIC,而且以前是用AVR的,那么你得好好注意这两者的区别了,非常容易犯错的是C标志的位置,在PIC中,K-W (k可以是立即数,也可以是寄存器),当W≤K时,C被置位了,当W>K时,C被清零;而在AVR单片机中,K-W(K和W分别是两个寄存器,AVR中没有W寄存器),当K<W时,C被置位,当K≥W时,C被清零。另外PIC没有比较指令,所以要想比较两个数的大小,你就得用减法来作比较,而在AVR中,我们只用指令cp或cpc就可以比较了。

在写这款程序把AVR的除法子程序相应的转过来了,自我感觉还比较良好。现在是程序源码,需要的朋友可以直接调用。
另外把PIC的特殊指令和伪指令也传上来,希望能给大家写程序带来方便

点击此处打开“PIC特殊指令助记符.pdf”(文件大小:24K)
点击此处打开“PIC伪指令”.pdf(文件大小:107K)

子程序:

程序代码 程序代码

;******* XL = XHXL/100 ****************
;16位数除以100
;入口参数:低8位==>XL,高8位==>XH
;结果:商==>XL, 余数==>XH
;示例:
;MOVLW LOW(3000)
;MOVWF XL
;MOVLW HIGH(3000)
;MOVWF XH
;CALL DIV100
DIV100        MOVLW 100
        SUBWF XH,W
        BC DV100F        ;XH>=100
        MOVLW 8
        MOVWF ZL
DV1000        CLRC
        RLF XL,F
        RLF XH,F
        MOVLW 100
        SUBWF XH,W
        BNC DV1001
        MOVLW 100
        SUBWF XH,F
        BSF XL,0
DV1001        DECFSZ ZL,F
        GOTO DV1000
        RETURN
;******* XL = XL/10 ****************
;8位数除以10
;入口参数:8位==>XL
;结果:商==>XL的低4位, 余数==>XL的高4位
;示例:
;MOVLW LOW(200)
;MOVWF XL
;CALL DIV10
DIV10        MOVFW XL
        SUBLW 0A0H
        BNC DV10F
        MOVLW 4
        MOVWF ZL
DV100        CLRC
        RLF XL,F
        BC DV101
        MOVLW 0A0H
        SUBWF XL,W
        BNC DV102
DV101        MOVLW 0A0H
        SUBWF XL,F
        BSF XL,0
DV102        DECF ZL,F
        BNZ DV100
        RETURN
;******* XHXL = ZLYHYLXHXL/R1R0 ****************
;注意:此子程序运行于250K的频率以下会有点问题,感觉时间跟不上,我用500K的时候就正常,这中间的其它频率我没试,有兴趣的朋友可以试下
;16/24/32位数除以16位数
;入口参数:被除数的低8位==>XH,高8位==>YL,类推..,除数低8位==>R0,高8位==>R1
;结果:商==>XL, 余数==>XH
;示例:
;MOVLW LOW(3000000)
;MOVWF XH
;MOVLW HIGH(3000000)
;MOVWF YL
;MOVLW UPPER(3000000)
;MOVWF YH
;MOVLW LOW(1000)
;MOVWF R0
;MOVLW HIGH(1000)
;MOVWF R1
;CLRF XL
;CLRF ZL
;CALL DIV16R
DIV16R        MOVLW 16
        MOVWF ZH
DIV16        MOVFW ZL
        SUBWF R1,W
        BNC DIV16F
        BZ DIV162
        GOTO DIV160
DIV162        MOVFW R0
        SUBWF YH,W
        BC DIV16F
DIV160        CLRC
        RLF XL,F
        RLF XH,F
        RLF YL,F
        RLF YH,F
        RLF ZL,F
        BC DV1600
        MOVFW R1
        SUBWF ZL,W
        BNC DV161
        BZ DIV163
        GOTO DV1600
DIV163        MOVFW R0
        SUBWF YH,W
        BNC DV161
DV1600        CLRC
        MOVFW R0
        SUBWF YH,F
        SKPC
        DECF ZL,F
DV164        MOVFW R1
        SUBWF ZL,F
        BSF XL,0
DV161        DECF ZH,F
        BNZ DIV160
        RETURN
;******* XL = XHXL/ZL ****************
;16位数除以8位数
;入口参数:被除数低8位==>XL,高8位==>XH,除数==>ZL
;结果:商==>XL, 余数==>XH
;示例:
;MOVLW LOW(2000)
;MOVWF XL
;MOVLW HIGH(2000)
;MOVWF XH
;MOVLW 200
;MOVWF ZL
;CALL DIV8
DIV8        MOVFW ZL        ;XHXL/ZL
        SUBWF XH,W
        BC DIV8F
        MOVLW 8
        MOVWF ZH
DIV80        CLRC
        RLF XL,F
        RLF XH,F
        BC DIV81
        MOVFW ZL
        SUBWF XH,W
        BNC DIV82
DIV81        MOVFW ZL
        SUBWF XH,F
        BSF XL,0
DIV82        DECF ZH,F
        BNZ DIV80
        RETURN
;以下部分是处理溢出情况,全部返回FFH
DIV16F        MOVLW 0FFH
        MOVWF YL
        MOVWF YH
DV100F
DIV8F        MOVLW 0FFH
        MOVWF XH
DV10F        MOVLW 0FFH
        MOVWF XL
        RETURN






文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 编程
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.