|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
PIC 運(yùn)算子程序(1) |
| 作者:BLACKHILL 欄目:單片機(jī) |
PIC16F877 運(yùn)算子程序 1 PIC16F877匯編語言程序主體框架 以下是一個(gè)典型的程序結(jié)構(gòu): ;***************程序說明區(qū)******************* LIST p=16F877 ;指定微控制器型號(hào)和文件輸出格式 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ī)不會(huì)因 ;干擾產(chǎn)生誤中斷而導(dǎo)致程序跑飛 CALL PUSH ;調(diào)用保護(hù)現(xiàn)場(chǎng)子程序 BTFSS PIR1,ADIF CALL AD ;若AD中斷到,則執(zhí)行中斷服務(wù)程序 …….. ;此處可放多個(gè)中斷子程序,并以軟件安排 ;中斷優(yōu)先級(jí) CALL POP ;恢復(fù)中斷現(xiàn)場(chǎng) RETFIE ;中斷返回 ;****************主程序區(qū)***************** ORG 0X0100 ;將主程序、子程序和中斷服務(wù)程序等存放 ;在0100h單元之后,在中斷矢量和主程序 ;區(qū)之間預(yù)留一些存儲(chǔ)單元,以便寫入判 ;跳指令和一些必要的現(xiàn)場(chǎng)保護(hù)程序。此外 ;用戶也可以根據(jù)實(shí)際需要,使主程序從其 ;它地址開始存放 MAIN BSF STATUS,RP0 ;選擇存儲(chǔ)體1 MOVLW 0XFF ;定義RA口為輸入端口 MOVWF TRISA BCF STATUS,RP0 ;選擇存儲(chǔ)體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 ACCALO,0 ;ACCB和ACCA低半字節(jié)相加 ADDWF ACCBLO RETURN ;子程序返回 ;**************************************** PUSH MOVWF S_W ;保護(hù)W寄存器 MOVF STATUS,0 ;保護(hù)STATUS寄存器 MOVWF S_STATUS RETURN ;子程序返回 ;**************************************** POP MOVF S_STATUS,0 ;恢復(fù)STATUS寄存器 MOVWF STATUS MOVF S_W,0 ;恢復(fù)W寄存器 RETURN ;子程序返回 ;****************中斷服務(wù)子程序區(qū)************************ AD BCF PIR1,ADIF ;清AD中斷標(biāo)志 …… ;中斷服務(wù)主體程序 RETURN ;子程序返回 END 2 四則運(yùn)算子程序 2.1 16×16位定點(diǎn)數(shù)加、減法子程序 以下子程序?qū)崿F(xiàn)2個(gè)16×16位有符號(hào)數(shù)加、減運(yùn)算,其和或差用一個(gè)16位數(shù)表示。在子程序中,減法是通過對(duì)減數(shù)求補(bǔ)后再與被減數(shù)相加來實(shí)現(xiàn)的。因此,當(dāng)程序從D_sub進(jìn)入子程序時(shí)為減法,當(dāng)從D_add進(jìn)入子程序時(shí)為加法。 子程序的入口條件和出口條件如下: 入口條件:16位被加數(shù)/被減數(shù)存放在ACCBHI、ACCBLO中; 16位加數(shù)/減數(shù)存放在ACCAHI、ACCALO中; 出口條件:16位和/差存放在ACCBHI和ACCBLO中。 以下為16×16位有符號(hào)數(shù)加、減法子程序。 注意:在以下注釋程序中均以ACCA代替ACCAHI、ACCALO兩個(gè)字節(jié),以ACCB代替ACCBHI、ACCBLO兩個(gè)字節(jié)。 LIST p=16F877 INCLUDE p16F877.inc ACCALO EQU 20 ;存放加數(shù)或減數(shù)低8位 ACCAHI &nbs |
| 2樓: | >>參與討論 |
| 作者: BLACKHILL 于 2003/1/16 8:56:00 發(fā)布:
本人有大量的pic子程序,希望與各位共享 |
|
| 3樓: | >>參與討論 |
| 作者: sosomj 于 2003/1/16 9:30:00 發(fā)布:
我支持一下。 當(dāng)下的許多人被外面的世界沖昏了腦袋。以為什么都簡單,上手就要做這項(xiàng)目那項(xiàng)目,殊不知最簡單的道理--循序漸進(jìn)卻是不變的真理。浮躁的心理是不會(huì)有作為的,靜下心來仔細(xì)的耐心的學(xué)習(xí)基礎(chǔ)的東東,仔細(xì)的揣摩基本的子程序,也許有一天你會(huì)發(fā)現(xiàn)你的耐心和努力收到了回報(bào)。 |
|
| 4樓: | >>參與討論 |
| 作者: ljmxinhun 于 2003/1/16 22:56:00 發(fā)布:
那你有沒有兩個(gè)CPU之間通信的程序啊? 可以發(fā)一份這樣的程序給我嗎?54+57兩個(gè)cpu之間的通信.沒有主從之分,因?yàn)閮蓚(gè)cpu都有獨(dú)立的工作,但又有相互的聯(lián)系.用三條線的. E-mail:LJM@zspost.com |
|
| 5樓: | >>參與討論 |
| 作者: 真水無香 于 2003/1/17 23:07:00 發(fā)布:
to blackhill 你好能把你的程序給我一份嗎,謝謝 rwns@etang.com |
|
| 6樓: | >>參與討論 |
| 作者: fineasy 于 2003/1/18 9:42:00 發(fā)布:
雙機(jī)通訊要有協(xié)議,現(xiàn)成的程序估計(jì)不能用! |
|
| 7樓: | >>參與討論 |
| 作者: legend_my 于 2003/1/21 13:29:00 發(fā)布:
能不能共享一下,按需所取嘛 |
|
| 8樓: | >>參與討論 |
| 作者: BLACKHILL 于 2003/1/22 18:35:00 發(fā)布:
雙機(jī)通訊的例子,一回貼出來,供參考 |
|
| 9樓: | >>參與討論 |
| 作者: goof 于 2003/2/8 9:45:00 發(fā)布:
有電路圖可以給一份嗎? gooftrue@163.com |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |