• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

请教PIC单片机高手

谁能帮帮解说一下用汇编编程的乘除法运算是怎么编写的(是PIC单片机哦)
全部回复(8)
正序查看
倒序查看
etruhjtte
LV.2
2
2007-03-26 00:48
〓利瑪電子(新加坡)有限公司〓SKM400GB128D現貨137-1410 2508
〓利瑪電子(新加坡)有限公司〓SKM300GB128DE現貨137-1410 2508
〓利瑪電子(新加坡)有限公司〓SKM200GB128D現貨137-1410 2508
〓利瑪電子(新加坡)有限公司〓SKM400GB176D現貨137-1410 2508
       〓利瑪電子(新加坡)有限公司〓137-1410 2580〓
※※※※※※利瑪電子(新加坡)有限公司※※※※※※※
★是一家專注於國際品牌功率模塊銷售為主的龍頭企業★
★在國際國內同行業中享有較高的知名度和良好的声誉★
〓代理及經銷的世界品牌:〓
1: 三菱(MITSUBISHI)    2: 富士(FUJI)        3: 東芝(TOSHIBA)
4: 三社(SANREX)        5:三肯(SANKEN)      6:日立(HITACHI)
7:西門康(SEMIKRON)    8:西門子(SIEMENS)   9:艾赛斯(IXYS)
10: IR(國際整流器)   11:欧派克(EUPEC)    12:英飛凌(INFINEON)
13:仙童(FAIRCHILD)    14: 泰科(TYCO)       15: 摩托羅拉(MOTOEOLA)
16: 新電元(SHINDENGEN) 17: 西碼(WESTCODE)   18: 日之初(HINODE)      
19: 博仕曼(BUSSMANN)   20: (CATELEC)        21: (APT)
22: (ABB)              23: 賽靈思(XILINX)   24: 歐姆龍(OMRON)
銷售産品:IGBT、GTR、IPM、PIM、可控硅、整流橋、快恢複二極管、軟恢複二極管.
電解電容、場效應管、消特基、高頻無感電容.快速熔斷器.等等!!!
     如:美國 日本 德國 英國 西班牙 瑞士等國際知名品牌
        ◆◆◆熱忱歡迎業界人士來電來函垂詢!!!◆◆◆
◆國際現貨供應商==來自原廠的品質==出售一流的服務◆
     聯繫人:周先生
     手機:137-1410-2508
     電話:(86)-0755-88 364656
     地址:深圳市羅湖區嘉賓路彭年酒店旁東佳大廈17樓
     ◆◆◆網絡聯繫方式◆◆◆
    QQ:173943820
   MSN:sz-lima@hotmail.com
E-mail:limapower@21cn.com
  Http:www.lima-power.com.sg
0
回复
da2007
LV.2
3
2007-03-26 20:59
你好:
   我想说,你缺少基本的数学公式的知识!!!!
0
回复
zcx402
LV.3
4
2007-03-27 13:42
@da2007
你好:  我想说,你缺少基本的数学公式的知识!!!!
是十六位的,不是8位.我只知道一般的用移位乘除法运算,我看了乘除汇编子程序,不知道是采用什么数学公式.
0
回复
da2007
LV.2
5
2007-03-28 13:02
@zcx402
是十六位的,不是8位.我只知道一般的用移位乘除法运算,我看了乘除汇编子程序,不知道是采用什么数学公式.
晕,多少位还不是一样的!
0
回复
zcx402
LV.3
6
2007-03-29 13:40
@da2007
晕,多少位还不是一样的!
LIST    p=16f877
    INCLUDE    p16f877.inc
    ACCALO     EQU     20    ;存放乘数低8位
    ACCAHI     EQU     21    ;存放乘数高8位
    ACCBLO     EQU     23    ;存放被乘数低8位和乘积第16~23位
    ACCBHI     EQU     24    ;存放被乘数高8位和乘积第24~31位
    ACCCLO     EQU     26    ;存放乘积低8位
    ACCCHI     EQU     27    ;存放乘积高8位
    ACCDLO     EQU     28    ;临时寄存器
    ACCDHI     EQU     29    ;临时寄存器
    TEMP     EQU     2A    ;临时寄存器
    SIGN     EQU     2B    ;存放乘积的符号
    ORG    0X0000
