PIC16C5X指令集及程序設(shè)計(jì)技巧_第1頁(yè)
PIC16C5X指令集及程序設(shè)計(jì)技巧_第2頁(yè)
PIC16C5X指令集及程序設(shè)計(jì)技巧_第3頁(yè)
PIC16C5X指令集及程序設(shè)計(jì)技巧_第4頁(yè)
PIC16C5X指令集及程序設(shè)計(jì)技巧_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第二章 PIC16C5X指令集及程序設(shè)計(jì)技巧第一節(jié) PIC16C5X指令概述2.1 PIC165X 指令概述PIC16C5X每條指令長(zhǎng)12位,指令由操作碼和操作數(shù)組成。PIC16C5X共有33條指令,按操作分成三大類:1. 面向字節(jié)操作類2. 面向位操作類3. 常數(shù)操作和控制操作類全部指令如表2.1所示。第二節(jié) PIC16C5X 指令尋址方式2.2 PIC16C5X 指令尋址方式PIC16C5X單片機(jī)尋址方式根據(jù)操作數(shù)的來(lái)源,可分為寄存器間接尋址、立即數(shù)尋址、直接尋址和位尋址四種。一、寄存器間接尋址這種尋址方式通過(guò)寄存器F0、F4來(lái)實(shí)現(xiàn)。實(shí)際的寄存器地址放在F4中,通過(guò)F0來(lái)進(jìn)行間接尋址。 例

2、: MOVLW 05H ; W=5MOVWF 4 ; W(=5)F4MOVLW 55H ; W=55HMOVWF 0 ; W(=55H)F5上面這段程序把55H送入F5寄存器。間址尋址方式主要用于編寫查表、寫表程序,非常方便。請(qǐng)參考2.7程序設(shè)計(jì)技巧。二、立即數(shù)尋址這種方式就是操作數(shù)為立即數(shù),可直接從指令中獲取。 例:MOVLW 16H ; 16H W三、直接尋址這種方式是對(duì)任何一寄存器直接尋址訪問(wèn)。對(duì)16C52/54/55/56來(lái)說(shuō),寄存器地址(5位)直接包括在指令中。對(duì)PIC16C57,寄存器地址中高2位由(選Bank)由FSR二位決定。例: MOVWF 8 ; WF8寄存器MOVF 8,

3、W ; F8W 四、位尋址這種尋址方式是對(duì)寄存器中的任一位(bit)進(jìn)行操作。例: BSF 11,0 ; 把F11的第0位置為1。第三節(jié) 面向字節(jié)操作類指令2.3 面向字節(jié)操作類指令這類指令共有18條,包括有數(shù)據(jù)傳送、算術(shù)和邏輯運(yùn)算、數(shù)據(jù)移位和交換等操作。它們的操作都是在W數(shù)據(jù)寄存器f之間進(jìn)行,其指令碼結(jié)構(gòu)為:高6位是指令操作碼。第6位d是方向位。d=1,則操作結(jié)果存入f(數(shù)據(jù)寄存器),d=0,則操作結(jié)果存入W。低5位是數(shù)據(jù)寄存器地址,可選中32個(gè)寄存器。對(duì)于PIC16C57,則還要參考寄存器體選擇器F4的bit5或bit6來(lái)選擇存入哪一個(gè)寄存器體(bank0bank3)。表2.1 PIC16

4、C5X 指令集注:(1)除GOTO指令外,任何有關(guān)寫PC(F2)的指令(例如 CALL、MOVWF 2)都將會(huì)把PC 寄存器的第9位清零。(2)若對(duì)I/O口寄存器進(jìn)行操作,如SUBWF 6,1,則使用的F6的值是當(dāng)前B口上的狀態(tài)值,而非B口輸出鎖存器里的值。(3)指令TRIS f(f=5、6或7)將W寄存器中的內(nèi)容寫入f的I/O口控制寄存器中:1 關(guān)斷對(duì)應(yīng)端口的輸出緩沖器,使其為高阻狀態(tài)。(4)當(dāng)預(yù)分頻器分配給RTCC后,任何對(duì)RTCC寄存器(F1)寫操作的指令都將使預(yù)分頻器(Prescaler)清零。第四節(jié) 面向位操作指令2.4 面向位操作指令這類指令共有4條,指令碼基本結(jié)構(gòu)為:高4位是操作

