51寄存器地址操作相关
硬件上P2接口全部接了LED灯。如下图:
51的头文件里面写了
sfr P2 = 0XA0;
main 函数里写P2=0X0;结果LED灯全亮。这是正常情况。
问题:
我不用这个头文件,想直接去操作0XA0这个寄存器地址来控制LED灯的亮灭,如下定义:
#define LED *((volatile unsigned char *)0XA0)
然后写 LED = 0X00;
结果没法控制LED,似乎这个寄存器内容设置没成功?还是什么其他原因?我不太理解为什么,请求各位大佬帮忙解答一下。非常感谢~
端口对应的寄存器SFR为特殊寄存器,只能直接寻址,也就是使用sfr关键词定义寄存器名称
你可以
sfr LED = 0xa0;
然后
LED = 0x00;
控制LED 必须声明SFR 让我想起,冲哥视频的内容了。实施声明SFR,好像是必须的。 本帖最后由 lzl1okOK 于 2024-10-9 08:22 编辑
和寻址方式有关,扩展的特殊功能寄存器可以,不是扩展的只能直接访问 sfr是必须的,这部分属于特殊寄存器。
你想要使用LED=0x00进行控制的话
可以使用#define LED P2 这样子实现 王昱顺 发表于 2024-10-9 08:31
sfr是必须的,这部分属于特殊寄存器。
你想要使用LED=0x00进行控制的话
可以使用#define LED P2 这样子实现 ...
意思是这个特殊寄存器没办法通过寄存器地址映射,也就是我上面说的方法访问吗?这是为啥呢,51这样做的目的是啥,ARM单片机就是可以这样访问寄存器的。谢谢。 本帖最后由 王昱顺 于 2024-10-9 19:02 编辑
wangh 发表于 2024-10-9 18:52
意思是这个特殊寄存器没办法通过寄存器地址映射,也就是我上面说的方法访问吗?这是为啥呢,51这样做的目 ...
因为sfr操作的地址区域和普通ram地址区域是重合的,但是功能不一样。
keil中就通过这个标识符区别 谢谢大家热情的回复,看上去意思是这个特殊寄存器只能用sfr寻址。我就还有点不太明白为什么这样设计,因为ARM的单片机可以寄存器寻址来控制I/O。谢谢。 王昱顺 发表于 2024-10-9 18:55
因为sfr操作的地址区域和普通ram地址区域是重合的,但是功能不一样。
keil中就通过这个标识符区别 ...
感觉sfr应该是8051设计的时候就已经是这样定义了,sdcc同样也是sfr只是sdcc是__sfr,这个应该是告诉编译器的,和内核有关吧。
页:
[1]
2