能讓匯編轉(zhuǎn)到C51的初學(xué)者有更清晰的認(rèn)識的一篇文章
在單一模組內(nèi)可以使用下面的語法宣告
[memory_space]typevariable_name_at_location
範(fàn)例
pdatacharmy_pdata_at_0x80;
如果該變數(shù)必須為多個模組所使用(GlobalVariable)則以
抽象指標(biāo)(AbstractPointer)的方式在標(biāo)頭檔(HeaderFile)定義較為方便。
#definevariable_name*((data_type*)location)
範(fàn)例
#definemy_pdata*((charpdata*)0x80)
(注意char與pdata的順序)
ABSACC.H提供了下列方便的巨集(Macro)定義。
#defineCBYTE((unsignedcharvolatilecode*)0)
#defineDBYTE((unsignedcharvolatiledata*)0)
#definePBYTE((unsignedcharvolatilepdata*)0)
#defineXBYTE((unsignedcharvolatilexdata*)0)
#defineCWORD((unsignedintvolatilecode*)0)
#defineDWORD((unsignedintvolatiledata*)0)
#definePWORD((unsignedintvolatilepdata*)0)
#defineXWORD((unsignedintvolatilexdata*)0)
隱藏的初始化程序
80C51在電源重置後(PowerOnReset)所執(zhí)行的第一個程式模組並不是使用者的主程式
main(),而是一個隱藏在KEIL-C51標(biāo)準(zhǔn)程式庫中稱為startup.a51的程式模組。
startup.a51的主要工作是把包含idata、xdata、pdata在內(nèi)的記憶體區(qū)塊清除為0,並
且初始化遞迴指標(biāo)。接著startup.a51被執(zhí)行的仍然是一個隱藏在KEIL-C51標(biāo)準(zhǔn)程式庫
中稱為init.a51的程式模組。而init.a51的主要工作則是初始化具有非零初始值設(shè)定的
變數(shù)。
在完成上述的初始化程序之後,80C51的控制權(quán)才會交給main()開始執(zhí)行使用者的程式。
研究在C51Lib目錄下相關(guān)模組的組合語言程式碼,使用者將會對KEIL-C51的架構(gòu)有進
一步的了解,同時更能掌握不同的高階應(yīng)用技巧。
程式範(fàn)例
軟體模擬的SingleMasterI2C介面程式:C51-I2C.C
暫存器庫(RegisterBank)切換的應(yīng)用
暫存器庫(RegisterBank)切換的最大應(yīng)用是在中斷程序的處理。一般的軟體設(shè)計會在程
式進入中斷之後,利用切換暫存器庫的方式保持主程式R0~R7暫存器的內(nèi)容,不受中斷
程序的影響而改變。
評論