永发信息网

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

答案:4  悬赏:30  手机版
解决时间 2021-04-02 22:40
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;
}
全部回答
你要干嘛 ?
go 0080
mov XXXX
这个问题阁下可以仔细看一看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开始
但是在具体使用时还有一些要求和限制,这个阁下自己看资料吧。
#define reg_name 0x0080 //前面定义寄存器名称
....
...
...
#define name((pointer_type *) reg_name )//后面变成指针方便使用
根据需要看是否需要加volatile~~~
还要看你用什么样的编译器~~~
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
老款林荫大道纯进口车能买吗
有关于核电的作文8百字
王者荣耀 黄忠开个大打主宰哪个不要命的敢进
在变压器下面,电箱旁边有黑色的细线,是高压
芝生美多少钱一盒减肥效果怎样
tpe和pp婴儿勺哪个好
多拉A梦在哪里啊,我有事要去这个地方
京山有这种女人
我与什么之间作文500字
威尼斯水城第三街区怎么样?好不好?值不值得
路边电信和联通的铁箱子那个是什么有没有辐射
谁知道我们江苏宿迁马姓的由来
下列各句中划线的成语使用不恰当的一项是A.囊
我问一下,我的羊得羊温了,怎么办
写给异性朋友的感恩信
推荐资讯
不思议迷宫废弃的兵工厂2怎么打 废弃的兵工厂
一个老人拄着拐棍看着风吹蜡烛成语
u盘供电不足怎么办?
常艳梅1978年7月2日陕西梅县人
怎样去除新车里的异味
请举例说明“零税率”和“免税”的区别是什么
o7年丰田威施行程18万多公里价值多少
跪求求支付宝帐号
3分之5x15分之2+6分之1 4.8x(6分之1十12分之1
我就纳闷了,为什么印度人总爱整些毫无意
我从我的雇主处获得了一个永久性工作职位承诺
余姚春天旅行社搬到哪里了
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?