本帖最后由 zl2168 于 2016-9-23 20:58 編輯
⒍ 位變量定義方式
80C51片內RAM有16字節(jié)128位的可尋址位(字節(jié)地址20H~2FH,位地址00H~7FH),還有11個特殊功能寄存器是可位尋址的,C51編譯器擴充了關鍵詞bit和sbit,用于定義這些可尋址位。位變量也需先定義,后使用。
⑴ 定義128位可尋址位的位變量
bit 位變量名
例如:
bit u,v; //定義位變量u,v 。
C51編譯器將自動為其在位尋址區(qū)安排一個位地址(1bit)。
對于表4-5中已經(jīng)按存儲器類型bdata定位的字節(jié),其每一可尋址位,可按如下方法定義:
unsigned char bdata flag; //定義字符型變量flag,存儲器類型bdata
bit f0=flag^0; //定義位標識符f0,為flag第0位
bit f1=flag^1; //定義位標識符f1,為flag第1位
上述第一條語句先定義了一個字符型變量flag,存儲器類型bdata,C51編譯器將自動為其在片內RAM位尋址區(qū)(20H~2FH)安排一個字節(jié)(8bit),第2、3條語句則分別定義f0、f1為該字節(jié)第0、1位的位標識符。注意,“^”不是運算符,僅指明其位置,相當于匯編中的“.”。
⑵ 定義11個特殊功能寄存器可尋址位的位變量
80C51單片機11個可尋址位的特殊功能寄存器中,有6個SFR(PSW、TCON、SCON、IE、IP和P3),它們每一可尋址位有位定義名稱,C51庫函數(shù)reg51.h也已對其按MCS-51中取的位定義名稱(必須大寫)全部作了定義,并賦予了既定的位地址。只要在頭文件中聲明包含庫函數(shù)reg51.h,就可按位定義名稱直接引用。但是,還有5個SFR(ACC、B、P0、P1和P2),可尋址位沒有專用的位定義名稱,只有位編號,但這些位編號不符合ANSI C標識符要求,例如,ACC.0、P1.0等(C51標識符規(guī)定不可用小數(shù)點),應重新定義。其格式如下:
sbit 位變量名=位地址常數(shù)
其中,位地址常數(shù)必須是該位變量既定的真實位地址。例如:
sbit P10=0x90; //定義位標識符P10,位地址為90H(P1.0)
sbit P10= 0x90^0; //定義位標識符P10,為90H(P1口)第0位
sbit P10= P1^0; //定義位標識符P10,為P1口第0位
上述第1條語句是直接用P1.0的位地址,第2條語句是用P1口的字節(jié)地址加位編號,第3條語句是用P1口特殊功能寄存器名加位編號。
需要說明的是,若用戶不按既定的位定義名稱引用6個SFR中的可尋址位,另起位變量名,則也須對其重新定義。雖然C51允許用關鍵詞sbit定義這些位變量,體現(xiàn)了C51編譯功能的多樣性和完整性,但編者還是建議讀者不要去重新定義6個SFR中的可尋址位,而直接使用預處理命令,既省事又不易出錯。
需要指出的是,使用sbit定義11個特殊功能寄存器可尋址位的位變量,因其具有不變的真實地址,屬于全局變量,應放在主函數(shù)之前(參閱例4-6)。
需要注意的是,不要混淆bit與sbit的區(qū)別。bit用于普通位變量,而sbit位用于特殊功能寄存器中可位尋址的位變量(有既定位地址)。
以上摘自張志良編著 《80C51單片機實用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9
書中電路和程序設計有詳細說明,程序語句條條有注解。
|