|
§2.1 PIC165X 指令概述
PIC16C5X每條指令長12位,指令由操作碼和操作數(shù)組成。PIC16C5X共有33條指令,按操作分成三大類: 1. 面向字節(jié)操作類 2. 面向位操作類 3. 常數(shù)操作和控制操作類 全部指令如表2.1所示。
§2.2 PIC16C5X 指令尋址方式
PIC16C5X單片機尋址方式根據(jù)操作數(shù)的來源,可分為寄存器間接尋址、立即數(shù)尋址、直接尋址和位尋址四種。 一、寄存器間接尋址 這種尋址方式通過寄存器F0、F4來實現(xiàn)。實際的寄存器地址放在F4中,通過F0來進行間接尋址。 |
例: MOVLW 05H ; W=5 MOVWF 4 ; W(=5)→F4 MOVLW 55H ; W=55H MOVWF 0 ; W(=55H)→F5
| 上面這段程序把55H送入F5寄存器。間址尋址方式主要用于編寫查表、寫表程序,非常方便。請參考§2.7程序設(shè)計技巧。
二、立即數(shù)尋址
這種方式就是操作數(shù)為立即數(shù),可直接從指令中獲取。
例: MOVLW 16H ; 16H →W
| 三、直接尋址
這種方式是對任何一寄存器直接尋址訪問。對16C52/54/55/56來說,寄存器地址(5位)直接包括在指令中。對PIC16C57,寄存器地址中高2位由(選Bank)由FSR<6:5>二位決定。
例: MOVWF 8 ; W→F8寄存器 MOVF 8,W ; F8→W | 四、位尋址
這種尋址方式是對寄存器中的任一位(bit)進行操作。
例: BSF 11,0 ; 把F11的第0位置為"1"。 | 這類指令共有11條,其指令碼結(jié)構(gòu)為:
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b8.gif)
高4位是操作碼,低8位是常數(shù)K。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b9.gif)
高4位是操作碼。bit5-bit7是位地址(可尋址8個位),bito-bit4是寄存器地址。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b7.gif)
§2.2 PIC16C5X 指令尋址方式
PIC16C5X單片機尋址方式根據(jù)操作數(shù)的來源,可分為寄存器間接尋址、立即數(shù)尋址、直接尋址和位尋址四種。
一、寄存器間接尋址
這種尋址方式通過寄存器F0、F4來實現(xiàn)。實際的寄存器地址放在F4中,通過F0來進行間接尋址。
例: MOVLW 05H ; W=5 MOVWF 4 ; W(=5)→F4 MOVLW 55H ; W=55H MOVWF 0 ; W(=55H)→F5
| 上面這段程序把55H送入F5寄存器。間址尋址方式主要用于編寫查表、寫表程序,非常方便。請參考§2.7程序設(shè)計技巧。
二、立即數(shù)尋址
這種方式就是操作數(shù)為立即數(shù),可直接從指令中獲取。
例: MOVLW 16H ; 16H →W
| 三、直接尋址
這種方式是對任何一寄存器直接尋址訪問。對16C52/54/55/56來說,寄存器地址(5位)直接包括在指令中。對PIC16C57,寄存器地址中高2位由(選Bank)由FSR<6:5>二位決定。
例: MOVWF 8 ; W→F8寄存器 MOVF 8,W ; F8→W | 四、位尋址
這種尋址方式是對寄存器中的任一位(bit)進行操作。
例: BSF 11,0 ; 把F11的第0位置為"1"。 | §2.3 面向字節(jié)操作類指令
這類指令共有18條,包括有數(shù)據(jù)傳送、算術(shù)和邏輯運算、數(shù)據(jù)移位和交換等操作。它們的操作都是在W數(shù)據(jù)寄存器f之間進行,其指令碼結(jié)構(gòu)為:
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b1.gif)
高6位是指令操作碼。第6位d是方向位。d=1,則操作結(jié)果存入f(數(shù)據(jù)寄存器),d=0,則操作結(jié)果存入W。低5位是數(shù)據(jù)寄存器地址,可選中32個寄存器。對于PIC16C57,則還要參考寄存器體選擇器F4的bit5或bit6來選擇存入哪一個寄存器體(bank0-bank3)。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b2.gif)
表2.1 PIC16C5X 指令集
注:(1)除GOTO指令外,任何有關(guān)寫PC(F2)的指令(例如 CALL、MOVWF 2)都將會把PC 寄存器的第9位清零。 (2)若對I/O口寄存器進行操作,如"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)斷對應(yīng)端口的輸出緩沖器,使其為高阻狀態(tài)。 (4)當(dāng)預(yù)分頻器分配給RTCC后,任何對RTCC寄存器(F1)寫操作的指令都將使預(yù)分頻器(Prescaler)清零。
| 資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b3.gif)
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b5.gif)
§2.4 面向位操作指令
這類指令共有4條,指令碼基本結(jié)構(gòu)為:
高4位是操作碼。bit5-bit7是位地址(可尋址8個位),bito-bit4是寄存器地址。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b7.gif)
§2.5 常數(shù)和控制操作類指令
這類指令共有11條,其指令碼結(jié)構(gòu)為:
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b8.gif)
高4位是操作碼,低8位是常數(shù)K。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b9.gif)
高4位是操作碼。bit5-bit7是位地址(可尋址8個位),bito-bit4是寄存器地址。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b7.gif)
§2.6 特殊指令助記符
PIC16C5X 的一些指令還可以用容易記憶的助記符來表示。PIC15C5X的匯編程序PICASM可以認(rèn)識這些助記符,在匯編時會將其轉(zhuǎn)譯成相應(yīng)的PIC16C5X基本指令。
例如指令"BCF 3,0"(清零C)也可以寫成CLRC,"BSF 3,0"(置C=1)也可寫成SETC等。
表2.2列出了這些助記符及其相對應(yīng)的PIC165X指令。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b11.gif)
在后面的例子里,你將看到程序中使用了很多的特殊指令助記符。特殊指令助記符容易記憶。使用它程序可讀性也較好。但這取決于每個人的習(xí)慣,你可以只使用一部分你認(rèn)為好記的助記符,甚至只用基本的指令助記符而不用特殊指令助記符來編寫程序。
§2.7 PIC16C5X程序設(shè)計基礎(chǔ)
上面我們已經(jīng)詳細介紹了PIC16C5X的每條指令。現(xiàn)在我們來總結(jié)一下它們的幾個特點:
1、各寄存器的每一個位都可單獨地被置位、清零或測試,無須通過間接比較,可節(jié)省執(zhí)行時間和程序地址空間。
2、操作寄存器(F1-F7)的使用方法和通用寄存器的方法完全一樣,即和通用寄存器一樣看待。這樣使程序執(zhí)行和地址空間都簡化很多。
3、對于跨頁面的CALL和GOTO操作,要事先設(shè)置F3中的頁面地址位PA1、PA0,對于CALL來 說,子程序返回后還要將F3的PA1、PAO恢復(fù)到本頁面地址。
§2.7.1 程序的基本格式
先介紹二條偽指令:
(a)EQU──標(biāo)號賦值偽指令 (b)ORG──地址定義偽指令
PIC16C5X一旦RESET后指令計數(shù)器PC被置為全"1",所以PIC16C5X 幾種型號芯片的復(fù)位地址為:
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b12.gif)
一般說來,PIC的源程序并沒有要求統(tǒng)一的格式,大家可以根據(jù)自己的風(fēng)格來編寫。但這里我們推薦一種清晰明了的格式供參考。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b13.gif)
§2.7.2 程序設(shè)計基礎(chǔ)
一、設(shè)置I/O口的輸入/輸出方向
PIC16C5X的I/O口皆為雙向可編程,即每一根I/O 端線都可分別單獨地由程序設(shè)置為輸入或輸出。這個過程由寫I/O控制寄存器TRIS f來實現(xiàn),寫入值為"1",則為輸入;寫入值為"0",則為輸出。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b14.gif)
三、比較二個寄存器的大小
要比較二個寄存器的大小,可以將它們做減法運算,然后根據(jù)狀態(tài)位C來判斷。注意,相減的結(jié)果放入W,則不會影響二寄存器原有的值。
例如F8和F9二個寄存器要比較大小:
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b15.gif)
四、循環(huán)n次的程序
如果要使某段程序循環(huán)執(zhí)行n次,可以用一個寄存器作計數(shù)器。下例以 F10做計數(shù)器,使程序循環(huán)8次。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b16.gif)
五、"IF......THEN......"格式的程序
下面以"IF X=Y THEN GOTO NEXT"格式為例。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b17.gif)
六、"FOR......NEXT"格式的程序
"FOR......NEXT"程序使循環(huán)在某個范圍內(nèi)進行。下例是"FOR X=0 TO 5"格式的程序。F10放X的初值,F(xiàn)11放X的終值。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b18.gif)
七、"DO WHILE.........END"格式的程序
"DO WHILE.........END"程序是在符合條件下執(zhí)行循環(huán)。下例是"DO WHILE X=1"格式的程序。F10放X的值。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b19.gif)
八、查表程序
查表是程序中經(jīng)常用到的一種操作。下例是將十進制 0~9轉(zhuǎn)換成7段LED數(shù)字顯示值。若以B口的RB0~RB6來驅(qū)動LED的a~g線段,則有如下關(guān)系:
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b20.gif)
設(shè)LED為共陽,則0-9數(shù)字對應(yīng)的線段值如下表:
PIC的查表程序可以利用子程序帶值返回的特點來實現(xiàn)。具體是在主程序中先取表數(shù)據(jù)地址放入W,接著調(diào)用子程序,子程序的第一條指令將W置入PC,則程序跳到數(shù)據(jù)地址的地方,再由"RETLW"指令將數(shù)據(jù)放入W返回到主程序.
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b21.gif)
九、"READ......DATA,RESTORE"格式程序
"READ......DATA"程序是每次讀取數(shù)據(jù)表的一個數(shù)據(jù),然后將數(shù)據(jù)指針加1,準(zhǔn)備下一次取下一個數(shù)據(jù)。下例程序中以F10被數(shù)據(jù)表起始地址,F(xiàn)11做數(shù)據(jù)指針。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b22.gif)
十、延時程序
如果延時時間較短,可以讓程序簡單地連續(xù)執(zhí)行幾條空操作指令"NOP"。如果延時時間長,可以用循環(huán)來實現(xiàn)。下例以F10計算,使循環(huán)重復(fù)執(zhí)行100次。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b23.gif)
延時程序中計算指令執(zhí)行的時間和即為延時時間。如果使用4MH振蕩,則每個指令周期為1uS。所以單周期指令執(zhí)行時間為1uS,雙周期指令為2uS。在上例的LOOP循環(huán)延時時間即為:(1+2)*100+2=302(uS)。在循環(huán)中插入空操作指令即可延長延時時間:
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b24.gif)
延時時間=(1+1+1+1+2)*100+2=602(US)。
用幾個循環(huán)嵌套的方式可以大大延長延時時間。如下例用2個循環(huán)來做延時。
延時時間= [(1+2)*6+2+]+1+2+1+1 +*100+2=5502(US)
十一、RTCC計數(shù)器的使用
RTCC是一個脈沖計數(shù)器,它的計數(shù)脈沖有二個來源,一個是從RTCC引腳輸入的外部信號,一個是內(nèi)部的指令時鐘信號?梢杂贸绦騺磉x擇其中一個信號源做為輸入。RTCC可被程序用作計時之用:程序讀取RTCC寄存器值以計算時間。當(dāng)RTCC作為內(nèi)部計時器使用時需將RTCC管腿接VDD或VSS,以減少干擾和耗電流。
下例程序以RTCC做延時。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b26.gif)
這個延時程序中,每過256個指令周期RTCC寄存器增1(Prescaler=1:256),設(shè)芯片使用4MHz振蕩,則:
延時時間=256*256=65536(US)
RTCC是自振式的,在它計數(shù)時,程序可以去做別的事,只要隔一段時間去讀取它,檢測它的計數(shù)值即可。所以用RTCC做延時,在延時期間,程序還可以做別的事。這是一般用軟件來延時做不到的。
十二、寄存器體(Bank)的尋址
對于PIC16C52/54/55/56,寄存器有32個,只有一個體(bank),故不存在體尋址問題,對于PIC16C57來說,寄存器則有80個,分為4個體(bank0-bank3)。在§1.5.1中對F4(FSR)的敘述中已有提及。F4的bit6和bit5是寄存器體尋址位,其對應(yīng)關(guān)系如下:
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b27.gif)
當(dāng)芯片RESET后,F(xiàn)4的bit6、bit5都被清零,所以是指向Bank0。
下面的例子對Bank1和Bank2的30H及50H寄存器寫入數(shù)據(jù)。
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b28.gif)
從上例中我們看到,對某一體(Bank)中的寄存器進行讀寫,首先要先對F4 中的體尋址位進行操作。當(dāng)然,芯片RESET后自動選擇Bank0(bit6=0、bits=0),所以如果復(fù)位后讀寫,不需對PA1和PA0再操作。只有當(dāng)對Banko以外的寄存器體讀寫,才需先置PA1和PA0為相應(yīng)的值。
注意,在例子中對30H寄存器(Bank1)和50H寄存器(Bank2)寫數(shù)時, 用的指令"MOVWF 10H"中寄存器地址寫的都是"10H",而不是讀者預(yù)期的"MOVWF 30H"和"MOVWF 50H", 為什么?
讓我們回顧一下指令表。在PIC16C5X的所有有關(guān)到寄存器的指令碼中,寄存尋址位都只占5個位:fffff,因而只能尋址32個(00H-1FH)寄存器。所以要選址80個寄存器,還要再用二位體選址位PA1和PA0。當(dāng)我們設(shè)置好體尋址位PA1和PA0,使之指向一個Bank,那么指令"MOVWF 10H"就是將W內(nèi)容置入這個Bank中的相應(yīng)寄存器內(nèi)(10H、30H、50H或70H)。
有些用戶第一次接觸體選址的概念,難免理解上有出入,下面是一個例子:
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b29.gif)
以為"MOVWF 30H"一定能把W置入30H,"MOVWF 50H"一定能把W置入50H,這是錯誤的。因為這兩條指令的實際效果是"MOVWF 10H",原因上面已經(jīng)說明過了。所以例2這段程序?qū)嶋H上的效果是:1、55H→10H寄存器;2、66H→10H寄存器。最后結(jié)果是F10H=66H,而真正的F30H和F50H并沒有被操作到。
講到這,也許還是有些讀者對體尋址感到很麻煩。那么下面我們給出一個建議和例子。
建議:為使體選址的程序清晰明了(對別人和對自己),建議多用名稱定義符來寫程序,則不易混淆。
例3:假設(shè)在程序中用到Bank0、Bank1和Bank2的幾個寄存器如下:
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b31.gif)
程序這樣書寫,相信體選址就不容易錯了。
十三、程序跨頁面跳轉(zhuǎn)和調(diào)用
在§1.4"程序存貯器",我們已經(jīng)談了PIC16C5X的程序存貯區(qū)的頁面概念和F3寄存器中的頁面選址位PA1和PA0兩位。下面我們來看實例。
1、"GOTO"跨頁面
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b32.gif)
2、"CALL"跨頁面
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b32.gif)
注意:程序為跨頁CALL而設(shè)了頁面地址,從子程序返回后一定要恢復(fù)原來的頁面地址。
3、程序跨頁跳轉(zhuǎn)和調(diào)用的編寫
讀者看到這里,一定要問:我寫源程序(.ASM)時,并不去注意每條指令的存放地址,我怎么知道這個GOTO是要跨頁面的,那個CALL是需跨頁面的?
問得好!的確,你開始寫源程序時并不知道何時會發(fā)生跨頁面跳轉(zhuǎn)或調(diào)用,不過當(dāng)你將源程序用MPASM匯編時,它會告訴你。當(dāng)匯編結(jié)果顯示出:
×××(地址)"GOTO out of Range" ×××(地址)"CALL out of Range" | 這表明你的程序發(fā)生了跨頁面的跳轉(zhuǎn)和調(diào)用,而你的程序中在這些跨頁GOTO和CALL之前還未設(shè)置好相應(yīng)的頁面地址。這時你應(yīng)該查看匯編生成的.Lst文件,找到這些GOTO和CALL,并查看它們要跳轉(zhuǎn)去的地址處在什么頁面,然后再回到源程序(.ASM)做必要的修改。一直到你的源程序匯編通過(0 Errors and Warnnings)。
4、程序頁面的連接
程序4個頁面連接處應(yīng)該做一些處理。一般建議采用下面的格式:
資料/PIC-HTML-IC應(yīng)用說明/pic16c5xx/PIC16C5XX/image/b35.gif)
即在進入另一個頁面后,馬上設(shè)置相應(yīng)的頁面地址位(PA1、PA0)。
頁面處理是PIC16C5X編程中最麻煩的部分,不過并不難。只要做了一次實際的編程練習(xí)后,就能掌握了。