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