5、碼。bit5bit7是位地址(可尋址8個(gè)位),bitobit4是寄存器地址。第五節(jié) 常數(shù)和控制操作類指令2.5 常數(shù)和控制操作類指令這類指令共有11條,其指令碼結(jié)構(gòu)為:高4位是操作碼,低8位是常數(shù)K。高4位是操作碼。bit5bit7是位地址(可尋址8個(gè)位),bitobit4是寄存器地址。第六節(jié) 特殊指令助記符2.6 特殊指令助記符PIC16C5X 的一些指令還可以用容易記憶的助記符來(lái)表示。PIC15C5X的匯編程序PICASM可以認(rèn)識(shí)這些助記符,在匯編時(shí)會(huì)將其轉(zhuǎn)譯成相應(yīng)的PIC16C5X基本指令。例如指令BCF 3,0(清零C)也可以寫成CLRC,BSF 3,0(置C=1)也可寫成SETC等。

6、表2.2列出了這些助記符及其相對(duì)應(yīng)的PIC165X指令。在后面的例子里,你將看到程序中使用了很多的特殊指令助記符。特殊指令助記符容易記憶。使用它程序可讀性也較好。但這取決于每個(gè)人的習(xí)慣,你可以只使用一部分你認(rèn)為好記的助記符,甚至只用基本的指令助記符而不用特殊指令助記符來(lái)編寫程序。第七節(jié) PIC16C5X程序設(shè)計(jì)基礎(chǔ)2.7 PIC16C5X程序設(shè)計(jì)基礎(chǔ)上面我們已經(jīng)詳細(xì)介紹了PIC16C5X的每條指令?,F(xiàn)在我們來(lái)總結(jié)一下它們的幾個(gè)特點(diǎn):1、各寄存器的每一個(gè)位都可單獨(dú)地被置位、清零或測(cè)試,無(wú)須通過(guò)間接比較,可節(jié)省執(zhí)行時(shí)間和程序地址空間。2、操作寄存器(F1F7)的使用方法和通用寄存器的方法完全一樣,

7、即和通用寄存器一樣看待。這樣使程序執(zhí)行和地址空間都簡(jiǎn)化很多。3、對(duì)于跨頁(yè)面的CALL和GOTO操作,要事先設(shè)置F3中的頁(yè)面地址位PA1、PA0,對(duì)于CALL來(lái) 說(shuō),子程序返回后還要將F3的PA1、PAO恢復(fù)到本頁(yè)面地址。2.7.1 程序的基本格式先介紹二條偽指令:(a)EQU標(biāo)號(hào)賦值偽指令 (b)ORG地址定義偽指令PIC16C5X一旦RESET后指令計(jì)數(shù)器PC被置為全1,所以PIC16C5X 幾種型號(hào)芯片的復(fù)位地址為:一般說(shuō)來(lái),PIC的源程序并沒(méi)有要求統(tǒng)一的格式,大家可以根據(jù)自己的風(fēng)格來(lái)編寫。但這里我們推薦一種清晰明了的格式供參考。2.7.2 程序設(shè)計(jì)基礎(chǔ)一、設(shè)置I/O口的輸入/輸出方向PI

8、C16C5X的I/O口皆為雙向可編程,即每一根I/O 端線都可分別單獨(dú)地由程序設(shè)置為輸入或輸出。這個(gè)過(guò)程由寫I/O控制寄存器TRIS f來(lái)實(shí)現(xiàn),寫入值為1,則為輸入;寫入值為0,則為輸出。三、比較二個(gè)寄存器的大小要比較二個(gè)寄存器的大小,可以將它們做減法運(yùn)算,然后根據(jù)狀態(tài)位C來(lái)判斷。注意,相減的結(jié)果放入W,則不會(huì)影響二寄存器原有的值。例如F8和F9二個(gè)寄存器要比較大小:四、循環(huán)次的程序如果要使某段程序循環(huán)執(zhí)行次,可以用一個(gè)寄存器作計(jì)數(shù)器。下例以 F10做計(jì)數(shù)器,使程序循環(huán)8次。五、IF.THEN.格式的程序下面以IF X=Y THEN GOTO NEXT格式為例。六、FOR.NEXT格式的程序F

