位尋址和不可位尋址


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM