sbit

特殊功能寄存器的位變數

sbit是定義特殊功能寄存器的位變數。bit和sbit都是C51擴展的變數類型。典型應用是:sbit P0_0=P0^0;//即定義P0_0為P0口的第1位,以便進行位操作。bit和int char之類的差不多,只不過char=8位,bit=1位而已。都是變數,編譯器在編譯過程中分配地址。

用法


C語言里,如果直接寫P1.0,C編譯器並不能識別,而且P1.0也不是一個合法的C語言變數名,所以得給它另起一個名字,這裡起的名為P1_0,可是P1_0是不是就是P1.0呢?你這麼認為,C編譯器可不這麼認為,所以必須給它們建立聯繫,這裡使用了Keil C的關鍵字sbit來定義,sbit的用法有三種:
第一種方法:sbit位變數名=地址值
第二種方法:sbit位變數名=SFR名稱^變數位地址值
第三種方法:sbit位變數名=SFR地址值^變數位地址值
如定義PSW中的OV可以用以下三種方法:
sbit OV=0xd2 (1)說明:0xd2是OV的位地址值
sbit OV=PSW^2 (2)說明:其中PSW必須先用sfr定義好
sbit OV=0xD0^2 (3)說明:0xD0就是PSW的地址值
因此這裡用sbit P1_0=P1^0;就是定義用符號P1_0來表示P1.0引腳,如果你願意也可以起P10一類的名字,只要下面程序中也隨之更改就行了。

名詞區別


bit和sbit都是C51擴展的變數類型。
sbit要在最外面定義,就是說必須定義成外部變數.sbit定義的是SFR(特殊功能寄存器)的bit
sbit更像是類型定義,不像是變數定義。
sbit:只是說明性說明
bit可以在外部或內部定義。
bit和int char之類的差不多,只不過char=8位,bit="1位而已"。都是變數,編譯器在編譯過程中分配地址。除非你指定,否則這個地址是隨機的。這個地址是整個可定址空間,RAM+FLASH+擴展空間。bit只有0和1兩種值,意義有點像Windows下VC中的BOOL
bit是編譯器在的可定址區分配的一個位變數,是不定的,不是絕對地址目標。
所有可位定址的位都可由sbit指定,這包括可位定址區和SFR中的位。SFR中可位定址的位元組只有16個,SFR地址可以被8整除的位元組是可位定址的,其他均無法可位定址。
sbit是對應可位定址空間的一個位,可位定址區:20H~2FH。一旦用了sbit xxx=REGE^6這樣的定義,這個sbit量就確定地址了。sbit大部分是用在寄存器中的,方便對寄存器的某位進行操作的。
sbit位寄存器是可位定址的絕對地址目標,定義后編譯器是不會改變位置的。