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