• <tbody id="w8jhq"><dfn id="w8jhq"><pre id="w8jhq"></pre></dfn></tbody>
  • <fieldset id="w8jhq"><pre id="w8jhq"></pre></fieldset>

    久久黄色 视频|我草AV|AV在线网站导航|色色97激情|无码人妻一区二区有奶水|日韩精品|大香蕉97视频|成人a站免费|日本黄色片|久久久久无码AV

    久久黄色 视频|我草AV|AV在线网站导航|色色97激情|无码人妻一区二区有奶水|日韩精品|大香蕉97视频|成人a站免费|日本黄色片|久久久久无码AV

    久久黄色 视频|我草AV|AV在线网站导航|色色97激情|无码人妻一区二区有奶水|日韩精品|大香蕉97视频|成人a站免费|日本黄色片|久久久久无码AV

    技術(shù)熱線: 4007-888-234
    設(shè)計(jì)開發(fā)

    專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

    開發(fā)工具

    提供開發(fā)工具、應(yīng)用測試 完善的開發(fā)代碼案例庫分享

    技術(shù)支持

    從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!

    新品推廣

    提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力

    新聞中心

    提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動(dòng)態(tài)

    PIC16F877 運(yùn)算子程序

    更新時(shí)間: 2019-03-26
    閱讀量:2824

    1  PIC16F877匯編語言程序主體框架
    以下是一個(gè)典型的程序結(jié)構(gòu):
    ***************程序說明區(qū)*******************
        LIST    p=16f877    ;指定微控制器型號和文件輸出格式
        INCLUDE    p16f877.inc    ;讀入MPLAB提供的定義文件P16F877.INC
    ***片內(nèi)RAM常用資源、變量定義和相應(yīng)的說明*********
        ACCALO    EQU  20    ;存放加數(shù)或減數(shù)低8
        ACCAHI     EQU  21    ;存放加數(shù)或減數(shù)高8
        ACCBLO     EQU     23    ;存放被加數(shù)或被減數(shù)低8
        ACCBHI     EQU     24    ;存放被加數(shù)或被減數(shù)高8
        S_W    EQU     25    ;棧存W寄存器值
        S_STATUS    EQU    26    ;棧存STATUS寄存器值
    ****************芯片復(fù)位矢量*******************
        ORG          0X0000    ;由于PIC16F877芯片復(fù)位矢量在0000h
            ;元,所以常在0000h單元處放置一條跳轉(zhuǎn)
            ;指令,使單片機(jī)復(fù)位后能跳過中斷矢量,
                                    ;直接執(zhí)行主程序
    START    GOTO        MAIN        
    ******************中斷矢量**********************

    ORG          0X0004    ;由于PIC16F877的中斷矢量為0004h,所以
            ;當(dāng)中斷開放時(shí), 需在此處加入中斷程序,
            ;使單片機(jī)能在中斷到來時(shí)及時(shí)進(jìn)入相應(yīng)的
            ;中斷服務(wù)程序。為了可靠起見,如果單片
            ;機(jī)不使用中斷,則常常在該中斷矢量處放
            ;置RETFIE指令,可以使單片機(jī)不會因
            ;干擾產(chǎn)生誤中斷而導(dǎo)致程序跑飛
        CALL    PUSH    ;調(diào)用保護(hù)現(xiàn)場子程序
        BTFSS    PIR1ADIF
        CALL    AD    ;若AD中斷到,則執(zhí)行中斷服務(wù)程序
        ……..        ;此處可放多個(gè)中斷子程序,并以軟件安排
                ;中斷優(yōu)先級
        CALL    POP    ;恢復(fù)中斷現(xiàn)場
        RETFIE    ;中斷返回
    ****************主程序區(qū)*****************
        ORG    0X0100    ;將主程序、子程序和中斷服務(wù)程序等存放
            ;在0100h單元之后,在中斷矢量和主程序
            ;區(qū)之間預(yù)留一些存儲單元,以便寫入判
            ;跳指令和一些必要的現(xiàn)場保護(hù)程序。此外
            ;用戶也可以根據(jù)實(shí)際需要,使主程序從其
            ;它地址開始存放
    MAIN    BSF          STATUSRP0    ;選擇存儲體1
        MOVLW    0XFF    ;定義RA口為輸入端口

    MOVWF    TRISA
        BCF    STATUSRP0    ;選擇存儲體0
        MOVLW    0X04    ;初值化ACCALO
        MOVWF    ACCALO    
        CALL    DX    ;調(diào)用DX子程序
    LOOP1    ……    ;任務(wù)1
        ……    ;任務(wù)2
        :
        :
        :
        GOTO    LOOP1    ;反復(fù)執(zhí)行任務(wù)一和任務(wù)二等
    ***************子程序區(qū)*********************
    DX    MOVF        ACCALO0    ACCBACCA低半字節(jié)相加
        ADDWF     ACCBLO
        RETURN        ;子程序返回
    ****************************************
    PUSH    MOVWF      S_W    ;保護(hù)W寄存器
        MOVF    STATUS0    ;保護(hù)STATUS寄存器
        MOVWF    S_STATUS
        RETURN        ;子程序返回
    ****************************************

    POP    MOVF        S_STATUS0    ;恢復(fù)STATUS寄存器
        MOVWF    STATUS
        MOVF    S_W0    ;恢復(fù)W寄存器
        RETURN    ;子程序返回
    ****************中斷服務(wù)子程序區(qū)************************
    AD        BCF            PIR1ADIF    ;清AD中斷標(biāo)志
        ……                        ;中斷服務(wù)主體程序
        RETURN                    ;子程序返回
                END
    2  四則運(yùn)算子程序
    2.1  16×16位定點(diǎn)數(shù)加、減法子程序
    以下子程序?qū)崿F(xiàn)2個(gè)16×16位有符號數(shù)加、減運(yùn)算,其和或差用一個(gè)16位數(shù)表示。在子程序中,減法是通過對減數(shù)求補(bǔ)后再與被減數(shù)相加來實(shí)現(xiàn)的。因此,當(dāng)程序從D_sub進(jìn)入子程序時(shí)為減法,當(dāng)從D_add進(jìn)入子程序時(shí)為加法。
    子程序的入口條件和出口條件如下:
    入口條件:16位被加數(shù)/被減數(shù)存放在ACCBHIACCBLO;
                  16位加數(shù)/減數(shù)存放在ACCAHIACCALO;
    出口條件:16位和/差存放在ACCBHIACCBLO中。
    以下為16×16位有符號數(shù)加、減法子程序。
    注意:在以下注釋程序中均以ACCA代替ACCAHIACCALO兩個(gè)字節(jié),以ACCB代替ACCBHIACCBLO兩個(gè)字節(jié)。

        LIST            p=16f877

     INCLUDE        p16f877.inc
        ACCALO     EQU     20    ;存放加數(shù)或減數(shù)低8
        ACCAHI     EQU     21    ;存放加數(shù)或減數(shù)高8
        ACCBLO     EQU     23    ;存放被加數(shù)或被減數(shù)低8
        ACCBHI     EQU     24    ;存放被加數(shù)或被減數(shù)高8
        ORG    0X0000
    START    GOTO     MAIN
    ***雙字節(jié)減法子程序,入口地址ACCB-ACCA,出口地址ACCB***
    D_sub    CALL    NEG_A    ;求ACCA的補(bǔ)碼
    ***雙字節(jié)加法子程序,入口地址ACCB+ACCA,出口地址ACCB***
    D_add      MOVF     ACCALO0    ACCBACCA低半字節(jié)相加
        ADDWF     ACCBLO
        BTFSC     STATUSC    ;有進(jìn)位否?
        INCF     ACCBHI    ;有,ACCB高字節(jié)加1,再加ACCAHI
        MOVF     ACCAHI0    ACCAACCB高半字節(jié)相加
        ADDWF     ACCBHI
        RETURN    ;子程序返回
    ************** ACCA取補(bǔ)子程序*****************
    NEG_A    COMF     ACCALO    ACCALO取反加1
        INCF     ACCALO

    BTFSC     STATUSZ    ;低8位有進(jìn)位嗎?
        DECF     ACCAHI    ;有,ACCAHI1,再取反
        COMF     ACCAHI    ;否則ACCAHI直接取反
        RETURN    ;子程序返回
    【校驗(yàn)舉例119531+-16594=2937(十進(jìn)制)
    化為十六進(jìn)制數(shù):4C46H+BF2EH
    結(jié)果:0B79H(十六進(jìn)制)
    【校驗(yàn)舉例226222+3000=29222(十進(jìn)制)
    化為十六進(jìn)制數(shù): 666EH+0BB8H
    結(jié)果:7226H(十六進(jìn)制)
    【例程】
    MAIN    MOVLW      0X6E    ;被加數(shù)666EHACCB
        MOVWF    ACCBLO
        MOVLW    0X66
        MOVWF    ACCBHI
        MOVLW    0XB8    ;加數(shù)BB8HACCA
        MOVWF    ACCALO
        MOVLW    0X0B
        MOVWF    ACCAHI
        CALL    D_add    ;調(diào)用雙字節(jié)加法子程序,求和
        END

    2.2  16×16位定點(diǎn)數(shù)乘法子程序
    子程序采用部分積右移加法實(shí)現(xiàn)乘法運(yùn)算。乘數(shù)和被乘數(shù)分別為16位二進(jìn)制有符號數(shù)(均采用補(bǔ)碼表示,第16位為符號位),積為32位二進(jìn)制有符號數(shù),第32位為符號位。子程序的入口條件和出口條件如下:
    入口條件:被乘數(shù)存放在ACCBHIACCBLO單元中,
              乘數(shù)存放在ACCAHIACCALO單元中。
    出口條件:積存放在ACCBHIACCBLOACCCHIACCCLO單元中,ACCB為高16位,ACCC為低16位。
    以下為本子程序的程序清單:

      LIST    p=16f877
        INCLUDE    p16f877.inc
        ACCALO     EQU     20    ;存放乘數(shù)低8
        ACCAHI     EQU     21    ;存放乘數(shù)高8
        ACCBLO     EQU     23    ;存放被乘數(shù)低8位和乘積第1623
        ACCBHI     EQU     24    ;存放被乘數(shù)高8位和乘積第2431
        ACCCLO     EQU     26    ;存放乘積低8
        ACCCHI     EQU     27    ;存放乘積高8
        ACCDLO     EQU     28    ;臨時(shí)寄存器
        ACCDHI     EQU     29    ;臨時(shí)寄存器
        TEMP     EQU     2A    ;臨時(shí)寄存器
        SIGN     EQU     2B    ;存放乘積的符號
        ORG    0X0000
    START    GOTO     MAIN
    ***16×16位乘法子程序,入口地址ACCB×ACCA,出口地址ACCBACCC ***
        ORG    0X0100
    D_mpy    CALL     S_SIGN    ;求取乘積的符號,并對負(fù)數(shù)取補(bǔ)
         CALL     SETUP    ;調(diào)用子程序,將ACCB的值送ACCD
        INCF    TEMP
        CLRF     ACCCHI    ;清ACCC
        CLRF     ACCCLO
    MLOOP    BCF     STATUSC    ;清進(jìn)位位

     RRF     ACCDHI    ACCD右移
        RRF     ACCDLO
        BTFSC     STATUSC    ;判斷是否需要相加
        CALL     D_add    ;加乘數(shù)至ACCB,見加法程序
        BCF     STATUSC    ;清進(jìn)位位
        RRF     ACCBHI    ;右移部分乘積
        RRF     ACCBLO
        RRF     ACCCHI
        RRF     ACCCLO
        DECFSZ     TEMP    ;乘法完成否?
        GOTO     MLOOP    ;否,繼續(xù)求乘積
        BTFSS     SIGN7    ;是,確定乘積的符號
        GOTO     OVER    ;為正,乘法結(jié)束
        COMF     ACCCLO    ;為負(fù),乘積取補(bǔ)
        INCF         ACCCLO

      BTFSC        STATUSZ
        DECF         ACCCHI
        COMF         ACCCHI
        BTFSC         STATUSZ
    NEG_B    DECF         ACCBLO        
        COMF         ACCBLO
        BTFSC         STATUSZ
        DECF         ACCBHI
        COMF         ACCBHI
    OVER    RETURN        ;子程序返回
    ****************************************
    SETUP    MOVLW     .15    ;初始化TEMP寄存器        
        MOVWF     TEMP
        MOVF     ACCBHI0    ACCBACCD
        MOVWF    ACCDHI
        MOVF     ACCBLO0
        MOVWF     ACCDLO
        CLRF     ACCBHI    ;清ACCB
        CLRF     ACCBLO
        RETURN        ;子程序返回
    *******乘法運(yùn)算確定結(jié)果符號判斷子程序******
    S_SIGN    MOVF     ACCAHI0    ACCAHI異或ACCBHI,結(jié)果送SIGN單元
        XORWF     ACCBHI0

      MOVWF     SIGN            
        BTFSS     ACCBHI7    ACCB為負(fù)嗎?
        GOTO     CHEK_A    ;否,檢查ACCA
        CALL    NEG_B    ;是,求取ACCB絕對值
    CHEK_A    BTFSC     ACCAHI7    ACCA為負(fù)嗎?
        CALL     NEG_A    ACCA為負(fù),求取ACCA絕對值,
                ;見雙字節(jié)加法程序
        RETURN        ACCAACCB均為正,返回
    【校驗(yàn)舉例1】:-24555×-7391=181486005(十進(jìn)制)
    化為十六進(jìn)制數(shù):A015H×E321H
    結(jié)果:0AD141B5H(十六進(jìn)制)
    【校驗(yàn)舉例216405×13089=214725045(十進(jìn)制)
    化為十六進(jìn)制數(shù):4015H×3321H
    結(jié)果:0CCC71B5H(十六進(jìn)制)
    【例程】
    MAIN    MOVLW    0X15    ;被乘數(shù)4015HACCB
        MOVWF    ACCBLO
        MOVLW    0X40
        MOVWF    ACCBHI
        MOVLW    0X21    ;乘數(shù)3321HACCA
        MOVWF    ACCALO

      MOVLW    0X33
        MOVWF    ACCAHI
        CALL    D_mpy    ;調(diào)用雙字節(jié)乘法子程序,求積
        END
    2.3  16×16位定點(diǎn)數(shù)除法子程序
    子程序采用反復(fù)的減法算法,除數(shù)和被除數(shù)分別為16位二進(jìn)制有符號數(shù)(均采用補(bǔ)碼表示,第16位為符號位),商為16位二進(jìn)制有符號數(shù),第16位為符號位。子程序的入口條件和出口條件如下:
    入口條件:被除數(shù)存放在ACCBHIACCBLO單元中;
          除數(shù)存放在ACCAHIACCALO單元中。
    出口條件:商存放在ACCBHIACCBLO單元中;
              余數(shù)存放在ACCCHIACCCLO單元中。
        
        LIST    p=16f877
        INCLUDE    p16f877.inc
        ACCALO    EQU     20    ;存放除數(shù)低8
        ACCAHI     EQU     21    ;存放除數(shù)高8
        ACCBLO     EQU     22    ;存放被除數(shù)和商的低8
        ACCBHI     EQU     23    ;存放被除數(shù)和商的高8
        ACCCLO     EQU     24    ;存放余數(shù)低8
        ACCCHI     EQU     25    ;存放余數(shù)高8
        ACCDLO     EQU     26    ;臨時(shí)寄存器
        ACCDHI     EQU     27    ;臨時(shí)寄存器
        TEMP     EQU     28    ;臨時(shí)寄存器
        SIGN     EQU     29    ;存放商的符號
        ORG    0X0000
    START    GOTO    MAIN

    ***16×16位數(shù)除法子程序,入口地址ACCB /ACCA,出口地址ACCB ***
        ORG    0X0100
    D_div    CALL     S_SIGN    ;確定商的符號,并將負(fù)數(shù)取補(bǔ)
        CALL    SETUP    ;初始化TEMP,將被除數(shù)移至ACCD
                ;(SETUP子程序請參見16×16位定點(diǎn)數(shù)
                ;乘法子程序SETUP
        INCF    TEMP
        CLRF    ACCCHI    ;清余數(shù)寄存器
        CLRF    ACCCLO
    DLOOP    BCF    STATUSC    ;清進(jìn)位位
        RLF    ACCDLO    ;被除數(shù)、余數(shù)左移1
        RLF    ACCDHI
        RLF    ACCCLO
        RLF    ACCCHI
        MOVF    ACCAHI0    ACCCHI-ACCAHI
        SUBWF    ACCCHI0
        BTFSS    STATUSZ    ACCCHI=ACCAHI

     GOTO    NOCHK
        MOVF    ACCALO0    ;是,ACCCLO-ACCALO
        SUBWF    ACCCLO0
    NOCHK    BTFSS    STATUSC    ACCC>ACCA
        GOTO    NOGO
        MOVF    ACCALO0    ;是,余數(shù)減除數(shù)
        SUBWF    ACCCLO
        BTFSS    STATUSC
        DECF    ACCCHI
        MOVF    ACCAHI0
        SUBWF    ACCCHI
        BSF    STATUSC    ;置進(jìn)位位
    NOGO    RLF    ACCBLO    ;商左移1
        RLF    ACCBHI
        DECFSZ    TEMP    ;循環(huán)完畢?
        GOTO    DLOOP
        BTFSS     SIGN7    ;是,確定商的符號
        GOTO     DIVOVER    ;為正,除法結(jié)束,跳轉(zhuǎn)到結(jié)束行
        COMF     ACCCLO    ;為負(fù),商和余數(shù)分別取補(bǔ)
        INCF     ACCCLO
        BTFSC    STATUSZ
        DECF     ACCCHI
        COMF     ACCCHI
        CALL    NEG_B    ;見乘法程序中間NEG_B

    DIVOVER    RETURN        ;子程序返回
    ************除法運(yùn)算確定結(jié)果符號子程序*******************
    S_SIGN    MOVF     ACCAHI0    ACCAHI異或ACCBHI,結(jié)果送SIGN單元
        XORWF     ACCBHI0
        MOVWF     SIGN            
        BTFSS     ACCBHI7    ACCB為負(fù)?
        GOTO     CHEK_A    ;否,檢查ACCA
        COMF     ACCBLO    ;是,ACCB取補(bǔ)
        INCF     ACCBLO
        BTFSC     STATUSZ
        DECF     ACCBHI
        COMF     ACCBHI
    CHEK_A    BTFSC     ACCAHI7    ACCA為負(fù)?
        CALL     NEG_A    ACCA為負(fù),取補(bǔ)(NEG_A子程序請參見
                16×16位定點(diǎn)數(shù)乘法子程序NEG_A
        RETURN        ACCAACCB均為負(fù),返回
    【校驗(yàn)舉例1-23775÷-240=99.0625(十進(jìn)制)
    化為十六進(jìn)制數(shù):A321H÷FF10H
    結(jié)果:(商)0063H,(余數(shù))000FH(十六進(jìn)制)。
    【校驗(yàn)舉例2769÷3856=0.199429(十進(jìn)制)

    化為十六進(jìn)制數(shù):0301H÷0F10H
    結(jié)果:(商)0000H,(余數(shù))0301H(十六進(jìn)制)。
    【例程】
    MAIN    MOVLW    0X01    ;被除數(shù)0301HACCB
        MOVWF    ACCBLO
        MOVLW    0X03
        MOVWF    ACCBHI
        MOVLW    0X10    ;除數(shù)0F10HACCA
        MOVWF    ACCALO
        MOVLW    0X0F
        MOVWF    ACCAHI
        CALL    D_div    ;調(diào)用雙字節(jié)除法子程序,求商
        END
    3  3字節(jié)浮點(diǎn)四則運(yùn)算子程序
    3.1  浮點(diǎn)數(shù)加(減)法子程序
    以下為浮點(diǎn)加(減)運(yùn)算例程:

        LIST            p=16f877
        INCLUDE         p16f877.inc
        ACCALO         EQU     20        ;存放加數(shù)或減數(shù)的尾數(shù)
        ACCAHI         EQU    21
        EXPA        EQU     22        ;存放加數(shù)或減數(shù)階碼
        ACCBLO        EQU     23        ;存放被加數(shù)或被減數(shù)尾數(shù)以及和或差
        ACCBHI         EQU     24
        EXPB         EQU    25        ;存放被加數(shù)或被減數(shù)階碼
        ACCCLO        EQU     26        ;臨時(shí)寄存器
        ACCCHI         EQU     27        ;臨時(shí)寄存器
        ACCDLO        EQU     28        ;臨時(shí)寄存器
        ACCDHI         EQU     29        ;臨時(shí)寄存器
        TEMP         EQU     2A        ;臨時(shí)寄存器
        TEMP1         EQU     30        ;臨時(shí)寄存器
        TIMES         EQU     31        ;臨時(shí)寄存器

      ORG             0X000
    START    GOTO        MAIN
        ORG            0X0100
    **************浮點(diǎn)減法子程序****************
    F_sub    CALL         NEG_A        ;求ACCA的補(bǔ)碼,將減法轉(zhuǎn)換為補(bǔ)碼加法
    ***********浮點(diǎn)加法子程序**************
    F_add    CALL        SUBADJ        ;調(diào)子程序判斷EXPBEXPA的大小
        BTFSC         STATUSZ    ;參與運(yùn)算的兩個(gè)數(shù)階碼相等?
        GOTO         PADD        ;是,求尾數(shù)的和

    BTFSC         STATUSC    EXPB>EXPA
        CALL         F_swap        ;是,ACCBACCA互換
        MOVF         EXPA0        ;否,求取兩者的差值
        SUBWF         EXPB
    SCLOOP    CALL         SHFTSR        ACCB右移規(guī)格化
        INCFSZ         EXPB        EXPBEXPA?        
        GOTO         SCLOOP        ;否,繼續(xù)右移
        MOVF         EXPA0        ;是,存和(差)的階碼


    久久黄色 视频|我草AV|AV在线网站导航|色色97激情|无码人妻一区二区有奶水|日韩精品|大香蕉97视频
  • <tbody id="w8jhq"><dfn id="w8jhq"><pre id="w8jhq"></pre></dfn></tbody>
  • <fieldset id="w8jhq"><pre id="w8jhq"></pre></fieldset>