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



堆棧
評論