![PIC匯編語言程序設(shè)計基礎(chǔ)_第1頁](http://file4.renrendoc.com/view12/M04/33/26/wKhkGWX3h6aAK_RYAAHvUdfF7pQ883.jpg)
![PIC匯編語言程序設(shè)計基礎(chǔ)_第2頁](http://file4.renrendoc.com/view12/M04/33/26/wKhkGWX3h6aAK_RYAAHvUdfF7pQ8832.jpg)
![PIC匯編語言程序設(shè)計基礎(chǔ)_第3頁](http://file4.renrendoc.com/view12/M04/33/26/wKhkGWX3h6aAK_RYAAHvUdfF7pQ8833.jpg)
![PIC匯編語言程序設(shè)計基礎(chǔ)_第4頁](http://file4.renrendoc.com/view12/M04/33/26/wKhkGWX3h6aAK_RYAAHvUdfF7pQ8834.jpg)
![PIC匯編語言程序設(shè)計基礎(chǔ)_第5頁](http://file4.renrendoc.com/view12/M04/33/26/wKhkGWX3h6aAK_RYAAHvUdfF7pQ8835.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第四章PIC匯編語言程序設(shè)計根底4.0序論4.1MPASM匯編器的使用4.2匯編語言的語句格式4.3常用偽指令4.4程序格式和程序流程圖4.5RAM數(shù)據(jù)存儲器的體選尋址問題4.6順序程序結(jié)構(gòu)4.7分支程序結(jié)構(gòu)4.8循環(huán)程序結(jié)構(gòu)4.9子程序結(jié)構(gòu)4.10程序的跨頁跳轉(zhuǎn)和跨頁調(diào)用問題4.11延時程序設(shè)計4.12查表程序設(shè)計為什么要學(xué)習(xí)匯編語言匯編語言是唯一一種面向機(jī)器的、最貼近及其硬件的編程語言。學(xué)習(xí)匯編語言能夠幫助深入了解單片機(jī)的構(gòu)成、工作過程和原理。因此特別適合初學(xué)階段的學(xué)習(xí);匯編語言程序可以最有效的節(jié)省CPU的運(yùn)行時間和數(shù)據(jù)存儲空間,代碼使用效率最高。在簡單的控制場合是一種最正確選擇;由于匯編語言是一種直接控制CPU的指令語言,所以可以產(chǎn)生精確的定時信號,這時其它語言所無法實現(xiàn)的;盡管C語言已經(jīng)成為各類單片機(jī)重要的開發(fā)手段,但是匯編語言永遠(yuǎn)不會被淘汰,只有將匯編語言和C語言有機(jī)的結(jié)合起來才能高效的實現(xiàn)應(yīng)用軟件的設(shè)計。4.0序論CPU所能識別的是由“0”或“1”組成的二進(jìn)制的“機(jī)器語言”。如:“SLEEP”指令的機(jī)器語言:“00000001100011”。但機(jī)器語言不便于人們編寫、閱讀。匯編語言是對機(jī)器語言的改進(jìn)。使用了便于記憶、閱讀的符號、字符串來表示指令的操作碼、操作數(shù)和操作數(shù)地址。是一種符號語言,它與機(jī)器語言一一對應(yīng)。匯編語言CPU是不能識別的,因此必須使用一種工具將其“翻譯”為機(jī)器語言,這個工具叫“匯編器”或“匯編程序”。使用“匯編器”或“匯編程序”幫助將匯編語言的源程序轉(zhuǎn)換為機(jī)器語言,這一過程稱之為“匯編”。匯編語言的使用為我們提供了一種可以不涉及機(jī)器指令碼和實際存儲器地址的便捷條件。但是要想正確使用匯編語言編程必須了解“編譯器”所約定的內(nèi)容,掌握如:語句格式、標(biāo)號格式、數(shù)據(jù)進(jìn)制的表示方法、偽指令和匯編器的使用等等。在下面的章節(jié)中將介紹MPASM編譯器的使用、匯編語言的語句格式、幾種常用偽指令、程序格式和流程圖。返回4.1MPASM匯編器的使用MPASM匯編器是美國microchip公司為其單片機(jī)開發(fā)、應(yīng)用者設(shè)計的一套語言工具軟件。它不僅能將匯編語言源程序“翻譯”成機(jī)器語言,還能檢查源程序中的語法錯誤或格式錯誤并向用戶給出題示。MPASM匯編器有兩種版本:①DOS版本的MPASM.EXE;②WINDOWS的MPASMWIN.EXE。
有關(guān)如何使用MPASM將在后面相關(guān)章節(jié)中介紹。返回4.2匯編語言的語句格式為了使編譯器能夠順利的對用戶編制的匯編語言源程序進(jìn)行代碼轉(zhuǎn)換,在編制源程序時必須依照匯編器的約定進(jìn)行書寫。microchip公司提供的MPASM匯編器其匯編語言格式的一般格式由4個字段組成,這4個段不都是必要的,但順序不能顛倒。標(biāo)號操作碼操作數(shù);注釋(label)(opcode)(operand)(commend)標(biāo)號必須從左面第1列開始,后面至少用1個空格與操 作碼隔離〔注意:標(biāo)號后面沒有冒號〕;在無標(biāo)號時,操作碼前至少要保存一個或一個以 上的空格〔建議使用“Tab”鍵分割標(biāo)號列〕;操作碼與操作數(shù)之間至少要保存一個或一個以上的空格,如果有兩個操作數(shù)時兩者之間要由逗號〔半角〕隔開〔建議使用“Tab”鍵分割〕;注釋由分號〔英文半角〕引導(dǎo),在標(biāo)號、操作碼和操作數(shù)之后。標(biāo)號也可以單獨(dú)占一行單必需由分號引導(dǎo)?!惨弧硺?biāo)號在指令前的標(biāo)號實際上就是該指令的符號地址。并不是每條指令都需加標(biāo)號的,只有那些欲被其它語句引用的語句之前才需要加標(biāo)號。子程序第一條語句的標(biāo)號實際上就是該子程序的名稱;標(biāo)號可以單獨(dú)作為作為一行;標(biāo)號的第1個字符必須由字母或下劃線“_”開始,并且從每一行的第1列開始寫。標(biāo)號最多可由32個字母、數(shù)字和其它符號組成。標(biāo)號不能使用指令的助記符、存放器名、或其它系統(tǒng)中已有固定用途的字符串〔系統(tǒng)的保存字〕。一個標(biāo)號在系統(tǒng)中只能定義一次。〔二〕操作碼在匯編語言語言源程序中,盡管其它3個字段有時是空的,但操作碼字段無論在何時都不能是空的。操作碼是指令的助記符,是指令功能的英文縮寫,表示指令的操作類型、性質(zhì),是匯編語言語句中的“關(guān)鍵字”,因此是不能省略的。匯編器將操作碼進(jìn)行匯編時,將其與一個預(yù)先建立的操作碼索引表相比較找出對應(yīng)的機(jī)器碼取而代之,這叫“代真”當(dāng)操作碼前無標(biāo)號時,操作碼前至少要留有一個空格以防匯編器將其誤認(rèn)為標(biāo)號?!踩巢僮鲾?shù)操作數(shù)是指令操作的對象,是數(shù)據(jù)或數(shù)據(jù)的地址。它們可以使用數(shù)值或標(biāo)號形式表示。其中,數(shù)值可以使用二進(jìn)制、八進(jìn)制、十進(jìn)制和十六進(jìn)制或ASCII字符值〔參見講義88頁表4.2〕;而標(biāo)號可以是在此前定義或賦值的代表數(shù)字或地址標(biāo)號或字符串。如果操作數(shù)有兩個,中間應(yīng)由逗號隔開?!菜摹匙⑨屪⑨尵植坑糜趯χ噶钸M(jìn)行注解和說明。雖然注釋可有可無,但對于一個編程者來說,為了便于程序的閱讀、交流、修改和調(diào)試,在一些關(guān)鍵的語句上加標(biāo)注釋是一種好的編程習(xí)慣;注釋由半角的引號“;”開始,它不是程序的功能局部,編譯器對該局部不做任何處理。返回4.3常用偽指令所謂偽指令就是“假指令”的意思,它不是為CPU識別的指令、沒有對應(yīng)的機(jī)器碼。它是為編譯器效勞的指令,如確定指令的存儲地址,為標(biāo)號、字符串賦值等。偽指令的使用使程序在書寫、閱讀上更方便。對于一些沒有說明意義的數(shù)字、RAM地址可以通過偽指令換為有意義的字符來取代,使程序具有很好的可讀性。如:在PIC的指令中不能直接引用存放器的名字取代地址,只能通過EQU偽指令定義后引用其存放器的符號。偽指令只在匯編的過程中進(jìn)行一些輔助工作,是程序設(shè)計人員向編譯器發(fā)出的控制命令,告訴匯編器如何完成匯編過程和一些規(guī)定的操作,以及控制匯編的輸入、輸出和數(shù)據(jù)定位等。一旦匯編完成,偽指令就不存在了。與指令類似,偽指令的格式也是由4個字符段組成。
符號名偽指令助記符操作數(shù);注釋符號名:通常為存放器名、變量名、常數(shù)名、標(biāo)志位名或控制位名、復(fù)位矢量或中斷矢量的一個字符串。同標(biāo)號一樣符號名必須從一行的第1列開始,后面與偽指令應(yīng)至少保存一個空格。但不能向標(biāo)號那樣獨(dú)占一行。〔一〕EQU---符號名賦值偽指令格式:符號名EQUnn說明:使EQU兩邊的值相等。其中nn是長度不同的二進(jìn)制數(shù)(可以分別作為存放器名、位地址、8位的數(shù)據(jù)或常數(shù)、13位的復(fù)位或中斷矢量等)。一旦符號名被EQU賦值,其值就固定下來不能再重新改變。舉例: STATUS EQU 03H ;定義存放器名 RP0 EQU 05H ;定義位地址 TMR0_b EQU 00H ;定義定時器的初值常數(shù)【舉例】:在PIC指令系統(tǒng)中,沒有存放器尋址的方式,匯編程序也不允許直接使用存放器的名字。所以與存放器相關(guān)的操作只能通過“直接尋址”方式完成?!救纭浚簩中的數(shù)據(jù)送PORTC存放器: MOVWF07H 因此,編寫PIC的程序清單時,在程序的開頭可以使用QEU偽指令現(xiàn)將相關(guān)的存放器名進(jìn)行定義,然后在程序中就可以直接引用存放器的名字。PORTC EQU 07H ;定義存放器名∶ MOVWFPORTC ;將W中的數(shù)據(jù)送PORTC 匯編時,編譯器將用07H取代PORTC。舉例:經(jīng)EQU偽指令定義后,匯編程序中直接使用存放器的符號名來取代存放器的地址,使程序具有更好的可讀性。INDF EQU 00HTMR0 EQU 01HPCL EQU 02HSTATUSEQU 03HRP0 EQU05H ;參見講義48頁RP1 EQU06HPORTC EQU 07H::: ORG0000H GOTOMAIN ORG0005HMAINBSFSTATUS,RP0 BCFSTATUS,RP1 ;選擇體 MOVLW01H ;立即數(shù)01H送W MOVWFPORTC ;W內(nèi)容送PORTC〔二〕ORG---程序起始地址定義偽指令格式:ORGnnnn說明:用于指定該偽指令后面的源程序在ROM中存放 的起始地址。nnnn為13位長的地址參數(shù)。舉例:
ORG0005HMAIN CLRW CALLSUB
:
MAIN是標(biāo)號,也就是本行指令的符號地址。ORG偽指令又將該符號地址定義為單片機(jī)內(nèi)部RAM的0005H單元,即CLRW的機(jī)器碼存儲在程序存儲器ROM的0005H開始的單元中?!踩矱ND---程序結(jié)束偽指令格式:END說明:該偽指令通知MPASM匯編器結(jié)束對源程序的匯編。注意:在一個源程序中必須有一個END偽指令,且只能在 程序的最后。〔四〕LIST---列表選項偽指令格式:LIST[可選項,可選項,……可選項]說明:用于設(shè)置匯編參數(shù)來控制匯編過程,或?qū)Υ蛴≥敵鑫募M(jìn)行格式化。該偽指令的所有選項都應(yīng)在一行內(nèi)完成。指令的可選項共有十余種,這里僅介紹2種。①P=〈設(shè)定單片機(jī)型號〉。例如:P=16F877②R=〈定義默認(rèn)的數(shù)值進(jìn)制〉。例如:R=DEC(十進(jìn)制〕或:R=HEX〔十六進(jìn)制〕〔五〕INCLUDE---調(diào)入外部程序文件偽指令格式:INCLUDE“文件名”說明:用來告知匯編器,將一個預(yù)先編制好的外部程序文件包含進(jìn)來。這樣做可以減少重復(fù)勞動,提高編程效率。調(diào)入的外部程序文件通常是“定義文件”,即定義單片機(jī)的復(fù)位矢量、專用存放器的地址及控制位和狀態(tài)為地址等。返回4.4程序格式和程序流程圖雖然書寫源程序時沒有統(tǒng)一的要求,但是一個良好的格式風(fēng)格非常重要。在此推出一種風(fēng)格的格式供參考:;-------------------------------------------------------;符號定義和變量定義;-------------------------------------------------------INDF EQU 00H ;把后面程序指令要用到的TMR0 EQU 01H ;存放器單元地址用表義性很PCL EQU 02H ;強(qiáng)的符號名預(yù)先定義STATUS EQU 03HFSR EQU 04HPORTA EQU 05HTRISA EQU 85HX EQU 20H ;對程序所需的變量預(yù)先定義Y EQU 21H;-------------------------------------------------------------;復(fù)位矢量和中斷矢量的安排〔PIC16F87X〕;------------------------------------------------------------- ORG 0000H ;復(fù)位矢量入口 GOTO MAIN ;轉(zhuǎn)跳到主程序 ORG 0004H ;中斷矢量入口 GOTO INT_BODY ;跳轉(zhuǎn)到中斷效勞程序;---------------------------------------------------------------;主程序區(qū);--------------------------------------------------------------- ORG 0005H ;主程序從0005H開始存放MAIN CLRW CALL SUB …… GOTO MAIN標(biāo)號注釋;----------------------------------------------------;子程序區(qū)和中斷效勞程序區(qū);----------------------------------------------------SUB MOVLW 01H ;子程序 …… RETURN ;子程序返回;INT_BODY ;中斷效勞程序 MOVLW 0FFH …… RETFIE ;中斷效勞程序返回;----------------------------------------------------- END ;全部程序結(jié)束從這個例子中,可以看出:①縱向上將程序劃分為幾個功能塊,層次清晰,便于閱讀;②橫向上按4個字段劃分并上下對齊程序框圖的圖形符號用圖形來表示程序的結(jié)構(gòu)和流向叫程序的“流程圖”。流程圖比程序本身更直觀的表達(dá)出程序的特點(diǎn)。因此,在編制、書寫程序本身之前應(yīng)當(dāng)首先畫出流程圖。通過圖形將程序的每一個操作及操作的順序、分支的結(jié)構(gòu)等等一目了然的展現(xiàn)出來。在編寫一個程序〔特別是復(fù)雜的程序〕事先通過流程圖制定程序的結(jié)構(gòu)、操作順序等,然后將程序采用模塊化,逐一編制、調(diào)式,最后完成,這是編程者必須養(yǎng)成的良好習(xí)慣。開始操作1操作2條件判斷結(jié)束條件成立條件不成立4.5程序的四種結(jié)構(gòu)及流程圖開始操作1操作2操作3操作n結(jié)束初始化操作1條件判斷開始結(jié)束初始化循環(huán)體循環(huán)控制開始結(jié)束開始操作1CallACallA結(jié)束子程序A操作n1,順序結(jié)構(gòu)2,分支結(jié)構(gòu)3,循環(huán)結(jié)構(gòu)4,子程序調(diào)用結(jié)構(gòu)操作2返回〔一〕順序程序結(jié)構(gòu)結(jié)構(gòu)中最簡單的一種。流程圖中的任務(wù)框按順序自上而下的執(zhí)行,最后結(jié)束;【例題】字節(jié)拆分 將將RAM中20H單元中的8位數(shù)據(jù)拆分為高4位〔A〕、低4位〔B〕,并分別送入22H、21H存放器中。程序示意圖:BA----20H21H22HBA0A0B20H21H22H流程圖結(jié)束20H單元數(shù)據(jù)送W將W中高4位清零處理后數(shù)據(jù)送21H將20H中的數(shù)據(jù)經(jīng)半字交換后送W將W的高4位清零處理后數(shù)據(jù)送22H
MOVF 20H,0 ;將20H單元中的數(shù)據(jù)送W ANDLW 0FH ;屏蔽數(shù)據(jù)的高四位
MOVWF 21H ;送RAM的21H單元
SWAPF 20H,0 ;將20H單元中的數(shù)據(jù)交換送W ANDLW 0FH ;屏蔽數(shù)據(jù)的高4位
MOVWF 22H ;送RAM的21H單元(思考題)不使用半字交換指令SWAPF時,程序應(yīng)當(dāng)怎樣編寫?BA----20H21H22HBA0A0B20H21H22H〔二〕分支程序在分支結(jié)構(gòu)程序的流程圖中,包含一個判斷框。判斷框中有一個入口、兩個出口,從而形成兩個分支;判斷框是由“條件判跳語句”實現(xiàn)的: 當(dāng)條件滿足時skip——跳一步; 當(dāng)條件不滿足時順序執(zhí)行。條件成立?OP成立時〔skip〕不成立時〔順序執(zhí)行〕【舉例】:將RAM的20H、21H單元中的無符號數(shù)進(jìn)行比 較,將大數(shù)送入22H單元?!舅惴ā浚簩蓚€數(shù)進(jìn)行一次減法操作,如果產(chǎn)生借位,那么 說明:被減數(shù)小于減數(shù)?!咀⒁狻浚簻p法指令SUBWFF,d中:F為被減數(shù)、W為減數(shù)即: F-W在減法運(yùn)算時:如果有借位那么Cy=0;無借位Cy=1。這一點(diǎn)不同于常規(guī)系統(tǒng)的定義;使用“位測試”指令 BTFSS STATUS,C ;如果Cy=1〔無借位〕時skip 或 BTFSC STATUS,C ;如果Cy=0〔有借位〕時skip程序流程圖開始C=1〔無借位〕C=0〔有借位〕〔21H〕送22H單元C=1?〔21H〕-〔22H〕〔20H〕送22H單元停機(jī)F21BIGF20BIG程序清單STATUS EQU 03HC EQU 0 MOVF 20H,0 ;20H數(shù)據(jù)送W SUBWF 21H,0 ;21H-W送W BTFSS STATUS,C ;如果C=1〔無借位〕skip GOTO F20BIG ;C=0〔有借位〕F21BIG MOVF 21H,0 ;無借位時21H數(shù)大 MOVWF 22H GOTO STOP ;跳轉(zhuǎn)到停機(jī)F20BIG MOVF 20H,0 ;有借位時20H數(shù)大 MOVWF 22HSTOP GOTO STOP ;停機(jī)〔三〕循環(huán)程序結(jié)構(gòu)對于一些重復(fù)性的操作可以采用循環(huán)結(jié)構(gòu)以簡化程序;一個循環(huán)程序包含以下五個組成局部:循環(huán)計數(shù)器:由一個存放器承擔(dān),用于循環(huán)次數(shù)的控制;數(shù)據(jù)指針:在處理數(shù)據(jù)塊時,采用指針是一種唯一可行方法。通過“存放器間接尋址”的方式來使用數(shù)據(jù)指針的;循環(huán)工作體:要重復(fù)執(zhí)行的根本操作;修改數(shù)據(jù)指針:在循環(huán)體中每完成一次根本操作后,通過對指針的“加一”或“減一”為下次訪問作好準(zhǔn)備;循環(huán)控制:對于固定次數(shù)的循環(huán),在每循環(huán)一次后,通過對“循環(huán)計數(shù)器”〔或其它條件〕進(jìn)行處理、判斷,當(dāng)條件滿足后即可退出循環(huán),否那么程序?qū)M(jìn)入“死循環(huán)”?!九e例】RAM存儲器的數(shù)據(jù)填充。將地址30H開始的50個單元全部填充00H?!舅惴ā砍绦虿捎醚h(huán)結(jié)構(gòu):建立數(shù)據(jù)指針,即FSR做指針,原始=30H;選擇一個存放器作循環(huán)計數(shù)器,原始=50;循環(huán)體的根本操作是對內(nèi)存RAM某一單元清零;修改數(shù)據(jù)指針,采用對FSR加一的方法實現(xiàn);利用DECFSZF,1實現(xiàn)循環(huán)次數(shù)的控制。程序清單COUNT EQU 20HFSR EQU 04HINDF EQU 00H MOVLW D’50’ MOVWF COUNT MOVLW 30H MOVWF FSRNEXT CLRF INDF ;注意采用間接尋址方式
INCF FSR,1 ;修改指針
DECSZ COUNT,1 ;循環(huán)控制語句
GOTO NEXTSTOP GOTO STOP定次數(shù)循環(huán)程序流程圖開始NO循環(huán)結(jié)束?初始化修改指針停機(jī)YES工作體關(guān)于程序的幾點(diǎn)說明CLRFINDF指令是“存放器間接尋址”的尋址方式,且實際操作中是以文件選擇存放器FSR的內(nèi)容為操作數(shù)的地址;程序中所遇到的存放器〔FSR〕都在體0中,即系統(tǒng)上電復(fù)位后所默認(rèn)的體,所以省去了訪問FSR前的選體過程;在間接尋址中,RAM單元的9位地址:由FSR存放器本身提供8位地址、STATUS中的IRP提供最高位地址。由于整個數(shù)據(jù)塊〔30H~62H〕都在體0中,且系統(tǒng)上電復(fù)位后STATUS中的IRP=0,所以省去了對IRP的設(shè)定;數(shù)據(jù)存儲器RAM的尋址示意圖00H7FH80HFFH100H17FH180H1FFH6來自指令
0PR1PR0IRP7FSR存放器0RAM單元選擇單元選擇間接尋址的體選直接尋址的體選00011011體0體1體2體3STATUS存放器〔四〕子程序結(jié)構(gòu)在一個程序中,對于一些完全相同的計算或操作可以采用“子程序”結(jié)構(gòu)以簡化程序、節(jié)省存儲空間;在PIC系列單片機(jī)是采用CALL+子程序名實現(xiàn)子程序的調(diào)用:在子程序的開頭必須要有一個標(biāo)號,此標(biāo)號也是該子程序的名;子程序的最后是通過RETURU或RETLW〔帶參數(shù)返回〕或RETIF〔中斷效勞子程序的返回〕。在編制子程序時,要關(guān)注兩個問題:參數(shù)的傳遞:主程序與子程序之間相關(guān)的數(shù)據(jù)。一般是約定某一存儲單元作為參數(shù)的存儲空間。主程序調(diào)用之前將參數(shù)放入此單元;而子程序從該單元取出數(shù)據(jù)進(jìn)行處理,最后再將處理后的數(shù)據(jù)送回〔或約定另一個單元〕;返回主程序后主程序從對應(yīng)單元得到數(shù)據(jù)。一般最常用的存儲單元是工作存放器W?,F(xiàn)場保護(hù):在運(yùn)行子程序時,要用到一些存放器來處理一些中間數(shù)據(jù),而這些存放器往往在調(diào)用子程序前已經(jīng)被使用〔存有數(shù)據(jù),最常見的是工作存放器W〕。為了防止因調(diào)用子程序而破壞原有主程序的數(shù)據(jù),就要對子程序所臨時使用的存放器〔也稱局部變量〕的數(shù)據(jù)事先進(jìn)行保護(hù)——現(xiàn)場保護(hù)。一般保護(hù)指令放在子程序的最開始局部,待子程序返回前再使用指令恢復(fù)這些數(shù)據(jù)。子程序結(jié)構(gòu)應(yīng)用舉例【舉例】極值挑選: 假設(shè)在RAM的30H單元開始有三個無符號數(shù)?,F(xiàn)編制一個程序?qū)⑵渲械淖畲髷?shù)挑選出來并送如40H單元?!舅惴ā烤幹埔粋€比較兩個數(shù)大小的子程序SUB。入口參數(shù)分別為X、Y〔參加比較的兩個數(shù)的存儲單元〕、出口參數(shù)為Z〔挑選出來的大數(shù)存儲單元〕,編制一個主程序兩次調(diào)用SUB就可以跳出最大值。程序流程圖停機(jī)初始化將兩個數(shù)據(jù)送X、Y單元將Z和第三個數(shù)送X、Y調(diào)用SUB,得Z調(diào)用SUB,得ZMAINSUB返回〔Y〕-〔X〕〔Y〕送Z〔X〕送Z有借位?YES〔C=0〕NO〔C=1〕將Z送指定最大單元主程序流程圖SUB子程序流程圖程序清單〔主程序〕STATUS EQU 03HC EQU 00HX EQU 20HY EQU 21HZ EQU 22HMAIN MOVF 30H,0 MOVWF X MOVF 31H,0 MOVWF Y CALL SUB ;比較30H、31H數(shù)據(jù) MOVF Z,0 ;最大數(shù)送Z單元 MOVWF X MOVF 32H,0 MOVWF Y CALL SUB ;32H單元與Z單元比較 MOVF Z,0 ;將最大數(shù)送40H單元 MOVWF 40HSTOP GOTO STOP ;停機(jī)程序清單〔子程序SUB〕入口參數(shù):X、Y單元;出口參數(shù):Z單元存大數(shù)。SUB MOVF X,0 SUBWF Y,0 ;Y-X送W BTFSS STATUS,C ;如果無借位skip GOTO X_BIGY_BIG MOVF Y,0 MOVWF Z GOTO DONEX_BIG MOVF X,0 MOVWF ZDONE RETURN4.5RAM數(shù)據(jù)存儲器的體選尋址問題存儲單元的物理地址由體選和體內(nèi)地址兩局部組成。將512個單元分成4個“體”,每個體為128個單元。在直接尋址的指令中的F〔存放器名〕是一個7位的地址碼,其尋址范圍是128,通過該7位地址碼F可以實現(xiàn)體內(nèi)的128個單元尋址。RAM
體0
體1
體2
體31FFH00H00H7FH80HFFH100H17FH180H1FFH4個體需要2位體地址尋址。在PIC單片機(jī)的硬件設(shè)計中體選按下面方法實現(xiàn):使用“直接尋址”時〔大多數(shù)場合〕,2位體選碼來自狀態(tài)存放器STATUS的PR0、PR1。采用“間接尋址”時,2位的體選碼來自狀態(tài)存放器STATUS中的IRP位和FSR存放器的最高位〔如圖〕。數(shù)據(jù)存儲器RAM的尋址示意圖00H7FH80HFFH100H17FH180H1FFH6來自指令
0PR1PR0IRP7FSR存放器0RAM單元選擇單元選擇間接選址的體選直接選址的體選體選00011011體0體1體2體3STATUS存放器INDFTMR0PCLSTATUSFSRPORTAPORTBPORTCPORTDPORTEPCLATHINTCON……通用寄存器00H01H02H03H04H05H06H07H08H09H0AH0BH0CH1FH20H7FHINDFOP_REGPCLSTATUSFSRPORTATRISBTRISCTRISDTRISEPCLATHINTCON……通用寄存器80H81H82H83H84H85H86H87H88H89H8AH8BH8CH9FHA0HFFHINDFTMR0PCLSTATUSFSRPORTAPORTB---PCLATHINTCON……通用寄存器100H101H102H103H104H105H106H107H108H109H10AH10BH10CH11FH120H17FHINDFOP_REGPCLSTATUSFSRPORTATRISB---PCLATHINTCON……通用寄存器180H181H182H183H184H185H186H187H188H189H18AH18BH18CH19FH1A0H1FFH存放器單元功能分配和地址分配圖從上面的圖可以看出:有些存放器具有4個不同的地址。如STATUS,不管在那個體內(nèi),都可以尋找到同一個存放器STATUS。換句話,只要指令中的存放器地址F=03H〔而不管RP0、RP1為何值〕都可對STATUS進(jìn)行定位。這種設(shè)計會給編程者在尋址上帶來很大的方便。相類似的還有存放器PCL等。本著“夠用即可”的原那么,在PIC16F87X系列單片機(jī)的000H~1FFH的地址中并沒有配滿512個存儲空間,在不同的型號芯片中RAM的配置也不盡相同。特殊功能存放器安排在4個體的上半部〔小數(shù)地址〕,而通用存放器占據(jù)著4個體的下半部〔大數(shù)地址〕。舉例單片機(jī)上電后RP0、RP1=00B ,即指向體0。設(shè)對體1的TRISA存放器進(jìn)行寫入一個0FH的操作。首先要設(shè)置STATUS存放器的PR0,完成操作后再恢復(fù)該體選碼。程序段的代碼如下〔直接尋址〕:STATUS EQU 03H ;將符號名進(jìn)行定義PR0 EQU 05H TRISA EQU 85H MOVLW 0FH ;常數(shù)送W BSF STATUS,PR0;將STATUS的PR0;置一以選擇體1 MOVWF TRISA ;W→TRISA BCF STATUS,PR0;清STATUS的PR0;以恢復(fù)選擇體0在上面的例子中,開頭局部使用了三條偽指令用表義性很強(qiáng)的符號〔直接選用存放器的英文名稱〕來取代原來指令指令中的存放器地址。這樣增加了程序的可讀性。如果不使用偽指令來取代存放器的地址,那么程序變?yōu)椋? MOVLW 0FH ;將數(shù)據(jù)寫入W BSF 03H,5H;設(shè)定體選位 MOVWF 85H ;W→TRISA BCF 03H,5H ;恢復(fù)體選位在PIC單片機(jī)的指令系統(tǒng)中沒有向存放器直接寫數(shù)據(jù)的指令,只能先將數(shù)據(jù)寫入W然后通過W將數(shù)據(jù)傳到存放器中。所以,上述操作必須由兩條指令完成。返回4.6程序的跨頁跳轉(zhuǎn)和跨頁調(diào)用問題在PIC16F87X的跳轉(zhuǎn)和調(diào)用指令:
GOTOnnnnCALLnnnn nnnn為11位的絕對地址,即可直接對2K的程序存儲單元進(jìn)行尋址。然而PIC16F87X系列單片機(jī)的程序存儲空間有三種類型: ①870/871/872為2K的存儲空間(000H-7FFH); ②873/874為4K的存儲空間(000H-FFFH); ③876/877有8K的存儲空間(0000H-1FFFH)。
對于2K存儲空間的單片機(jī)在使用GOTO或CALL指令時可以直接使用指令而不會出現(xiàn)任何問題,但對于程序存儲空間大于2K的芯片在使用上述指令時就存在“跨頁”的問題。復(fù)位矢量中斷矢量0000H0004H1FFFH07FFH0800H第0頁第1頁第2頁第3頁1800H17FFH1000H0FFFH對于大于2K的程序存儲器,可以將其按每2K為1頁而將程序存儲器劃分為假設(shè)干個頁。這樣一個指令的實際物理地址就可以表達(dá)為:頁地址+頁內(nèi)地址。 ①對于具有4K程序存儲空間的873/874來說,頁地址由PCLATH〈3〉來確定〔如下圖〕; ②對于具有8K的程序存儲空間的876/877而言,頁地址由PCLATH<4:3>來確定〔如下圖〕。因此,在使用跨頁跳轉(zhuǎn)時,應(yīng)事先將PCLATH<4:3>進(jìn)行設(shè)置121110870PCHPCL76543210來自指令本身的11位地址PCLATHPC執(zhí)行GOTO和
CALL指令時PC的形成舉例:在某一單片機(jī)的程序存儲器中存放著這樣的一個程序,主程序存放在0頁內(nèi),而要調(diào)用的子程序卻在1頁內(nèi)。PCLATH EQU 0AH ;將符號為PCLATH定義0AH ORG 0000H ;復(fù)位矢量入口地址
GOTO MAIN ;從入口地址轉(zhuǎn)主程序MAIN ORG 0500H ;主程序地址MAIN BSF PCLATH,3 ;設(shè)置PCLATH<3>=1 CALL SUB ;調(diào)用1頁的子程序SUBLOOP …;-------------------------------------------------------------
ORG 0900H ;1頁中的子程序起始地址SUB MOVLW00H … RETURN END通過這一例題〔GOTO、CALL〕要注意兩點(diǎn):在程序出現(xiàn)“跨頁”跳轉(zhuǎn)時,一定要在跳轉(zhuǎn)之前設(shè)定PCLATH<4:3>,然后再跳轉(zhuǎn);使用CALL指令“跨頁”調(diào)用時,在調(diào)用前對PCLATH<4:3>進(jìn)行設(shè)定。在子程序返回前不用恢復(fù)PCLATH的對應(yīng)位。這時因為在子程序調(diào)用時,將原來PC中13位的內(nèi)容全部壓入〔13位寬度〕堆棧,然后再將PCLATH的頁選位與指令中的11位地址形成跨頁調(diào)用。這樣在子程序返回時,從堆棧中彈出原完整的13位PC值,使程序直接返回到原來的斷點(diǎn)。
參見講義33頁返回4.7四種典型使用程序設(shè)計方法PIC單片機(jī)的指令系統(tǒng)具有35條指令,方便學(xué)習(xí)和記憶。但是由于指令系統(tǒng)的特點(diǎn)和局限性其編程方法有其特殊性;本節(jié)就一些較常用的典型算法進(jìn)行分解。這些算法有:初始化程序段;延時程序段;查表程序設(shè)計方法;散轉(zhuǎn)程序設(shè)計?!惨弧吵跏蓟绦蛟O(shè)計所謂“初始化”是指在程序執(zhí)行某一算法前的準(zhǔn)備工作。它主要包括:對一些變量單元的初始值的設(shè)定;相關(guān)功能模塊工作模式的設(shè)定等。 初始化程序一般是一段順序結(jié)構(gòu)的程序段;單片機(jī)在上電、復(fù)位后PC值將引導(dǎo)CPU進(jìn)入到ROM的0000H處執(zhí)行程序,所以在0000H單元通過一條“跳板指令——GOTO指令”轉(zhuǎn)到真正的程序開始段;復(fù)位矢量中斷矢量0000H0004H1FFFH07FFH0800H第0頁第1頁第2頁第3頁1800H17FFH1000H0FFFHGOTO0010H初始化程序一般包含以下任務(wù):對匯編程序中所使用的變量和常數(shù)進(jìn)行定義;對所使用的SFR(專用存放器)進(jìn)行符號地址的定義;復(fù)位矢量、中斷矢量的設(shè)置;看門狗的設(shè)置〔如果啟用WDT〕;對所使用模塊的初始化設(shè)定〔對相關(guān)存放器的設(shè)定〕;程序中有關(guān)的各個中斷允許位的設(shè)定;總的中斷使能的設(shè)定。通過實際編程可以了解和掌握初始化的編程方法?!捕逞訒r程序設(shè)計編程時常常會遇到需要在程序的某些地方插入延時時間,即編制一個延時程序。延時程序通常可以采用兩種方法:
①硬件資源調(diào)用法:如使用單片機(jī)內(nèi)嵌的可編程定時器 tmr0或tmr1等. (類似于mcs-51的T0和T1); ②軟件編程法:插入一段小循環(huán)程序,利用這段程序所消 耗的時間到達(dá)延時目的。在編寫延時程序前必須了解PIC單片機(jī)的指令系統(tǒng)35條指令的執(zhí)行時間。PIC單片機(jī)內(nèi)部采用“哈佛”總線結(jié)構(gòu),指令的讀取總是提前一個周期進(jìn)行〔如圖〕。PIC單片機(jī)的指令時序OSC1Q1Q2Q3Q4PCPCPC+1PC+2
提取第n條指令執(zhí)行第n-1條指令提取第n+1條指令執(zhí)行第n條指令提取第n+2條指令執(zhí)行第n+1條指令取第n條指令與執(zhí)行第n-1條指令的相互嵌套的“流水作業(yè)”模式PIC單片機(jī)指令的執(zhí)行時間〔三種情況〕PIC的指令從取指到執(zhí)行要占用兩個機(jī)器周期(4個Q)。但由于采用了“流水”作業(yè),取第n條指令的取指周期嵌入在前一條指令n-1的執(zhí)行時間內(nèi)。所以在一個順序結(jié)構(gòu)的程序中每一條指令的執(zhí)行時間相當(dāng)于單周期指令。5條無條件跳轉(zhuǎn)指令因為其跳轉(zhuǎn)改變了原來程序的執(zhí)行順序,原來提前讀取的指令必須丟掉,重新讀一個新的指令后再執(zhí)行,所以要多用一個周期,即兩個周期。 這五條指令分別是:
GOTO、CALL、RETURN、RETLW和RETFIE。4個條件跳轉(zhuǎn)指令的執(zhí)行時間要隨條件的不同而不同。①當(dāng)條件滿足發(fā)生跳轉(zhuǎn)時,因改變原來程序執(zhí)行的順序而多用一個周期〔2個周期〕;②當(dāng)條件不滿足時,程序按原來的順序執(zhí)行,所以仍為一個周期。
這四條指令分別是:DECFSZ、INCFSZ、BTFSC、BTFSS。舉例:本例提供3個采用不同方法實現(xiàn)的3個不同時間的延時子程序。為了便于計算,在每一條指令后用括號說明其時間?!苍O(shè)系統(tǒng)使用4MH晶體,那么指令周期Tcyc=4*1/4μs=1μs〕N EQU 20H ;定義存放器N的地址M EQU 21H ;定義存放器M的地址DELAY1 MOVLW X ;(1)循環(huán)初值(待定)送W MOVWF N ;(1)循環(huán)初值送N存放器LOOP DECFSZ N,1 ;(1/2)存放器減一并送回=0跳 GOTO LOOP ;(2)無條件跳轉(zhuǎn)到LOOP RETURN ;(2)返回主程序;-------------------------------------------------------------------------;0.8ms延時子程序;-------------------------------------------------------------------------DELAY2 MOVLW D’100’ ;(1)100送W MOVWF N ;(1)100送存放器NLOOP NOP ;(1) NOP ;(1) NOP ;(1) NOP ;(1) NOP ;(1) DECFSZ N,1 ;(1/2)存放器N減一送回=0跳 GOTO LOOP ;(2)≠0時轉(zhuǎn)LOOP RETURN ;(2)返回主程序 ;-------------------------------------------------------------------------;100ms延時子程序;-------------------------------------------------------------------------DELAY3 MOVLW D’133’ ;(1)外層循環(huán)參數(shù)送M MOVWF M ;(1)LOOP1 MOVLW D’251’ ;(1)內(nèi)層循環(huán)參數(shù)送N MOVWF N ;(1)LOOP2 DECFSZ N,1 ;(1/2) GOTO LOOP2;(2) DECFSZ M,1 ;(1/2) GOTO LOOP1;(2) RETURN ;(2)延時時間:≈251*3*133=100149μs≈100mSDELAY1所產(chǎn)生的延時時間是:周期數(shù)=1+1+〔1+2〕*〔X-1〕+2+2=6+3*〔X-1〕設(shè)X=1,那么T=6Tcyc=6μs【注意】①循環(huán)參數(shù)X控制循環(huán)次數(shù)是X-1。 ②由于循環(huán)參數(shù)X是存放在一個8位的RAM中,所以可選位為0~255。DELAY2的原理根本同DELAY1,但是在循環(huán)體內(nèi)填充NOP空操作來到達(dá)增加延時時間的目的。DELAY3的特點(diǎn)是采用雙重循環(huán)來實現(xiàn)較長的時間延時。上述的各子程序如果考慮到CALL的執(zhí)行時間的話,那么還要加上2個周期即2μs。返回〔三〕查表程序設(shè)計查表程序常用于實現(xiàn)代碼轉(zhuǎn)換、索引和翻譯等場合,是一種較特殊而且非常有用的程序功能。在多種CPU的指令系統(tǒng)中都設(shè)計了專用的查表指令,可見其重要性。例如:用于顯示數(shù)字和字符的LED數(shù)碼管顯示電路,把數(shù)據(jù)送給LED數(shù)碼管顯示前,必須先將數(shù)據(jù)轉(zhuǎn)換為“字符碼”后才能送LED顯示電路。這種為了顯示而將數(shù)據(jù)轉(zhuǎn)換成“字符碼”的過程就是通過典型的查表操作完成的。PIC單片機(jī)的查表程序是利用“子程序帶值返回”指令RETLW來實現(xiàn)。字符字位驅(qū)動PIC單片機(jī)PORTB字符碼輸出abcdefgdp共陰極數(shù)碼管內(nèi)部結(jié)構(gòu)
與LED數(shù)字顯示電路字劃端〔陽極〕輸入高電平時,該字劃亮。共陰極結(jié)構(gòu)LED數(shù)碼管
顯示字符與輸入字形碼對應(yīng)表顯示字符d7~d0
字形碼顯示字符d7~d0字形碼dpgfedcba
dpgfedcba0123456789001111110000011001011011010011110110011001101101011111010000011101111111011011113FH06H5BH4FH66H6DH7DH07H7FH6FHAbCdEFPU全滅全亮0111011101111110001110010101111001111001011100010111001100111110000000001111111177H7CH39H5EH79H71H73H3EH00HFFHabcdefgdp查表程序的算法將待查的數(shù)據(jù)作為查表的“偏移量”事先存入W;查表操作由一個子程序完成。子程序是由一條指令A(yù)DDWFPCL,1和帶參數(shù)返回“RETLW指令串”構(gòu)成。返回指令串的內(nèi)容是將所有包含的參數(shù)〔字型碼〕的RETLW指令按照字符的自然順序排列。查表過程是利用ADDWFPCL,1指令將W〔待查數(shù)字〕與PCL〔表頭地址〕相加,結(jié)果送PCL從而實現(xiàn)程序的跳轉(zhuǎn),跳轉(zhuǎn)地址正好是一條與待查數(shù)字對應(yīng)的包含字形碼的RETLW返回指令〔字形碼包含在W中〕。這樣,返回主程序后便可從W中得到對應(yīng)的字形碼。PCL EQU 02HSTATUS EQU 03HRP0 EQU 05HRB EQU 06HTRISB EQU 86H;------------------------------------------------------;主程序;------------------------------------------------------ ORG 0000H GOTO MIANMIAN BSF STATUS,RP0 ;選擇體1 CLRF TRISB ;定義B口為全部輸出
BCF STATUS,RP0 ;恢復(fù)為體0 MOVF 20H,0 ;將20H中的數(shù)據(jù)送W ANDLW 0FH ;屏蔽高四位
CALL CONVERT ;調(diào)用查表子程序
MOVWF RB ;送到
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐飲服務(wù)承攬合同三篇
- 管道行業(yè)安全管理工作心得
- 2025年全球及中國丙二醛行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國頭發(fā)護(hù)理用神經(jīng)酰胺行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國DHA微囊粉行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國三維足底掃描系統(tǒng)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球電動跨式堆垛機(jī)行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國介孔二氧化硅微球行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國多相真空萃取機(jī)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球豆莢酒店行業(yè)調(diào)研及趨勢分析報告
- 2023-2024年員工三級安全培訓(xùn)考試題及參考答案(綜合題)
- 2024年人教版初中英語九年級全冊單元測評與答案
- 【渞法】學(xué)會自我保護(hù)教學(xué)設(shè)計 七年級道德與法治下冊(統(tǒng)編版2024)
- 2025-2030年中國融雪劑行業(yè)運(yùn)行動態(tài)及發(fā)展前景預(yù)測報告
- 2025保安部年度工作計劃
- 2024年江蘇經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫
- 人居環(huán)境綜合治理項目項目背景及必要性分析
- 招標(biāo)采購基礎(chǔ)知識培訓(xùn)
- 電力系統(tǒng)分布式模型預(yù)測控制方法綜述與展望
- 2024年注冊建筑師-二級注冊建筑師考試近5年真題附答案
評論
0/150
提交評論