C语言中,如何定义单片机的寄存器

例如已知寄存器的地址为0080H,C语言中如何操作这个寄存器。

    位地址在汇编语言中,只能直接寻址,不支持间接寻址。那么,在 C 语言中,也就不能用指针来操作。所以不能定义单片机的寄存器。

    访问寄存器可以通过直接地址引用来完成。
    例如52单片机的寄存器有4组,分别为00H-07H,08H-0FH,10H-17H,18H-1FH,各组均8字节,要结合程序状态字寄存器PSW(D0H)中的RS0,RS1的组合来确定是哪一组。
    可以定义一个访问Rn的函数

    typedef unsigned char uchar;
    uchar 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;
    }

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-01-02
这个问题阁下可以仔细看一看keil c51使用方法,尤其是absacc.h、reg51.h这两个头文件。

reg51.h头文件里已经包括的常用的特殊功能寄存器的定义,在使用时把它包括进去就行了。
例如:C文件里加了#include<reg51.h>,
程序里就可以直接写:P0=0x43;这样的语句。

对于一般的寄存器,要在前面加上:#include<absacc.h>,
要注意这些关键字的含义:
CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD
分别代表:程序区、片外数据区、可分页数据区、片内数据区....

使用时可以这样定义:
#define ASW XBYTE[0x8012]
#define ASR DBYTE[0x0032]

ASW就代表片外数据存储区 ,地址是0x8012;
ASR就代表片内数据存储区 ,地址是0x0032;

另外:用_at_关键字
idata ASW _at_ 0x40;指定list结构从40h开始。
xdata char text[25b] _at_0xE000;指定text数组从0E000H开始

但是在具体使用时还有一些要求和限制,这个阁下自己看资料吧。
第2个回答  2010-01-02
#define reg_name 0x0080 //前面定义寄存器名称
....
...
...
#define name((pointer_type *) reg_name )//后面变成指针方便使用

根据需要看是否需要加volatile~~~

还要看你用什么样的编译器~~~本回答被提问者采纳
第3个回答  2010-01-02
你要干嘛 ?
go 0080
mov XXXX
相似回答