搜索
bottom↓
回复: 43

庆祝下,AVR转PIC成功,同时附上我的除法子程序(汇编)

[复制链接]

出0入0汤圆

发表于 2007-12-22 11:26:08 | 显示全部楼层 |阅读模式
花了一个多星期的时间,终于把我的第一款PIC产品给搞出来了~~~~~~~,功耗也达到了客户的要求,运行时0.3mA,休眠时用万用表测不出来,显示为0,应该是小于2uA吧

下面是除法子程序:
说明:这些子程序是从AVR上转过来的,习惯了AVR的一些字符,所以我在写这子程序的时候作了保留,如果你需用下面的程序,请先定义好此寄存器
由于第一次用PIC单片机,所以此程序可能写得不够好,请大家指正,以便此子程序能更完善,谢谢!

;******* 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

出0入0汤圆

 楼主| 发表于 2007-12-22 11:30:10 | 显示全部楼层
以上带有除以100,除以10的子程序,这个用途是显示数据时取每一位数据时可用到

出0入0汤圆

发表于 2007-12-22 15:16:31 | 显示全部楼层
哎,我用的PIC还没有BC指令哦,呵呵。

出0入0汤圆

 楼主| 发表于 2007-12-22 23:01:22 | 显示全部楼层
BC是特殊指令
PIC有好多特殊指令和伪指令的,只看那个指令表是找不到的,现在把我所找到的传上来
点击此处打开“PIC特殊指令助记符.pdf”(文件大小:24K)
点击此处打开“PIC伪指令”.pdf(文件大小:107K)

出0入0汤圆

发表于 2007-12-23 18:20:19 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2008-3-20 10:43:05 | 显示全部楼层
不错

出0入0汤圆

发表于 2008-3-27 13:03:50 | 显示全部楼层
我现在是转型AVR呢,刚学

出0入0汤圆

发表于 2008-3-27 13:51:17 | 显示全部楼层
送你2个标准除法程序
;*********************************************************************
;   ACCb(16 bits) / ACCa(16 bits) -> ACCb(16 bits) with
;                                               Remainder in ACCc (16 bits)
;
UDIV1616:
        call    ud16setup
        clrf    ACCcHI
        clrf    ACCcLO
ud16dloop:
        bcf     STATUS, C
        rlf     ACCdLO, F
        rlf     ACCdHI, F
        rlf     ACCcLO, F
        rlf     ACCcHI, F
        movf    ACCaHI, W
        subwf   ACCcHI, W                  ; check if a>c
        btfss   STATUS, Z
        goto    ud16nochk
        movf    ACCaLO, W
        subwf   ACCcLO, W                ; if msb equal then check lsb
ud16nochk:
        btfss   STATUS, C                    ; carry set if c>a
        goto    ud16nogo
        movf    ACCaLO, W                ; c-a into c
        subwf   ACCcLO, F
        btfss   STATUS, C
        decf    ACCcHI, F
        movf    ACCaHI, W
        subwf   ACCcHI, F
        bsf     STATUS, C                    ; shift a 1 into b (result)
ud16nogo:
        rlf     ACCbLO, F
        rlf     ACCbHI, F
        decfsz  temp, F                 ; loop until all bits checked
        goto    ud16dloop
        return


ud16setup:
        movlw   .16                     ; for 16 shifts
        movwf   temp
        movf    ACCbHI, W                  ; move ACCb to ACCd
        movwf   ACCdHI
        movf    ACCbLO, W
        movwf   ACCdLO
        clrf    ACCbHI
        clrf    ACCbLO
        return

--------------------
;*********************************************************************
;   ACCb / ACCa -> ACCb with Remainder in ACCc
;                                    
UDIV0808:
        call    ud8setup
        clrf    ACCc
ud8dloop:
        bcf     STATUS, C
        rlf     ACCd, F
        rlf     ACCc, F
        movf    ACCa, W
        subwf   ACCc, W                  ; check if a>c
        btfss   STATUS, Z
        goto    ud8nochk
ud8nochk:
        btfss   STATUS, C                    ; carry set if c>a
        goto    ud8nogo
        btfss   STATUS, C
        decf    ACCc, F
        movf    ACCa, W
        subwf   ACCc, F
        bsf     STATUS, C                    ; shift a 1 into b (result)
ud8nogo:
        rlf     ACCb, F
        decfsz  temp, F                 ; loop until all bits checked
        goto    ud8dloop
        return


ud8setup:
        movlw   .8                             ; for 16 shifts
        movwf   temp
        movf    ACCb, W                  ; move ACCb to ACCd
        movwf   ACCd
        clrf    ACCb
        return

出0入0汤圆

发表于 2008-3-27 14:04:38 | 显示全部楼层
唉,不用汇编好多年了,用C明了。也附2个PIC  CCS的2位数显示==10位和个位。
用2位的LED显示出来0-99,中间延时1S

共阳的7段LED:

       -     -
      | |   | |
       -     -
      | |   | |
       -     -
    高位。  低位
///////////////////////////////////////////
  for (a=0; a<100; a++){
    count=a;     
   
   
    led_l=(char)(count%10);  //计算出低位的值。
    led_h=count/10;
    led_h%=count;            //计算出高位的值
   
    delay_ms(1000);
   }
