单片机关键字sfr和sbit的理解

来源:互联网 发布:链家端口费是每个月吗? 编辑:程序博客网 时间:2024/04/29 15:59
在单片机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才是一个常量指针,而其他指针都是变量;

0 0
原创粉丝点击