微控制器關鍵字sfr和sbit的理解
阿新 • • 發佈:2019-02-09
在微控制器C語言程式設計中,擴充了兩個關鍵字sfr和sbit。
sfr(Special Function Register特殊功能暫存器的縮寫),sbit(特殊功能暫存器位),與定義一般的int、char型變數不同,這兩個字定義的並不是變數,而作為特殊功能暫存器的引用,或許可以叫做別名。
sfr(Special Function Register特殊功能暫存器的縮寫),sbit(特殊功能暫存器位),與定義一般的int、char型變數不同,這兩個字定義的並不是變數,而作為特殊功能暫存器的引用,或許可以叫做別名。
微控制器標頭檔案<reg51.h>中定義了21個特殊功能暫存器,並且都是8位暫存器,而部分暫存器的每個位又用sbit進行了定義:
sfr是定義一個8位的暫存器,sbit是定義位暫存器,個人認為可以把這種定義理解為定義一個常量指標始終指向0x80這個特殊暫存器,即如下定義方法;sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0; sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0; sfr SP = 0x81; sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8; sfr IP = 0xB8; sfr SCON = 0x98; sfr SBUF = 0x99;
const unsigned char *PP = 0x80;
當然,這種定義方法不完全符合上面的說法,而且*PP被限制了寫操作的,即PP所指向的地址被認定為常量,而PP任然是個變數,事實上除了使用sfr和sbit進行定義外,其他定義方式被認為是不安全的而被限制了寫入操作。最後發現定義指標的時候只有定義陣列時:char a[];
地址指標a才是一個常量指標,而其他指標都是變數;