START    GOTO     MAIN
;***16×16位乘法子程序,入口地址ACCB×ACCA,出口地址ACCB和ACCC ***
    ORG    0X0100
D_mpy    CALL     S_SIGN    ;求取乘积的符号,并对负数取补
     CALL     SETUP    ;调用子程序,将ACCB的值送ACCD
    INCF    TEMP
    CLRF     ACCCHI    ;清ACCC
    CLRF     ACCCLO
MLOOP    BCF     STATUS,C    ;清进位位
    RRF     ACCDHI    ;ACCD右移
    RRF     ACCDLO
    BTFSC     STATUS,C    ;判断是否需要相加
    CALL     D_add    ;加乘数至ACCB,见加法程序
    BCF     STATUS,C    ;清进位位
    RRF     ACCBHI    ;右移部分乘积
    RRF     ACCBLO
    RRF     ACCCHI
    RRF     ACCCLO
    DECFSZ     TEMP    ;乘法完成否?
    GOTO     MLOOP    ;否,继续求乘积
    BTFSS     SIGN,7    ;是,确定乘积的符号
    GOTO     OVER    ;为正,乘法结束
    COMF     ACCCLO    ;为负,乘积取补
    INCF         ACCCLO
    BTFSC        STATUS,Z
    DECF         ACCCHI
    COMF         ACCCHI
    BTFSC         STATUS,Z
NEG_B    DECF         ACCBLO        ;
    COMF         ACCBLO
    BTFSC         STATUS,Z
    DECF         ACCBHI
    COMF         ACCBHI
OVER    RETURN        ;子程序返回
;****************************************
SETUP    MOVLW     .15    ;初始化TEMP寄存器        
    MOVWF     TEMP
    MOVF     ACCBHI,0    ;ACCB送ACCD
    MOVWF    ACCDHI
    MOVF     ACCBLO,0
    MOVWF     ACCDLO
    CLRF     ACCBHI    ;清ACCB
    CLRF     ACCBLO
    RETURN        ;子程序返回
;*******乘法运算确定结果符号判断子程序******
S_SIGN    MOVF     ACCAHI,0    ;ACCAHI异或ACCBHI,结果送SIGN单元
    XORWF     ACCBHI,0
    MOVWF     SIGN            
    BTFSS     ACCBHI,7    ;ACCB为负吗?
    GOTO     CHEK_A    ;否,检查ACCA
    CALL    NEG_B    ;是,求取ACCB绝对值
CHEK_A    BTFSC     ACCAHI,7    ;ACCA为负吗?
    CALL     NEG_A    ;ACCA为负,求取ACCA绝对值,
            ;见双字节加法程序
    RETURN        ;ACCA和ACCB均为正,返回
帮帮分析一下该程序是采用什么数学公式计算的,谢谢了
0
回复
2007-04-02 17:07
呵呵,所有都是一样的啦,有兴趣联系我一下,共同进步啊QQ178843781/MSN:SHZHYZL@HOTMAIL.COM/FLY_MAN100@163.COM
0
回复
吴增贤
LV.4
8
2008-11-17 21:41
@andrew.yang
呵呵,所有都是一样的啦,有兴趣联系我一下,共同进步啊QQ178843781/MSN:SHZHYZL@HOTMAIL.COM/FLY_MAN100@163.COM
高手好,我有一个问题,我用的是PIC16F690,我们做的是电子镇流器,用单片机和485通讯,我把接收放在中断里了,可是当我一个数一个数的发时,接收是没问题的,当我一下发一串数时就不好用了
;**************************************************************
;**                  中断服务子程序                          **
; *************************************************************
ORG 010H

INTERRUPT:

;------------软件现场保护和恢复-----

MOVWF W_TEMP ;1 暂存累加器 W,不影响STATUS的值
SWAPF STATUS,0 ;1 (用SWAPF才不会影响STATUS的值)
MOVWF STATUS_TEMP ;1 暂存状态寄存器 WTATUS
MOVF PCLATH,0 ;1
MOVWF PCLATH_TEMP ;1 暂存程序指针寄存器高位 PCLATH


