在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 慎用51單片機(jī)中的RET指令

            慎用51單片機(jī)中的RET指令

            作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
            題目:已知有四個按鍵依次連接單片機(jī)中的P3口的0到3的IO口,有四個LED燈連接P1的0到3 IO口,寫一程序,滿足以下條件:當(dāng)按下按一個按鍵,對應(yīng)的LED會發(fā)亮,比如

            按下P3.0的按鍵,連接P1.0的LED就發(fā)亮。y

            本文引用地址:http://www.biyoush.com/article/201611/318611.htm

            以下是我同學(xué)編寫的程序:

            org 0000h
            mov P1,#0ffh
            loop:
            jnb P3.0,led1;*
            jnb P3.1,led2;*
            jnb P3.2,led3;*
            jnb P3.3,led4;*
            ljmp loop
            led1:
            clr P1.0
            ret
            led2:
            clr P1.1
            ret
            led3:
            clr P1.2
            ret
            led4:
            clr P1.3
            ret
            end

            程序的意圖是,制造一個死循環(huán),不斷檢查按鍵是否按下,如果按下,就令對應(yīng)的燈亮。程序經(jīng)過測試,能夠滿足題目的要求。

            但是,問題出現(xiàn)在上面帶*號的那一部分代碼,程序意圖是想要當(dāng)P3的某個位為0的時候,就調(diào)用LED燈的子程序,執(zhí)行CLR P1.0語句,再返回到原來程序調(diào)用子程序的地方繼續(xù)執(zhí)行代碼。

            我對的子程序的理解是:在一個地方啟動一段代碼,當(dāng)這段代碼運(yùn)行完畢之后,就返回到原來的地方繼續(xù)運(yùn)行剩下的代碼。

            那么CPU單片機(jī)是如何返回原來的地址的呢?

            首先,當(dāng)程序執(zhí)行到A處進(jìn)入子程序時,將A的下一個條指令(即PC+2所指的地方)壓入棧中,即將棧指針SP+1,PCL進(jìn)棧,SP再加1,PCH進(jìn)棧。

            然后,把PC的值改為子程序代碼的入口。

            子程序執(zhí)行完畢之后,從棧中彈出原來的PC值,賦值給當(dāng)前的PC寄存器。


            最后,程序返回到原來調(diào)用子程序的地方的下一條指令繼續(xù)運(yùn)行。

            (詳細(xì)步驟請查看RET和ACALL,LCALL指令)

            上面的代碼很明顯想調(diào)用一個子程序,但是51單片機(jī)中,只有ACALL和LCALL指令會在跳轉(zhuǎn)前講PC+2值壓棧,其他跳轉(zhuǎn)指令都不會。

            代碼中使用了JNB作為跳轉(zhuǎn)指令,所以并沒有壓棧,但是當(dāng)跳轉(zhuǎn)之后遇到RET,還是一如既往地彈棧,這樣,只有出,沒有進(jìn),會導(dǎo)致堆棧不平衡。

            但為什么這個程序依然有效呢?

            這個因為SP初始指針指向了一個空白的單元(全是0),所以,當(dāng)遇到RET后,把PC寄存器給初始化,程序由頭開始重新執(zhí)行,陰差陽錯地滿足的題目的要求。

            所以RET指令必須和ACALL和LCALL配套使用,才能組成為真正意義上的子程序



            關(guān)鍵詞: 51單片機(jī)RET指

            評論


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

            關(guān)閉