永发信息网

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

答案:4  悬赏:30  手机版
解决时间 2021-04-02 22:40
  • 提问者网友:眉目添风霜
  • 2021-04-02 15:15
C语言中,如何定义单片机的寄存器
最佳答案
  • 五星知识达人网友:酒者煙囻
  • 2021-04-02 16:20
位地址在汇编语言中,只能直接寻址,不支持间接寻址。那么,在 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楼网友:妄饮晩冬酒
  • 2021-04-02 19:13
你要干嘛 ?
go 0080
mov XXXX
  • 2楼网友:春色三分
  • 2021-04-02 18:00
这个问题阁下可以仔细看一看keil c51使用方法,尤其是absacc.h、reg51.h这两个头文件。
reg51.h头文件里已经包括的常用的特殊功能寄存器的定义,在使用时把它包括进去就行了。
例如:C文件里加了#include
程序里就可以直接写:P0=0x43;这样的语句。
对于一般的寄存器,要在前面加上:#include,
要注意这些关键字的含义:
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开始
但是在具体使用时还有一些要求和限制,这个阁下自己看资料吧。
  • 3楼网友:未来江山和你
  • 2021-04-02 16:53
#define reg_name 0x0080 //前面定义寄存器名称
....
...
...
#define name((pointer_type *) reg_name )//后面变成指针方便使用
根据需要看是否需要加volatile~~~
还要看你用什么样的编译器~~~
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