CPU和外設(shè)使用專用寄存器以控制器件的操作。專用寄存是靜態(tài)RAM。下面介紹幾個重要的專用寄存器
?、贍顟B(tài)寄存器
狀態(tài)寄存器包含有ALU(復(fù)術(shù)邏輯運算單元)的算術(shù)狀態(tài),復(fù)位狀態(tài)和對數(shù)據(jù)存儲器的塊選擇,與任何寄存器一樣,狀態(tài)寄存器可以作為任何指令的目的寄存器。如果狀態(tài)寄存器作為某指令的目的寄存器 ,而那條指令要影響Z、DC,C位的狀態(tài),則禁止寫這三位。圖4-4是 狀態(tài)寄存器及其狀態(tài)。
R/W R/W R/W R R R/W R/W R/W
IRP RP1 RP0 TO PD Z DC C bit7 bit0
其中C是進(jìn)位位,對ADDWF和ADDLW指令,當(dāng)這一位為1,表示指令 運算的結(jié)果的最高有效位產(chǎn)生了進(jìn)位輸出。減法指令執(zhí)行的是加第二 操作數(shù)的新碼。對于循環(huán)指令(RRF,RLF),這一位即可以來自于源寄存器的高位,也可以來自于低位。如果這一位為0,表明結(jié)果的最高有效位沒有產(chǎn)生進(jìn)位輸出。對于減法,這一位的極性取反。DC是數(shù)字進(jìn)位或數(shù)字借位位。當(dāng)這一位為1時,結(jié)果的D3位向D4位有進(jìn)位,否則無進(jìn)位。對于減法,這位的極性取反。Z是結(jié)果為0標(biāo)志。當(dāng)這一位為1時,表明算術(shù)運算和邏輯運算的結(jié)果為0,否則這一位為0,表明運算結(jié)果不為0。PD:低功耗位。當(dāng)這一位為1表明電源加上按正常供電或執(zhí)行了C LRWDT指令以后,這一位為0表示執(zhí)行了SLEEP指令(即器件進(jìn)入了低功 耗狀態(tài))。TO超時位。當(dāng)這一位為1時,表明電源加上,進(jìn)入了正常供電,且執(zhí)行了CLRWDT和SLEEP指令,這一位為0表明產(chǎn)生了看門狗計時器超時。
RP1:RP0,作為直接尋址的數(shù)據(jù)存儲器的塊選擇位。
RP1:RP=00狀態(tài),選擇0塊(地址00H~7FH)。
RP1:RP0=01狀態(tài),選擇1塊(地址80H~FFH)。
RP1:RP0=10選擇2塊(地址100H~17FH)。
RP1:RP0=11選擇3塊(地址180H~1FFH)。
每塊128個字節(jié),PIC16C84只使用RP0位,RP1編程時設(shè)置為0。不允許使用RP1為通用讀/寫位,這可能影響與將來產(chǎn)品的兼容性。IRP寄存器塊選擇位(作為間接尋址),當(dāng)這一位設(shè)置為0,選擇0.1塊(地址00H~FFH),當(dāng)這一位為1時,選擇2.3塊(地址100H~1FFH)。PIC16C84不使用IRP位,IRP位在編程時為0。狀態(tài)寄存器中的Z、DC,C位是根據(jù)器件的邏輯來置1或清0。而TO,PD位是不可寫入的。狀態(tài)寄存器作為目的寄存器的指令的結(jié)果將有不同的內(nèi)容。例如CLRF STATUS(清0狀態(tài)寄存器)。結(jié)果狀態(tài)寄存器的內(nèi)容為000uuluu。其中u表示不改變。只有BCF,BSF,SWAPF和MOVW F這些指令可以用來改變STATUS寄存器的內(nèi)容,因為這幾條指令不影響任何狀態(tài)位。
?、贠PTION寄存器
OPTION寄存器是可讀,可寫的寄存器,它包含了各種控制位以配 置TMRO/WDT的預(yù)分頻器,外部INT中斷,TMRO和在PORTB的微弱上拉。圖4-5是OPTION寄存器各位的功能。 R/W R/W R/W R/W R/W R/W R/ W R/W
RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0 bit7 bit0
其中PS2,PS1,PS0為預(yù)分頻器的值的選擇。(與PIC16C6X的規(guī)定 相同)。PSA位是將預(yù)分頻器分配給WDT(看門狗計時器,或TMR0)。
TOSE是為TMRO選擇跳變信號
INTEDG是為INT中斷引腳選擇跳變信號。
RBPU用來打開或關(guān)閉PORTB內(nèi)部的上拉電阻。
OPTION的所有位的定義同PIC16C6X系列。
?、跧NTCON寄存器
INTCON是可讀可寫的寄存器,它包含了各中斷源允許或禁止中斷 。圖4-6是PIC16C84的INTCON寄存器
R/W R/W R/W R/W R/W R/W R/W R/W
GIE EEIE TOIE INTE RBIF TOIF INTIF RB IF bit7 bit0
其中RBIF是RB端口改變中斷標(biāo)志位。此位為1,表明RB<7:4>輸入中至少有一位發(fā)生了改變,它必須用軟件清0這一位。否則為0,即 RB<7:4>輸入中沒有改變。 ? ? ? ? ? INTIF是外部中斷標(biāo)志位。當(dāng)這一位為1時,表明有外部中斷發(fā)生 ,它必須用軟件將其清0,否則為0,表明沒有外部中斷發(fā)生。
TOIF是TMRO溢出中斷標(biāo)志。這一位為1,表明TMRO發(fā)生了溢出,必須由軟件將這一位清0,否則為0,表明TMRO沒有溢出發(fā)生
RBIE是RB端口改變中斷的允許或禁止位,設(shè)置此位為1,允許中斷,為0禁止。
INTE是INT中斷的允許或禁止位。設(shè)置為1允許中斷方式,為0禁止 。
TOIE為TMRO溢出中斷的允許或禁止位。設(shè)置為1允許TMRO溢出中斷,否則禁止。
EEIE是EE(電可擦除)的寫完成中斷的允許與禁止位。當(dāng)設(shè)置為1時,允許EE寫完成中斷,否則禁止。
GIE是所有中斷的允許與禁止。設(shè)置為1時,允許所有不可屏蔽中斷,為0禁止。
四、PCL和PCLATH
程序計數(shù)器(PC)是13位。低字節(jié)PCL是可讀,可寫的寄存器。PC的高字節(jié)(PCH)不是直接可讀,可寫的。PCLATH(PC latch high) 是作為PC<12:8>的保持寄存器,這幾位的內(nèi)容被傳送到程序計數(shù)器 的高位。當(dāng)程序計數(shù)器在執(zhí)行CALL,GOTO或?qū)慞CL等指令時,即向PC裝入新的值。PC的高位由PCLATH裝入。
具有8個13位寬度的硬件堆棧。堆??臻g它既不是程序存儲器的一部分,也不是數(shù)據(jù)存儲器的一個部分,堆棧的指針是不可讀/寫的。當(dāng)執(zhí)行CALL指令或中斷被響應(yīng)時,整個13位的PC被壓入堆棧。在執(zhí)行RETURN,RETLW,RETFIE等指令時,堆棧被彈出。PUSH(壓入)和POP(彈出)不影響PCLATH。
堆棧是作為循環(huán)緩沖器。當(dāng)堆棧被壓入38次后,第9次壓入將占據(jù)第一次壓入的位置,第十次壓入將占據(jù)第二次壓入的位置,等等。同樣當(dāng)堆棧彈出第9次時,與第一次彈出是一樣的。注意,沒有狀態(tài)位來 指明堆棧上溢式下溢的條件。沒有PUSH,POP指令助記符,但CALL,R ETURN,RETLW,RETFIE等指令的執(zhí)行或中斷發(fā)生,將實際發(fā)生壓棧退棧。
4-2程序存儲器的頁
PIC16C84具有1K的程序存儲器,CALL,GOTO指令只有11位的地址范圍,這11位的地址范圍允許分支在2K程序存儲器頁大小的范圍。
為將來PIC16C8X程序存儲器的擴展,必須由另外兩位來說明程序 存儲器的頁。這些頁位來自于PCLATH<4:3>。當(dāng)執(zhí)行CALL、GOTO指令時,用戶必須確保這些頁位的編程等指向要求的程序存儲器的頁。
如果執(zhí)行CALL指令,整個13位被壓入堆棧。所以對于返回指令不要求 對PCLATH<4:3>位的管理。因為PC的值將會由退棧而獲得。注意:PIC16C84忽略了PCLATH<4:3>位,這些位用于程序存儲頁1,2,3(0800H-1FFFH),不可以把PIC16C84的PCLATH<4:3>位用作通用讀/寫位,這會影響將來產(chǎn)品的向上兼容。
4-3間接尋址,INDF和FSR的作用
INDF寄存器不是物理寄存器,只是被用來與FSR寄存器連接以執(zhí)行間接尋址。
使用INDF寄存器,就可以實現(xiàn)間接尋址。
使用INDF寄存器的任何指令,實際尋址數(shù)據(jù)是由文件選擇寄存器(FSR)所決定的。讀INDF自身(FSR=0),將產(chǎn)生00H。向INDF寫,結(jié)果無操作(顯然可以提供狀態(tài)位)。8位FSR寄存器同狀態(tài)寄存器STATUS<7>(IRP)組合可以得到9位地址。
然而PIC16C84是不用IRP的。使用下面的例程序,通過間接尋址清零。2OH~2FH單位。
MOVLW 20H ;初始化RAM的指針
MOVF FSR ;到FSR
NEXT CLRF INDF ;通過間接尋址清0,由FSR的內(nèi)容所指問的寄存器。
INCF FSR ;(FSR)+1→FSR
BIFSS FSR,4;當(dāng)FSR的第4位為1跳過下一條指令
GOTO NEXT ;否則入。
評論
查看更多