位地址在汇编语言中,只能直接寻址,不支持间接寻址。那么,在 C 语言中,也就不能用指针来操作。所以不能定义单片机的寄存器。
访问寄存器可以通过直接地址引用来完成。
例如52单片机的寄存器有4组,分别为00H-07H,08H-0FH,10H-17H,18H-1FH,各组均8字节,要结合程序状态字寄存器PSW(D0H)中的RS0,RS1的组合来确定是哪一组。
可以定义一个访问Rn的函数
typedef unsigned char ucharuchar dacRn(uchar n) //n=[0..7]
{
uchar data *p
n += (PSW & 0x18) //PSW 7:CY 6:AC 5:F0 4:RS1 3:RS0 2:OV 1:F1 0:P
//本来要右移三位变为0-3,但由于是8个一组要乘以8(左移3位),所以直接加上寄存器编号就可以了
return *(uchar data *)n
}
KeilC51中定义寄存器变量的方法如下:1、特殊功能寄存器的定义:
sfr和sfr16,比如:
sfr P1=0x90
sfr16 T2=0xcc
2、普通寄存器变量定义:
使用DBYTE和XBYTE来实现,比如
unsigned char temp=XBYTE[0x1000]//这是访问外部地址的语句,也可以是外部IO口地址
unsigned char temp=DBYTE[0x40]//这是将内部寄存器40H定义为变量temp