; ------------------------------------------------------------------------------------------------------------
BCF STATUS,RP1 ; 此语句必需!!
BCF STATUS,RP0    ; 1 BANK0
bcf STATUS,IRP
BTFSS PIR1,RCIF
GOTO TM0_INT
BTFSC RCV_SIGN,1
GOTO RECEIVE
MOVF RCREG,0
SUBLW 55H
BTFSS STATUS,Z
GOTO TIM_CHN_OVER
BSF RCV_SIGN,1         ;;;;置1表示数据头对,可以继续接收
MOVLW RCV_BUF
MOVWF FSR
CLRF RCV_CNT
GOTO TIM_CHN_OVER
RECEIVE:
BTFSC RCSTA,OERR
GOTO YICHU

MOVF RCREG,0
MOVWF INDF
INCF FSR
INCF RCV_CNT

MOVF RCV_CNT,0
SUBLW 09H ;L-RCV_CNT,L>RCV_CNT C=1;L<=RCV_CNT C=0;;;;09H 是接收10个数
BTFSS STATUS,C ;rcv_cnt<=10跳转
GOTO RCV_NT2 ;rcv_cnt>10,不再接收

RCSTA,CREN;;;;;;;;;;;;;;;;;;;;;;关接受
;BSF RCV_SIGN,6   ;;;;;;;;;;;;;;;;;;;;;;;置1表示接收数据超时.
GOTO TIM_CHN_OVER
YICHU:
BCF RCSTA,CREN
CLRF RCV_SIGN
MOVF RCREG,0
MOVF RCREG,0
BSF RCSTA,CREN
GOTO TIM_CHN_OVER

RCV_NT2:
BCF RCSTA,CREN ;;;;;;;;;;;;;;;;;;;;;;;;;关接受
BSF RCV_SIGN,5    ;;;;;;;;;;;;;;;;;;;;接收数据成功.
GOTO TIM_CHN_OVER

;*******************************************************************************
TM0_INT:
BTFSS INTCON,T0IF
GOTO TIM_CHN_OVER


CLOCK:
;----- 长延时-TIMER0 --------------------------
; BCF STATUS,RP0    ; 1 BANK0
BCF INTCON,T0IF ; 清Timer0 溢出中断标志,允许下次进入中断
;INCFSZ TIMER0L,1         ;;;;;;;;;;;;;;;;;;;;;;;;;;1107  
MOVF TIMER0L,0 ; (TIMER0L+1)计时
ADDLW 1H ;
MOVWF TIMER0L
BTFSS STATUS,C
GOTO ADD1
MOVF TIMER0H,0 ; (TIMER0H+1)计时
ADDLW 1H
MOVWF TIMER0H
;INCF TIMER0H,1
;---- 调光计时器 TIMER1、TIMER2L计时,这里采用3个字节---------
ADD1:
;INCFSZ TIMER1L,1       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107  
MOVF TIMER1L,0
ADDLW 1H
MOVWF TIMER1L
BTFSS STATUS,C
GOTO TIAOGUANG

;INCFSZ TIMER1H,1        ;;;;;;;;;;;;;;;;;;;;;;;;;;1107
MOVF TIMER1H,0
ADDLW 1H
MOVWF TIMER1H
BTFSS STATUS,C
GOTO TIAOGUANG

ADD2:
MOVF TIMER2L,0
SUBLW 0FBH ; 防止调光计时器溢出,计时时间已经足够长
BTFSS STATUS,C
GOTO TIM_CHN_OVER

;INCF TIMER2L,1          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107
MOVF TIMER2L,0
ADDLW 1H
MOVWF TIMER2L

;----- 调光控制 ----------------
TIAOGUANG:

CLRWDT

STAGE3:
MOVF TIMER2L,0
ADDLW 01H
SUBWF SEC_STAGE_TIME,0 ; 10小时,切换到第三阶段,10小时 = 10*3600*1000/13.1072 = 29E8D6H
; 10分钟,切换到第三阶段,10分钟 = 10*60*1000/13.1072 = B16DH
BTFSC STATUS,C
GOTO STAGE2

