1. 程式人生 > >微控制器關鍵字sfr和sbit的理解

微控制器關鍵字sfr和sbit的理解

在微控制器C語言程式設計中,擴充了兩個關鍵字sfr和sbit。
sfr(Special Function Register特殊功能暫存器的縮寫),sbit(特殊功能暫存器位),與定義一般的int、char型變數不同,這兩個字定義的並不是變數,而作為特殊功能暫存器的引用,或許可以叫做別名。

微控制器標頭檔案<reg51.h>中定義了21個特殊功能暫存器,並且都是8位暫存器,而部分暫存器的每個位又用sbit進行了定義:

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;
sfr是定義一個8位的暫存器,sbit是定義位暫存器,個人認為可以把這種定義理解為定義一個常量指標始終指向0x80這個特殊暫存器,即如下定義方法;
const unsigned char *PP = 0x80;
當然,這種定義方法不完全符合上面的說法,而且*PP被限制了寫操作的,即PP所指向的地址被認定為常量,而PP任然是個變數,事實上除了使用sfr和sbit進行定義外,其他定義方式被認為是不安全的而被限制了寫入操作。最後發現定義指標的時候只有定義陣列時:
char a[];
地址指標a才是一個常量指標,而其他指標都是變數;