PIC單片機(jī)人機(jī)接口模塊元器件選擇說明
PIC16C5X提供二級堆棧(Stack),所以子程序調(diào)用只有兩層,使用時一定要注意這點(diǎn),否則程序運(yùn)行時將失去控制。PICIGC5X內(nèi)部有384bit~2KB的只讀程序存儲器,下面介紹其結(jié)構(gòu)和堆棧,PICIGC5X程序存儲器結(jié)構(gòu)如圖3所示。
圖3 PIC16C5X程序存儲器結(jié)構(gòu)
從圖3可以看出,PIC程序存儲器采用分頁結(jié)構(gòu),每頁長0.5KB,因此PIC16C52程序存儲器在1頁之內(nèi),而PIC16C54和PICISC55程序存儲器容量為1頁,PICI6C56和PICI6C57的容量則分別為2頁和4頁。頁面地址由狀態(tài)寄存器B的第5位和第6位(PA0、PA1)確定。
程序轉(zhuǎn)移時,在本頁內(nèi)可直接進(jìn)行,在需跨頁跳轉(zhuǎn)時(GOTO、CALL指令),則必須根據(jù)將要跳轉(zhuǎn)去的頁面,把f3中的PA0、PA1位置成相應(yīng)的值。
?。?)相關(guān)指令。
堆棧PICIGC5X設(shè)有兩層堆棧,堆棧1和堆棧2,供子程序調(diào)用。涉及堆棧操作的指令有兩條。
?、貱ALL。
在主程序中第一次執(zhí)行CALL指令時,將PC值加1后推入堆棧1,堆棧1原有的內(nèi)容則被推入堆棧2中。這時子程序中還可再做一次子程序嵌套,即再執(zhí)行一次CALL指令。如果子程序調(diào)用多于二層時,堆棧中只存放最近的兩個返回地址。
當(dāng)執(zhí)行一條CALL指令時,狀態(tài)寄存器F3中將頁面尋址位PA1、PA0置入PC的最高兩位(第11位和第10位),而PC的第9位總是被置為0,如圖4所示。
圖4 PC值對應(yīng)圖
這意味著在PIC16C5X中,子程序起始地址只能放在每個程序存儲頁面的上半頁,即低地址的那一半(000~0FF、200~2FF、400~4FF、600~6FF)。
調(diào)用子程序前必須先把F3中的PA0、PA1設(shè)置成該子程序所在的頁面地址,返回后再將其恢復(fù)成當(dāng)前的頁面值,但如果這時子程序是在同一頁面,則可省去這一過程。
?、赗ETLW。
該指令把堆棧1的值寫入PC,同時還把堆棧2的值拷貝到堆棧1去。子程序總是返回到調(diào)用它時所在的位置,不管它處在什么頁面,也不管F3寄存器中的PA0、PA1此時指在什么頁面。
但是執(zhí)行RETLW(子程序返回)指令并不會改變F3中PA0、PA1的值,所以當(dāng)從一次跨頁面的子程序調(diào)用返回時,不要忘了恢復(fù)F3中原先PA0和PA1值。
由于堆棧和PC的寬度是相同的,所以可以在程序的任何位置執(zhí)行一條CALL指令來調(diào)用子程序。但是對于跨頁面的調(diào)用,要小心處理B中的頁面地址位PA0和PA1。
評論