/////////低位LED数字显示程序//////////////////////////
           output_low(X2);   //共阳的7段LED   关闭高位数字
           output_high(X1);  // 开低位数字
           output_C(TB[led_l]);
//-----------高位LED数字显示程序---------------------     
      
         output_low(X1);  //
         output_high(X2);  //
         output_C(TB[led_h]);  //高位

出0入0汤圆

发表于 2008-3-28 19:29:08 | 显示全部楼层
呵呵!我刚由pic转到avr阿!

出0入0汤圆

发表于 2008-3-28 19:31:00 | 显示全部楼层
发现用16及以下系列的多数用汇编,代理商也推荐用汇编。
18及以上,基本上就是c了。

出0入0汤圆

发表于 2008-3-29 19:23:27 | 显示全部楼层
为什么avr转pic钱多吗??

出0入0汤圆

发表于 2008-4-16 00:59:31 | 显示全部楼层
楼上说话挺气人哈

出0入42汤圆

发表于 2008-4-16 10:30:53 | 显示全部楼层
气人是有点,不过确实也有道理

出0入0汤圆

发表于 2008-4-16 16:34:08 | 显示全部楼层
我顶

出0入0汤圆

 楼主| 发表于 2008-4-16 19:15:41 | 显示全部楼层
没想到有这么多的人关注

其实也不是转PIC,放弃AVR啦,上面那子程序是第一次用PIC时所写,相当于是入门吧

现在的开发主要是用AVR,有时用PIC成本更低时就选择用PIC.

熟悉多种mcu的编程总是好的,以后在开发时有多种选择

出0入0汤圆

发表于 2008-4-22 20:51:12 | 显示全部楼层
支持你~~~~~~~

出0入0汤圆

发表于 2008-7-11 17:06:31 | 显示全部楼层
我看了楼主的程序有点困惑!如下

;******* 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
        .
        .
        .
        .
        .


其中有    BC DV100F    ;XH>=100 这句
为什么XH大于100就溢出啊?

出0入0汤圆

发表于 2008-7-18 09:27:47 | 显示全部楼层
bc是不是編譯器提供的偽指令啊

出0入0汤圆

发表于 2008-7-18 09:29:56 | 显示全部楼层
除以10就是循環-10,夠減就+1,不夠就是餘數?

出0入0汤圆

 楼主| 发表于 2008-8-25 20:41:48 | 显示全部楼层
不好意思,好久都没上网了,忙了点

TO:eagle_avr :
关于为什么XH大于100就溢出,这个子程序有个使用范围,商值是8位的,所以XH大于100时就当溢出处理,如果你的商不是8位的,请用16/24/32位数除以16位数的除法子程序

TO:jackzhou

BC是特殊指令 ,详细请看三楼的资料

出0入0汤圆

发表于 2008-8-25 21:33:02 | 显示全部楼层
我一个月。。从不认识义隆,到用的。。想吐血。。。。

出0入0汤圆

发表于 2008-8-26 02:23:48 | 显示全部楼层
上了PIC就非汇编不可吗?16系列的存储空间好像也够大了吧

出0入8汤圆

发表于 2008-9-9 15:52:06 | 显示全部楼层
22楼的吐血没事啊,等吐的差不多了,也就顺手了。我现在已经没血可吐了。

出0入0汤圆

发表于 2009-3-13 11:51:06 | 显示全部楼层
【17楼】 eagle_avr

应该是为了商不溢出!

出0入0汤圆

发表于 2009-3-26 17:01:01 | 显示全部楼层
成本重要,PIC得学

出0入0汤圆

发表于 2009-3-26 17:08:34 | 显示全部楼层
义隆那么可怕吗?

出50入0汤圆

发表于 2009-3-31 12:01:37 | 显示全部楼层
个人意见吧!EMC 毕竟比价比搞呀

出0入0汤圆

发表于 2011-5-10 15:06:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-3 20:46:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-6-18 15:38:23 | 显示全部楼层
呀,汇编啊,看着写吃力啊,MARK下,继续学习啦!

出0入0汤圆

发表于 2012-11-28 14:58:31 | 显示全部楼层
谢谢!汇编写得不错!借鉴了!

出0入0汤圆

发表于 2012-11-30 17:36:49 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2014-3-2 13:57:36 | 显示全部楼层
汇编啊,不错……

出0入0汤圆

发表于 2014-3-10 08:25:08 | 显示全部楼层
这样的古董贴还顶上来?

出0入0汤圆

发表于 2014-3-23 22:54:01 | 显示全部楼层
   话说  PIC的 C编译器 还要付费

出0入0汤圆

发表于 2015-11-24 15:05:56 | 显示全部楼层
MARK~~~~~~~~~~~~~~~~~~~~~~

出0入0汤圆

发表于 2015-11-24 18:29:40 | 显示全部楼层
mark      

出0入0汤圆

发表于 2015-11-24 18:33:38 | 显示全部楼层
接下来可能也会去搞AVR

出0入0汤圆

发表于 2015-11-24 23:24:51 | 显示全部楼层
nishi666 发表于 2015-11-24 18:33
接下来可能也会去搞AVR

感觉搞avr不如搞pic,avr感觉用在民用场合多一些。

出0入0汤圆

发表于 2016-3-28 23:34:38 | 显示全部楼层
高手 膜拜

出0入0汤圆

发表于 2016-3-29 09:22:01 | 显示全部楼层
学习一下

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-3 03:07

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

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