PIC16C5X單片機程序存儲器
但當頁面之間跳轉(zhuǎn)(GOTO CALL指令)必須先把f3的PA0、PA1設(shè)置為相應(yīng)的頁面。需要注意的是:在系統(tǒng)復(fù)位時,程序計數(shù)器PC將指向程序存儲器最后一個頁面的最后一個單元。例如PIC16C54/55指向1FFH,PIC16C56指向3FFH,PIC16C57/58則指向7FFH。狀態(tài)寄存器f3的PA0、PA1指向零頁空間,所以程序員在編程時需要在程序存儲器底部放置一條跳轉(zhuǎn)指令,跳到程序入口。
單片機執(zhí)行程序時,程序計數(shù)器(PC)自動加1,程序操作支持直接、間接、相對尋址方式,能由測試、跳轉(zhuǎn)指令、子程序調(diào)用指令、轉(zhuǎn)移指令或把算出的地址裝入PC來實現(xiàn)程序的跳轉(zhuǎn)。片內(nèi)兩級堆棧為子程序嵌套提供服務(wù)。
堆棧 PIC16C5X系列單片機提供兩級堆棧,參考上圖。CALL指令把程序計數(shù)器加1壓入堆棧1,棧1自動壓入棧2,當多于兩級子程序調(diào)用指令執(zhí)行時,堆棧中只有存儲最近兩個返回地址,所以主程序中調(diào)用的子程序最多只能嵌套一次,當執(zhí)行一條CALL指令,PIC16C56/57/58的f3之頁面選擇位PA1、PA0被裝入程序計數(shù)器的最高兩位,第9位清“0”,也就是子程序入口地址必須位于存儲頁的低半頁000-0FF、200-2FF、400-4FF、600-6FF地址。但這里指的是子程序主體的起始位置,而子程序體是可以延伸到下半頁面的。 PIC16C56/57/58,由于程序空間分別為1k和2k,可能存在跨頁面子程序調(diào)用,所以調(diào)用子程序前須先把f3的PA1、PA0設(shè)置成該子程序所在頁面地址。誠然,如果子程序與調(diào)用程序同在一個頁面,則無需這個步驟。由于堆棧和PC的寬度是一樣的,所以可在程序的任何地方執(zhí)行CALL指令來調(diào)用子程序。當然跨頁面的調(diào)用還須考慮頁面地址PA1、PA0。 RETLW(子程序返回指令)把棧1內(nèi)容送到程序計數(shù)器PC,同時棧2內(nèi)容復(fù)制到棧1,多于兩個RETLW指令運行時,棧1只會裝入先前存在棧2的地址,對于PIC16C56/57,程序總是返回調(diào)用它的同一頁面,不管它是處在哪個頁面,也不管f3的頁面選擇位的設(shè)置狀態(tài)如何。但是執(zhí)行RETLW指令并不會改變f3中的PA1、PA0的值。w寄存器會被裝入RETLW指令中所指向的數(shù)值,即立即數(shù)。這在程序存儲器中實現(xiàn)數(shù)據(jù)查表時就非常有用。 |
評論