MOVF TIMER1H,0
ADDLW 01H
SUBWF SEC_STAGE_TIME+1,0

BTFSC STATUS,C
GOTO STAGE2

MOVF TIMER1L,0
ADDLW 01H
SUBWF SEC_STAGE_TIME+2,0
BTFSC STATUS,C
GOTO STAGE2

       MOVF PERCENT_POWER+1,0            ;
MOVWF P_REF         ; 第三阶段功率设定值;**bus_i_set     ;;;;;55H对应150W  ;;8AH对应250W


GOTO TIM_CHN_OVER

STAGE2:
MOVF TIMER2L,0
ADDLW 01H
SUBWF FIR_STAGE_TIME,0 ; 5小时,切换到第二阶段,5小时 = 5*3600*1000/13.1072 = 14F46BH
; 5分钟,切换到第二阶段,5分钟 = 5*60*1000/13.1072 = 58B6H
; 5.5小时,切换到第二阶段,5.5小时 = 5.5*3600*1000/13.1072 = 170CDCH
BTFSC STATUS,C
GOTO TIM_CHN_OVER

MOVF TIMER1H,0
ADDLW 01H
SUBWF FIR_STAGE_TIME+1,0
BTFSC STATUS,C
GOTO TIM_CHN_OVER

MOVF TIMER1L,0
ADDLW 01H
SUBWF FIR_STAGE_TIME+2,0
BTFSC STATUS,C
GOTO TIM_CHN_OVER

       MOVF PERCENT_POWER,0
MOVWF P_REF         ; 第二阶段功率设定值;**bus_i_set     ;;;;;73H对应210W

GOTO TIM_CHN_OVER

;-----恢复中断现场---------------------------
TIM_CHN_OVER:
CLRWDT ;1

MOVF PCLATH_TEMP,0 ;1
MOVWF PCLATH ;1 恢复程序指针寄存器高位 PCLATH
SWAPF STATUS_TEMP,0 ;1 (用SWAPF才不会影响STATUS的值)
MOVWF STATUS ;1 恢复状态寄存器 WTATUS
SWAPF W_TEMP,1 ;1
SWAPF W_TEMP,0 ;1 restore pre-isr W register contents

RETFIE ;2 中断返回
0
回复
whwh
LV.3
9
2008-11-19 09:54
@吴增贤
高手好,我有一个问题,我用的是PIC16F690,我们做的是电子镇流器,用单片机和485通讯,我把接收放在中断里了,可是当我一个数一个数的发时,接收是没问题的,当我一下发一串数时就不好用了;**************************************************************;**                  中断服务子程序                          **;*************************************************************ORG010HINTERRUPT:;------------软件现场保护和恢复-----MOVWFW_TEMP;1暂存累加器W,不影响STATUS的值SWAPFSTATUS,0;1(用SWAPF才不会影响STATUS的值)MOVWFSTATUS_TEMP;1暂存状态寄存器WTATUSMOVFPCLATH,0;1MOVWFPCLATH_TEMP;1暂存程序指针寄存器高位PCLATH;------------------------------------------------------------------------------------------------------------BCFSTATUS,RP1;此语句必需!!BCFSTATUS,RP0  ;1BANK0bcfSTATUS,IRPBTFSSPIR1,RCIFGOTOTM0_INTBTFSCRCV_SIGN,1GOTORECEIVEMOVFRCREG,0SUBLW55HBTFSSSTATUS,ZGOTOTIM_CHN_OVERBSFRCV_SIGN,1        ;;;;置1表示数据头对,可以继续接收MOVLWRCV_BUFMOVWFFSRCLRFRCV_CNTGOTOTIM_CHN_OVERRECEIVE:BTFSCRCSTA,OERRGOTOYICHUMOVFRCREG,0MOVWFINDFINCFFSRINCFRCV_CNTMOVFRCV_CNT,0SUBLW09H;L-RCV_CNT,L>RCV_CNTC=1;L
用个串口调试工具什么的,抓串数据看看,是不是波特率没设好
0
回复