#include
sbit P0_0 = P0^0; // 定義P0第0個(gè)管腳
sbit P0_1 = 0x81;// 定義P0第1個(gè)管腳
sbit P0_2 = 0x80^2; // 定義P0第2個(gè)管腳
void main()
{
P0_0 = 0; // 點(diǎn)亮P0第1管腳連接的LED
P0_1 = 0;
P0_2 = 0;
}
為什么用三種方式設(shè)置引腳都可以呢,這是因?yàn)镻0口可以按位尋址,STC單片機(jī)的特殊功能寄存器布局如下:
從上圖可以看到,P0口是處在可位尋址區(qū),可位尋址的特性就是這樣,以sbit P0_1 = 0x81代碼為例
sbit關(guān)鍵字指定了后面的變量是要位尋址,賦值P0_1 = 0x81,系統(tǒng)會找到寄存器地址0x80,然后再找對應(yīng)的位,同理,SCON對應(yīng)的地址是0x98也是處在可位尋址,也是可以直接賦值位,如下代碼
#include
sbit P0_0 = P0^0; // 定義P0第0個(gè)管腳
sbit P0_1 = 0x81;// 定義P0第1個(gè)管腳
sbit P0_2 = 0x80^2; // 定義P0第2個(gè)管腳
sbit TCON_0 = TCON^0;
sbit TCON_1 = 0x89;
void main()
{
P0_0 = 0; // 點(diǎn)亮P0第1管腳連接的LED
P0_1 = 0;
P0_2 = 0;
TCON_0 = 0;
TCON_1 = 0;
}
細(xì)心的朋友會發(fā)現(xiàn),在reg52.h中定義了 sfr SP = 0x81;那么,為什么代碼中sbit P0_1 = 0x81和sfr SP = 0x81不沖突呢,這不是sfr和sbit關(guān)鍵字的區(qū)別了,系統(tǒng)會自動根據(jù)不同的關(guān)鍵字處理不同的操作,舉個(gè)簡單的例子,你和鄰居家都有8個(gè)柜子,你家的門牌號是0x80,鄰居家的是0x81
sbit P0_1 = 0x81就好比是先找到你家的地址0x80,再找到你家的第一個(gè)柜子的位置,即0x80 + 0x01 = 0x81,而sfr SP = 0x81則僅僅是只到鄰居家的地址;
有了上面的理解,我們可以在代碼里驗(yàn)證一下,當(dāng)增加代碼sbit SP_0 = SP^0; 后編譯 提示 light.c(8): error C146: 'SP': invalid base address,根本就編譯不過去,也就是說,系統(tǒng)不可位尋址區(qū)是不能按位訪問的,
#include
sbit P0_0 = P0^0;// 定義P0管腳1
sbit P0_1 = 0x81;// reg52.h中定義了 sfr SP = 0x81;
sbit P0_2 = 0x80^2;
sbit TCON_0 = TCON^0;
sbit TCON_1 = 0x89;
//sbit SP_0 = SP^0; // 提示 light.c(8): error C146: 'SP': invalid base address
void main()
{
P0_0 = 0; // 點(diǎn)亮P0第1管腳連接的LED
P0_1 = 0;
P0_2 = 0;
TCON_0 = 0;
TCON_1 = 0;
SP = 0x81; // 可以給SP直接賦值 這時(shí)SP地址中的數(shù)據(jù)是0x81
}
要點(diǎn):
1.位尋址可以直接操作地址中的某一個(gè)位中的數(shù)據(jù)