單片機代理商深圳英銳恩為您分享PIC12C5XX 單片機指令集及程序設計技巧。
§2.1 PIC12C5XX單片機 指令概述
PIC12C5XX單片機每條指令長12位,指令由操作碼和操作數(shù)組成。PIC12C5XX單片機共有33條指令,按操作分成三大類:
1、面向字節(jié)操作類
2、面向位操作類
3、常數(shù)操作和控制操作類。
全部指令如表2.1所示。
面向字節(jié)操作類指令 (11-6) (5) (4-0) OPCODE d f(FILE#) 二進制代碼 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做或運算 IORWF f,d W∨f→d Z 2,4 0001 01df ffff 14f W和f做與運算 ANDWF f,d W∧f→d Z 2,4 0001 10df ffff 18f W和f做異或運算 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取補 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#) 二進制代碼 HEX 名稱 助記符,操作數(shù) 操作 狀態(tài)影響 注 0100 bbbf ffff 4bf 清除f的位b BCF f,b 0→f(b) Z 2,4 0101 bbbf ffff 5bf 設置f的位b BSF f,b 1→f(b) Z 2,4 0110 bbbf ffff 6bf 測試f的位b,為0則跳 BTFSC f,b Test bit(b) in file(f):Skip if clear Z 0111 bbbf ffff 7bf 測試f的位b,為0則跳 BTFSS f,b Test bit(b) in file(f):Skip if clear Z 常數(shù)操作和控制操作類指令 (11-8) (7-0) OPCODE k(LITERAL) 二進制代碼 HEX 名稱 助記符,操作數(shù) 操作 狀態(tài)影響 注 0000 0000 0010 002 寫OPTION寄存器 OPTION - W→OPTION register 無 0000 0000 0011 003 進入睡眠狀態(tài) SLEEP - 0→WDT,stop oscillator TO,PD 0000 0000 0100 004 清除WDT計時器 CLRWDT - 0→WDT(and prescaler,if assigned) TO,PD 0000 0000 0fff 00f 設置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 調用子程序 CALL k PC+1→Stack,K→PC 無 1 101k kkkk kkkk Akk 跳轉(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做或運算 IORLW k k∨W→W Z 1110 kkkk kkkk Ekk 常數(shù)和W做與運算 ANDLW k k∧W→W Z 1111 kkkk kkkk Fkk 常數(shù)和W做異或運算 XORLW k k○W→W Z 表2.1 PIC12C5XX 指令集 注:1、除GOTO指令外,任何有關寫PC(F2)的指令(例如 CALL、MOVWF 2)都將會把PC寄存器的第9位清零。
2、若對I/O口寄存器進行操作,如“SUBWF 6,1”,則使用的F6的值是當前GP口上的狀態(tài)值,而非GP口輸出鎖存器里的值。
3、指令“TRIS 6”將W寄存器中的內容寫入GP的I/O口控制寄存器中:“1”關斷對應端口的輸出緩沖器,使其為輸入(高阻)狀態(tài),“0”則使其為輸出態(tài)。
4、當預分頻器(Prescaler)分配給TIMER0后,任何對TMR0寄存器(F1)寫操作的指令都將使預分頻器清零。
§2.2 PIC12C5XX 指令尋址方式
PIC12C5XX單片機尋址方式根據(jù)操作數(shù)的來源,可分為寄存器間接尋址、立即數(shù)尋址、直接尋址和位尋址四種。
一、寄存器間接尋址
這種尋址方式通過寄存器F0(INDF)、F4(FSR)來實現(xiàn)。實際的寄存器地址放在FSR中,通過INDF來進行間接尋址。
例: 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寄存器。間址尋址方式主要用于編寫查表、寫表程序,非常方便。請參考§2.7程序設計技巧。
二、立即數(shù)尋址
這種方式就是操作數(shù)為立即數(shù),可直接從指令中獲取。
例: MOVLW 16H ; 16H →W
三、直接尋址
這種方式是對任何一寄存器直接尋址訪問。對PIC12C508,寄存器地址(5位)直接包括在指令中,對PIC12C509,寄存器地址中最高1位由FSR(F4)寄存器中的bit5決定,即體選位。
例: MOVWF 8 ; W→F8寄存器 MOVF 8,W ; F8→W
四、位尋址
這種尋址方式是對寄存器中的任一位(bit)進行操作。
例: BSF 11,0 ; 把F11的第0位置為“1”。
§2.3 面向字節(jié)操作類指令
這類指令共有18條,包括有數(shù)據(jù)傳送、算術和邏輯運算、數(shù)據(jù)移位和交換等操作。它們的操作都是在W數(shù)據(jù)寄存器f之間進行,其指令碼結構為:
(11—6) (5) (4—0) OPCODE d f(File#)
高6位是指令操作碼。第6位d是方向位。d=1,則操作結果存入f(數(shù)據(jù)寄存器),d=0,則操作結果存入W。低5位是數(shù)據(jù)寄存器地址,可選中32個寄存器。對于PIC12C509,則還要參考寄存器體選擇器FSR的bit5選擇存入哪一個寄存器體(bank0或bank1)。
1、寄存器加法指令 格式: ADDWF f,d
指令碼: 000111 d fffff 指令周期: 1
操作: W+f→d 影響狀態(tài)位: C,DC,Z 說明: 將f寄存器和w相加,結果存入f(d=1)或W(d=0)。 例: ADDWF 8,0 ; F8+W→W ───────────────────────────────── 2、寄存器與指令 格式: ANDWF f,d
指令碼: 000101 d fffff &nbs