前面的內容,我們從傳統(tǒng)的51單片機出發(fā),從硬件的基礎上,一步步衍生出了增強型51單片機所增強的地方?,F(xiàn)在我們可以清楚地了解,增強型51單片機對比傳統(tǒng)的51單片機,增強的地方在于存儲器的擴展。而51單片機對于片內內存的尋址方式和片外內存的尋址方式有著很大的不同。因此,我們在使用C語言對增強型51單片機編程的時候,也需要按照寄存器位置的不同,采用不同的操作方式。
1、寄存器位于內部的特殊功能寄存器區(qū)
我們之前介紹傳統(tǒng)8051單片機的時候,曾經(jīng)列出了傳統(tǒng)8051單片機已經(jīng)使用的21個特殊功能寄存器,因此擴展外設寄存器的一個辦法就是利于剩余的特殊功能存儲器空間。
由于51單片機的特殊功能寄存器尋址方式只能是直接尋址,不可間接尋址,因此在C語言中無法使用指針的方式去操作這些特殊功能寄存器。因為對于C語言指針來說,它對應的匯編語言是一種間接尋址的方式?;诖?,C51在標準的C語言基礎上,衍生出了一些額外的語法,如當需要定義這些特殊功能寄存器以便于程序訪問的時候,C51加入了一個關鍵詞“sfr”,使用“sfr”關鍵詞可以將特殊功能寄存器區(qū)的地址,定義成某個變量,如“sfrP0=0x80;”,這句語句的意思就是將位于內部RAM0x80地址上的寄存器,定義成P0,由于0x80位于特殊功能寄存器區(qū),因此這個定義是完全合法的。在后面想要對P0進行操作,只需要在C語言中直接使用“P0”這個標號即可。如“P0=0xff;”。
我們可以打開傳統(tǒng)的keilC51頭文件“reg51.h”,可以發(fā)現(xiàn)這個頭文件中,將傳統(tǒng)8051的所有寄存器全部定義出來了,如圖1所示。
圖1傳統(tǒng)8051單片機的特殊功能寄存器定義
對于增強型51單片機來說,那些被排放在特殊功能寄存器區(qū)的外設控制寄存器只能使用“sfr”關鍵詞的方式去定義,如圖2所示。
圖2增強型單片機增加的資源示例
除了“sfr”關鍵詞之外,KeilC51還支持使用“sbit”關鍵詞定義特殊功能寄存器的某一位,是因為51單片機是所有單片機中唯一支持寄存器位尋址的芯片。不過為了程序方便移植到其它平臺上去,對于這些特殊的關鍵詞,還是盡可能將其限制在少量的文件中。
2、寄存器位于內部的擴展的RAM中
當內部的特殊功能寄存器區(qū)用完之后,如果想要繼續(xù)增加寄存器,那么唯一可以選擇的空間也就只有特殊功能寄存器以外的區(qū)域了。對于增強型51單片機來說,它的內存空間刨去特殊功能寄存器區(qū),還可以給其使用的空間有兩個,一個是內置RAM剩余空間,還有一個是內置的外擴RAM。
對于STC8A8K系列的芯片來說,這些寄存器被設計到了內置的外擴RAM上。因此,對于這一段內存上的寄存器,我們可以在C語言中使用常量指針的形式去定義,但是,還是需要使用C51的關鍵詞“xdata”去聲明這些地址,當然,去優(yōu)化的“volatile”關鍵詞也不能少,如圖3所示。
圖3內置外擴SRAM上寄存器的定義