9、OR.NEXT程序使循環(huán)在某個(gè)范圍內(nèi)進(jìn)行。下例是FOR X=0 TO 5格式的程序。F10放X的初值,F(xiàn)11放X的終值。七、DO WHILE.END格式的程序DO WHILE.END程序是在符合條件下執(zhí)行循環(huán)。下例是DO WHILE X=1格式的程序。F10放X的值。八、查表程序查表是程序中經(jīng)常用到的一種操作。下例是將十進(jìn)制 09轉(zhuǎn)換成7段LED數(shù)字顯示值。若以B口的RB0RB6來(lái)驅(qū)動(dòng)LED的ag線段,則有如下關(guān)系:設(shè)LED為共陽(yáng),則09數(shù)字對(duì)應(yīng)的線段值如下表:PIC的查表程序可以利用子程序帶值返回的特點(diǎn)來(lái)實(shí)現(xiàn)。具體是在主程序中先取表數(shù)據(jù)地址放入W,接著調(diào)用子程序,子程序的第一條指令將W置入P

10、C,則程序跳到數(shù)據(jù)地址的地方,再由RETLW指令將數(shù)據(jù)放入W返回到主程序.九、READ.DATA,RESTORE格式程序READ.DATA程序是每次讀取數(shù)據(jù)表的一個(gè)數(shù)據(jù),然后將數(shù)據(jù)指針加1,準(zhǔn)備下一次取下一個(gè)數(shù)據(jù)。下例程序中以F10被數(shù)據(jù)表起始地址,F(xiàn)11做數(shù)據(jù)指針。十、延時(shí)程序如果延時(shí)時(shí)間較短,可以讓程序簡(jiǎn)單地連續(xù)執(zhí)行幾條空操作指令NOP。如果延時(shí)時(shí)間長(zhǎng),可以用循環(huán)來(lái)實(shí)現(xiàn)。下例以F10計(jì)算,使循環(huán)重復(fù)執(zhí)行100次。延時(shí)程序中計(jì)算指令執(zhí)行的時(shí)間和即為延時(shí)時(shí)間。如果使用4MH振蕩,則每個(gè)指令周期為1uS。所以單周期指令執(zhí)行時(shí)間為1uS,雙周期指令為2uS。在上例的LOOP循環(huán)延時(shí)時(shí)間即為:(1+

11、2)*100+2=302(uS)。在循環(huán)中插入空操作指令即可延長(zhǎng)延時(shí)時(shí)間:延時(shí)時(shí)間=(1+1+1+1+2)*100+2=602(US)。用幾個(gè)循環(huán)嵌套的方式可以大大延長(zhǎng)延時(shí)時(shí)間。如下例用2個(gè)循環(huán)來(lái)做延時(shí)。延時(shí)時(shí)間= (1+2)*6+2+1+2+1+1 +*100+2=5502(US)十一、RTCC計(jì)數(shù)器的使用RTCC是一個(gè)脈沖計(jì)數(shù)器,它的計(jì)數(shù)脈沖有二個(gè)來(lái)源,一個(gè)是從RTCC引腳輸入的外部信號(hào),一個(gè)是內(nèi)部的指令時(shí)鐘信號(hào)。可以用程序來(lái)選擇其中一個(gè)信號(hào)源做為輸入。RTCC可被程序用作計(jì)時(shí)之用:程序讀取RTCC寄存器值以計(jì)算時(shí)間。當(dāng)RTCC作為內(nèi)部計(jì)時(shí)器使用時(shí)需將RTCC管腿接DD或SS,以減少干擾和

12、耗電流。下例程序以RTCC做延時(shí)。這個(gè)延時(shí)程序中,每過(guò)256個(gè)指令周期RTCC寄存器增1(Prescaler=1:256),設(shè)芯片使用4MHz振蕩,則:延時(shí)時(shí)間=256*256=65536(US)RTCC是自振式的,在它計(jì)數(shù)時(shí),程序可以去做別的事,只要隔一段時(shí)間去讀取它,檢測(cè)它的計(jì)數(shù)值即可。所以用RTCC做延時(shí),在延時(shí)期間,程序還可以做別的事。這是一般用軟件來(lái)延時(shí)做不到的。十二、寄存器體(Bank)的尋址對(duì)于PIC16C52/54/55/56,寄存器有32個(gè),只有一個(gè)體(bank),故不存在體尋址問(wèn)題,對(duì)于PIC16C57來(lái)說(shuō),寄存器則有80個(gè),分為4個(gè)體(bank0-bank3)。在1.5.

