<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > PIC16C5X單片機程序存儲器

          PIC16C5X單片機程序存儲器

          作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
          PIC16C5X系列單片機內(nèi)部有一定容量的程序存儲器和數(shù)據(jù)存儲器,程序存儲器的字節(jié)寬度為12位,用于存放用戶程序和數(shù)據(jù)表格。PIC16C52有384字節(jié)的程序存儲空間,PIC16C54/55的ROM空間為512字節(jié),PIC16C56的地址空間為1024字節(jié),PIC16C57/58則為2048個字節(jié)。PIC16C5X單片機采用的是分頁尋址方式,每頁位512字節(jié),頁面地址由狀態(tài)寄存器f3的PA0、PA1選擇。512字節(jié)的12位頁內(nèi)可直接尋址,較大的程序存儲器可通過選擇4個頁、每頁512字節(jié)頁面來尋址,如下圖所示。

          但當頁面之間跳轉(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ù)查表時就非常有用。



          關(guān)鍵詞: PIC16C5X單片機程序存儲

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();