專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開發(fā)工具、應(yīng)用測(cè)試 完善的開發(fā)代碼案例庫分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!
十年專注單片機(jī)方案開發(fā)的方案公司英銳恩,分享PIC12C5XX 單片機(jī)指令集及程序設(shè)計(jì)技巧。英銳恩現(xiàn)提供服務(wù)產(chǎn)品涉及主控芯片:8位單片機(jī)、16位單片機(jī)、32位單片機(jī)及各類運(yùn)算放大器等。
PIC12C5XX 單片機(jī)指令概述
PIC12C5XX單片機(jī)每條指令長(zhǎng)12位,指令由操作碼和操作數(shù)組成。PIC12C5XX單片機(jī)共有33條指令,按操作分成三大類: 1、面向字節(jié)操作類 2、面向位操作類 3、常數(shù)操作和控制操作類。
全部指令如表2.1所示。
面向字節(jié)操作類指令 | (11-6) | (5) | (4-0) | |||||||||
OPCODE | d | f(FILE#) | ||||||||||
二進(jìn)制代碼 HEX 名稱 助記符,操作數(shù) 操作 | 狀態(tài)影響 | 注 | ||||||||||
0000 0000 0000 | 000 | 空操作 | NOP | 無 | ||||||||
0000 001f ffff | 02f | W送到f | MOVWF f | W→f | 無 | 1,4 | ||||||
0000 0100 0000 | 040 | W清零 | CLRW - | 0→W | Z | |||||||
0000 011f ffff | 06f | f清零 | CLRF f | 0→f | Z | 4 | ||||||
0000 10df ffff | 08f | f減去W | SUBWF f,d | f-W→d | C,DC,Z | 1,2,4 | ||||||
0000 11df ffff | 0Cf | f遞減 | DECF f,d | f-1→d | Z | 2,4 | ||||||
0001 00df ffff | 10f | W和f做或運(yùn)算 | IORWF f,d | W∨f→d | Z | 2,4 | ||||||
0001 01df ffff | 14f | W和f做與運(yùn)算 | ANDWF f,d | W∧f→d | Z | 2,4 | ||||||
0001 10df ffff | 18f | W和f做異或運(yùn)算 | XORWF f,d | W〇f→d | Z | 2,4 |
0001 11df ffff | 1Cf | W加f | ADDWF f,d | W+f→d | C,DC,Z | 1,2,4 | ||
0010 00df ffff | 20f | 傳送f到d | MOVF f,d | f→d | Z | 2,4 | ||
0010 01df ffff | 24f | f取補(bǔ) | COMF f,d | f→d | Z | 2,4 | ||
0010 10df ffff | 28f | f遞增 | INCF f,d | f+1→d | Z | 2,4 | ||
0010 11df ffff | 2Cf | f遞減,為0則跳 | DECFSZ f,d | f-1→d,skip if zero | Z | 2,4 | ||
0011 00df ffff | 30f | f循環(huán)右移 | RRF f,d | f(n)→d(n-1),f(0)→C,C→d(7) | C | 2,4 | ||
0011 01df ffff | 34f | f循環(huán)左移 | RLF f,d | f(n)→d(n+1),f(7)→C,C→d(0) | C | 2,4 | ||
0011 10df ffff | 38f | f半字節(jié)交換 | SWAPF f,d | f(0.3)←→f(4-7)→d | Z | 2,4 | ||
0011 11df ffff | 3Cf | f遞增,為0則跳 | INCFSZ f,d | f+1→d,skip if zero | Z | 2,4 |
面向位操作類指令 | (11-8) | (7-5) | (4-0) | ||||||||||
OPCODE | b(BIT#) | f(FILE#) | |||||||||||
二進(jìn)制代碼 HEX 名稱 助記符,操作數(shù) 操作 | 狀態(tài)影響 | 注 | |||||||||||
0100 bbbf ffff | 4bf | 清除f的位b | BCF f,b | 0→f(b) | Z | 2,4 | |||||||
0101 bbbf ffff | 5bf | 設(shè)置f的位b | BSF f,b | 1→f(b) | Z | 2,4 | |||||||
0110 bbbf ffff | 6bf | 測(cè)試f的位b,為0則跳 | BTFSC f,b | Test bit(b) in file(f):Skip if clear | Z | ||||||||
0111 bbbf ffff | 7bf | 測(cè)試f的位b,為0則跳 | BTFSS f,b | Test bit(b) in file(f):Skip if clear | Z | ||||||||
常數(shù)操作和控制操作類指令 | (11-8) | (7-0) | |||||||||||
OPCODE | k(LITERAL) | ||||||||||||
二進(jìn)制代碼 HEX 名稱 助記符,操作數(shù) 操作 | 狀態(tài)影響 | 注 | |||||||||||
0000 0000 0010 | 002 | 寫OPTION寄存器 | OPTION - | W→OPTION register | 無 | ||||||||
0000 0000 0011 | 003 | 進(jìn)入睡眠狀態(tài) | SLEEP - | 0→WDT,stop oscillator | TO,PD | ||||||||
0000 0000 0100 | 004 | 清除WDT計(jì)時(shí)器 | CLRWDT - | 0→WDT(and prescaler,if assigned) | TO,PD | ||||||||
0000 0000 0fff | 00f | 設(shè)置I/O狀態(tài) | TRIS f | W→I/O control register f | 無 | 3 | |||||||
1000 kkkk kkkk | 8kk | 子程序帶參數(shù)返回 | RETLW k | k→W,Stack→PC | 無 |
1001 kkkk kkkk | 9kk | 調(diào)用子程序 | CALL k | PC+1→Stack,K→PC | 無 | 1 | |||||||||
101k kkkk kkkk | Akk | 跳轉(zhuǎn)(K為9位) | GOTO k | k→PC(9 bits) | 無 | ||||||||||
1100 kkkk kkkk | Ckk | 常數(shù)置入W | MOVLW k | k→W | Z | ||||||||||
1101 kkkk kkkk | Dkk | 常數(shù)和W做或運(yùn)算 | IORLW k | k∨W→W | Z | ||||||||||
1110 kkkk kkkk | Ekk | 常數(shù)和W做與運(yùn)算 | ANDLW k | k∧W→W | Z | ||||||||||
1111 kkkk kkkk | Fkk | 常數(shù)和W做異或運(yùn)算 | XORLW k | k○W→W | Z |
表2.1 PIC12C5XX 指令集
注:1、除GOTO指令外,任何有關(guān)寫PC(F2)的指令(例如 CALL、MOVWF 2)都將會(huì)把PC寄存器的第9位清零。
2、若對(duì)I/O口寄存器進(jìn)行操作,如“SUBWF 6,1”,則使用的F6的值是當(dāng)前GP口上的狀態(tài)值,而非GP口輸出鎖存器里的值。
3、指令“TRIS 6”將W寄存器中的內(nèi)容寫入GP的I/O口控制寄存器中:“1”關(guān)斷對(duì)應(yīng)端口的輸出緩沖器,使其為輸入(高阻)狀態(tài),“0”則使其為輸出態(tài)。
4、當(dāng)預(yù)分頻器(Prescaler)分配給TIMER0后,任何對(duì)TMR0寄存器(F1)寫操作的指令都將使預(yù)分頻器清零。
§2.2 PIC12C5XX 指令尋址方式
PIC12C5XX單片機(jī)尋址方式根據(jù)操作數(shù)的來源,可分為寄存器間接尋址、立即數(shù)尋址、直接尋址和位尋址四種。
一、寄存器間接尋址
這種尋址方式通過寄存器F0(INDF)、F4(FSR)來實(shí)現(xiàn)。實(shí)際的寄存器地址放在FSR中,通過INDF來進(jìn)行間接尋址。
例: FSR EQU 4 INDF EQU 0 MOVLW 05H ; W=5 MOVWF FSR ; W(=5)→F4 MOVLW 55H ; W=55H MOVWF INDF ; W(=55H)→F5
上面這段程序把55H送入F5寄存器。間址尋址方式主要用于編寫查表、寫表程序,非常方便。請(qǐng)參考§2.7程序設(shè)計(jì)技巧。
二、立即數(shù)尋址
這種方式就是操作數(shù)為立即數(shù),可直接從指令中獲取。
例: MOVLW 16H ; 16H →W
三、直接尋址
這種方式是對(duì)任何一寄存器直接尋址訪問。對(duì)PIC12C508,寄存器地址(5位)直接包括在指令中,對(duì)PIC12C509,寄存器地址中最高1位由FSR(F4)寄存器中的bit5決定,即體選位。
例: MOVWF 8 ; W→F8寄存器
MOVF 8,W ; F8→W
四、位尋址
這種尋址方式是對(duì)寄存器中的任一位(bit)進(jìn)行操作。
例: BSF 11,0 ; 把F11的第0位置為“1”。
§2.3 面向字節(jié)操作類指令
這類指令共有18條,包括有數(shù)據(jù)傳送、算術(shù)和邏輯運(yùn)算、數(shù)據(jù)移位和交換等操作。它們的操作都是在W數(shù)據(jù)寄存器f之間進(jìn)行,其指令碼結(jié)構(gòu)為:
(11—6) | (5) | (4—0) |
OPCODE | d | f(File#) |
高6位是指令操作碼。第6位d是方向位。d=1,則操作結(jié)果存入f(數(shù)據(jù)寄存器),d=0,則操作結(jié)果存入W。低5位是數(shù)據(jù)寄存器地址,可選中32個(gè)寄存器。對(duì)于PIC12C509,則還要參考寄存器體選擇器FSR的bit5選擇存入哪一個(gè)寄存器體(bank0或bank1)。
1、寄存器加法指令
格式: ADDWF f,d
指令碼: | 000111 | d | fffff |
指令周期: 1 操作: W+f→d 影響狀態(tài)位: C,DC,Z 說明: 將f寄存器和w相加,結(jié)果存入f(d=1)或W(d=0)。 例: ADDWF 8,0 ; F8+W→W
─────────────────────────────────
2、寄存器與指令
格式: ANDWF f,d
指令碼: | 000101 | d | fffff |
指令周期: 1 操作: W∧f→d 影響狀態(tài)位: Z 說明: 將f寄存器和w做邏輯與運(yùn)算,結(jié)果存入f(d=1)或W(d=0)。 例: ANDWF 10,0 ; F10∧W→W ANDWF 10,1 ; F10∧W→F10
─────────────────────────────────
3、寄存器清零指令
格式: CLRF f
指令碼: | 0000011 | fffff |
指令周期: 1 操作: 0→f ,1→z 影響狀態(tài)位:z 說明: 將f寄存器清零,狀態(tài)位Z將被置為1。 例: CLRF 8 ; F8清為零(0→F8)
─────────────────────────────────
4、W清零指令
格式: CLRW
指令碼: | 000001 | 0 | 00000 |
指令周期: 1 操作: 0→W,1→Z 影響狀態(tài)位: Z 說明: 將W寄存器清零,狀態(tài)位Z將被置為1。 例: CLRW ;W清為零,Z置為1
─────────────────────────────────
5、寄存器取反指令
格式: COMF f,d
指令碼: | 00 | d | fffff |
指令周期: 1 操作: f→d 影響狀態(tài)位: Z 說明: 將f寄存器內(nèi)容做邏輯求反運(yùn)算,結(jié)果存入f(d=1)或W(d=0)。 例: COMF 12,0 ; F12取反→F12 COMF 12,1 ; F12取反→W
─────────────────────────────────
6、寄存器減1指令
格式: DECF f,d
指令碼: | 000011 | d | fffff |
指令周期: 1 操作: f-1→d 影響狀態(tài)位: C,DC,Z 說明: f寄存器內(nèi)容減1存入f(d=1)或W(d=0)。 例: DECF 15,1 ; F15-1→F15 DECF 15,0 ; F15-1→W
─────────────────────────────────
7、寄存器減1,結(jié)果為零則跳指令
格式: DECFSZ f,d
指令碼: | 0010 | 11df | ffff |
指令周期: 1或2(產(chǎn)生跳轉(zhuǎn)時(shí)為2)
操作: f-1→d; 結(jié)果為零則跳(PC+1→PC)
影響狀態(tài)位: 無
說明: 將f寄存器內(nèi)容減1存入f(d=1)或W(d=0)。如果結(jié)果為0,則跳過
下一條指令不執(zhí)行。否則順序執(zhí)行下一條指令。
例: ┌───DECFSZ 10,1 ; F10-1→F10,如果F10為0
F10=0 │ MOVLW 55H ; 則跳過MOVLW 55H指令
└──→MOVF 12,0
─────────────────────────────────
8、寄存器加1指令
格式: INCF f,d
指令碼: | 001010 | d | fffff |
指令周期: 1
操作: f+1→d
影響狀態(tài)位: C,DC,Z
說明: f寄存器加1,結(jié)果存入f(d=1)或W(d=0)。
例: INCF 10,0 ; F10+1→W
INCF 10,1 ; F10+1→F10
─────────────────────────────────
9、寄存器加1,結(jié)果為零則跳指令
格式: INCFSZ f,d
指令碼: | 001111 | d | fffff |
指令周期: 1或2(產(chǎn)生跳轉(zhuǎn)時(shí)為2)
操作: f+1→d,結(jié)果為零則跳(PC+1→PC)
影響狀態(tài)位: 無
說明: 將f寄存器內(nèi)容加1存入f(d=1)或W(d=0),如果結(jié)果為零則PC值
加1跳過下一條指令。
例: L00P ┌─INCFSZ 8,1 ; 將F8寄存器加1,結(jié)果存入F8,
│ GOTO LOOP ; 加1后結(jié)果為零則跳到MOVWFF9指令
F8=0 └→MOVWF 9
─────────────────────────────────
10、寄存器或指令
格式: IORWF f,d
指令碼: | 000100 | d | fffff |
指令周期: 1
操作: W∨f→d
影響狀態(tài)位: Z
說明: 將f寄存器內(nèi)容和W內(nèi)容做邏輯或運(yùn)算,結(jié)果存入f(d=1)或W(d=0)。
例: IORWF 18,1 ; F18∨W→F18
IORWF 18,0 ; F18∨W→W
─────────────────────────────────
11、f寄存器傳送指令
格式: MOVF f,d
指令碼: | 001000 | d | fffff |
指令周期: 1
操作: f→d
影響狀態(tài)位: Z
說明: 將f寄存器內(nèi)容傳送至W(d=0)或自己本身f(d=1)。如果是傳給
自己,一般是用來影響狀態(tài)位Z,即可判斷f是否為零。
例: MOVF 10,1 ; F10→F10
BTFSS 3,2 ; 判斷F3的第二位,即Z狀態(tài)位。如果F10=0,則Z=1。
─────────────────────────────────
12、W寄存器傳送指令
格式: MOVWF f
指令碼: | 000000 | 1 | fffff |
指令周期: 1
操作: W→f
影響狀態(tài)位: 無
說明: 將W內(nèi)容傳給f寄存器。
例: MOVWF 6 ; W→F6(B口)
─────────────────────────────────
13、空操作指令
格式: NOP
指令碼: | 000000 | 000000 |
指令周期: 1
操作: 無任何操作
影響狀態(tài)位: 無
說明: 不做任何操作,只有使PC加1。
─────────────────────────────────
14、帶進(jìn)位位左移指令
格式: RLF f,d
指令碼: | 001101 | d | fffff |
指令周期: 1
操作: f(n)→d(n+1),f(7)→c,c→d(0)
影響狀態(tài)位: C
說明: 將f寄存器左移,結(jié)果存入f(d=1)或W(d=0)。f左移時(shí),其最高
位(bit7)移入狀態(tài)位C(進(jìn)位位),如下圖:
進(jìn)位位
┌──┐ ┌──┬──┬──┬──┬──┬──┬──┬──┐
┌─┤ C │← │D7 │ D6 │D5 │ D4 │D3 │ D 2│ D1 │ D0│ ←─┐
│ └──┘ └──┴──┴──┴──┴──┴──┴──┴──┘ │
└──────────────────────────────────┘
例: RLF 8,1 ; F8左移→F8
RLF 8,0 ; F8左移→W
─────────────────────────────────
15、帶進(jìn)位位右移指令
格式: RRF f,d
指令碼: | 001100 | d | fffff |
指令周期: 1
操作: f(n)→d(n-1),f(0)→c,c→d(7)
影響狀態(tài)位: C
說明: 將f寄存器右移,結(jié)果存入f(d=1)或W(d=0)。f右移時(shí),其最低
位(bito)移入狀態(tài)位C,而原來的狀態(tài)位C移入f最高位(bit7),
如下圖:
┌────────────────────────────┐
│進(jìn)位位 │
│ ┌─┐ ┌──┬─┬──┬─┬──┬─┬──┬─┐│
└─→│C │→│D7 │D6│D5 │D4│D3 │D2│ D1 │D0│─┘
└─┘ └──┴─┴──┴─┴──┴─┴──┴─┘
例: RRF 8 ,1 ;F8右移→F8
RRF 8,0 ;F8右移→W
─────────────────────────────────
16、寄存器減法指令
格式: SUBWF f,d
指令碼: | 000010 | d | fffff |
指令周期: 1
操作: f-w→d
影響狀態(tài)位: C,DC,2
說明: 將f寄存器內(nèi)容減去W內(nèi)容,結(jié)果存入f(d=1)或W(d=0)。
例: CLRF 20 ;F20=0
MOVLW 1 ; W=1
SUBWF 20,1 ; F20-W=0-1=-1→F20
; C=0,運(yùn)算結(jié)果為負(fù)。
─────────────────────────────────
17、寄存器交換指令
格式: SWAPF f,d
指令碼: | 001110 | d | fffff |
指令周期: 1
操作: f(0-3)→d(4-7),f(4-7)→d(0-3)
影響狀態(tài)位: 無
說明: 將f寄存器內(nèi)容的高4位(bit7-bit4)和低4位(bit3-bit0)交換
結(jié)果存入f(d=1)或W(d=0)。
例: MOVLW 56H
MOVWF 8 ; F8=56H
SWAPF 8,1 ; F8交換,結(jié)果存入F8,則F8=65H。
─────────────────────────────────
18、寄存器異或運(yùn)算指令
格式: XORWF f,d
指令碼: | 00010 | d | fffff |
指令周期: 1
操作: W○f→d
影響狀態(tài)位: Z
說明: 將f寄存器和W進(jìn)行異或運(yùn)算,結(jié)果存入f(d=1)或W(f=0)。
例: XORWF 5,1 ; F5○W→F5(A口)
XORWF 5,0 ; F5○W→W
§2.4 面向位操作類指令
這類指令共有4條,指令碼基本結(jié)構(gòu)為:
(11—8) | (7—5) | (4—0) |
OPCODE | bbb | file# |
高4位是操作碼。bit5-bit7是位地址(可尋址8個(gè)位),bito-bit4是寄存器地址。
XORWF 5,0 ; F5○W→W
§2.4 面向位操作類指令
這類指令共有4條,指令碼基本結(jié)構(gòu)為:
(11—8) | (7—5) | (4—0) |
OPCODE | bbb | file# |
高4位是操作碼。bit5-bit7是位地址(可尋址8個(gè)位),bito-bit4是寄存器地址。
XORWF 5,0 ; F5○W→W
§2.4 面向位操作類指令
這類指令共有4條,指令碼基本結(jié)構(gòu)為:
(11—8) | (7—5) | (4—0) |
OPCODE | bbb | file# |
高4位是操作碼。bit5-bit7是位地址(可尋址8個(gè)位),bito-bit4是寄存器地址。
影響狀態(tài)位: 無