13、1中對(duì)F4(FSR)的敘述中已有提及。F4的bit6和bit5是寄存器體尋址位,其對(duì)應(yīng)關(guān)系如下: 當(dāng)芯片RESET后,F(xiàn)4的bit6、bit5都被清零,所以是指向Bank0。下面的例子對(duì)Bank1和Bank2的30H及50H寄存器寫入數(shù)據(jù)。從上例中我們看到,對(duì)某一體(Bank)中的寄存器進(jìn)行讀寫,首先要先對(duì)F4 中的體尋址位進(jìn)行操作。當(dāng)然,芯片RESET后自動(dòng)選擇Bank0(bit6=0、bits=0),所以如果復(fù)位后讀寫,不需對(duì)PA1和PA0再操作。只有當(dāng)對(duì)Banko以外的寄存器體讀寫,才需先置PA1和PA0為相應(yīng)的值。注意,在例子中對(duì)30H寄存器(Bank1)和50H寄存器(Bank2)寫

14、數(shù)時(shí), 用的指令MOVWF 10H中寄存器地址寫的都是10H,而不是讀者預(yù)期的MOVWF 30H和MOVWF 50H, 為什么?讓我們回顧一下指令表。在PIC16C5X的所有有關(guān)到寄存器的指令碼中,寄存尋址位都只占5個(gè)位:fffff,因而只能尋址32個(gè)(00H1FH)寄存器。所以要選址80個(gè)寄存器,還要再用二位體選址位PA1和PA0。當(dāng)我們?cè)O(shè)置好體尋址位PA1和PA0,使之指向一個(gè)Bank,那么指令MOVWF10H就是將W內(nèi)容置入這個(gè)Bank中的相應(yīng)寄存器內(nèi)(10H、30H、50H或70H)。有些用戶第一次接觸體選址的概念,難免理解上有出入,下面是一個(gè)例子:以為MOVWF30H一定能把W置入3

15、0H,MOVWF50H一定能把W置入50H,這是錯(cuò)誤的。因?yàn)檫@兩條指令的實(shí)際效果是MOVWF10H,原因上面已經(jīng)說(shuō)明過(guò)了。所以例2這段程序?qū)嶋H上的效果是:1、55H10H寄存器;2、66H10H寄存器。最后結(jié)果是F10H=66H,而真正的F30H和F50H并沒(méi)有被操作到。講到這,也許還是有些讀者對(duì)體尋址感到很麻煩。那么下面我們給出一個(gè)建議和例子。建議:為使體選址的程序清晰明了(對(duì)別人和對(duì)自己),建議多用名稱定義符來(lái)寫程序,則不易混淆。例3:假設(shè)在程序中用到Bank0、Bank1和Bank2的幾個(gè)寄存器如下:程序這樣書寫,相信體選址就不容易錯(cuò)了。十三、程序跨頁(yè)面跳轉(zhuǎn)和調(diào)用在1.4程序存貯器,我們

16、已經(jīng)談了PIC16C5X的程序存貯區(qū)的頁(yè)面概念和F3寄存器中的頁(yè)面選址位PA1和PA0兩位。下面我們來(lái)看實(shí)例。1、GOTO跨頁(yè)面2、CALL跨頁(yè)面注意:程序?yàn)榭珥?yè)CALL而設(shè)了頁(yè)面地址,從子程序返回后一定要恢復(fù)原來(lái)的頁(yè)面地址。3、程序跨頁(yè)跳轉(zhuǎn)和調(diào)用的編寫讀者看到這里,一定要問(wèn):我寫源程序(.ASM)時(shí),并不去注意每條指令的存放地址,我怎么知道這個(gè)GOTO是要跨頁(yè)面的,那個(gè)CALL是需跨頁(yè)面的?問(wèn)得好!的確,你開(kāi)始寫源程序時(shí)并不知道何時(shí)會(huì)發(fā)生跨頁(yè)面跳轉(zhuǎn)或調(diào)用,不過(guò)當(dāng)你將源程序用MPASM匯編時(shí),它會(huì)告訴你。當(dāng)匯編結(jié)果顯示出:(地址)GOTOoutofRange(地址)CALLoutofRange 這表明你的程序發(fā)生了跨頁(yè)面的跳轉(zhuǎn)和調(diào)用,而你的程序中在這些

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論