找回密码
 立即注册
查看: 577|回复: 10

51寄存器地址操作相关

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-10-10 20:02:45

1

主题

2

回帖

21

积分

新手上路

积分
21
发表于 2024-10-8 23:36:51 | 显示全部楼层 |阅读模式

硬件上P2接口全部接了LED灯。如下图:
截图202410082332326951.jpg

51的头文件里面写了

sfr P2 = 0XA0;
main 函数里写P2=0X0;结果LED灯全亮。这是正常情况。
问题:
我不用这个头文件,想直接去操作0XA0这个寄存器地址来控制LED灯的亮灭,如下定义:
#define LED *((volatile unsigned char *)0XA0)

然后写 LED = 0X00;
结果没法控制LED,似乎这个寄存器内容设置没成功?还是什么其他原因?我不太理解为什么,请求各位大佬帮忙解答一下。非常感谢~

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-10-9 00:39:52 | 显示全部楼层
端口对应的寄存器SFR为特殊寄存器,只能直接寻址,也就是使用sfr关键词定义寄存器名称
你可以
sfr LED = 0xa0;
然后
LED = 0x00;
控制LED
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-10-9 00:59:02 | 显示全部楼层
必须声明SFR
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:265
  • 最近打卡:2025-05-01 07:25:06

0

主题

206

回帖

1522

积分

金牌会员

积分
1522
发表于 2024-10-9 07:00:19 | 显示全部楼层
让我想起,冲哥视频的内容了。实施声明SFR,好像是必须的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:413
  • 最近打卡:2025-05-01 08:31:52

5

主题

296

回帖

2030

积分

金牌会员

积分
2030
发表于 2024-10-9 08:21:06 | 显示全部楼层
本帖最后由 lzl1okOK 于 2024-10-9 08:22 编辑

和寻址方式有关,扩展的特殊功能寄存器可以,不是扩展的只能直接访问
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2024-10-9 08:31:51 | 显示全部楼层
sfr是必须的,这部分属于特殊寄存器。
你想要使用LED=0x00进行控制的话
可以使用#define LED P2 这样子实现
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-10-10 20:02:45

1

主题

2

回帖

21

积分

新手上路

积分
21
发表于 2024-10-9 18:52:48 | 显示全部楼层
王*** 发表于 2024-10-9 08:31
sfr是必须的,这部分属于特殊寄存器。
你想要使用LED=0x00进行控制的话
可以使用#define LED P2 这样子实现 ...

意思是这个特殊寄存器没办法通过寄存器地址映射,也就是我上面说的方法访问吗?这是为啥呢,51这样做的目的是啥,ARM单片机就是可以这样访问寄存器的。谢谢。

点评

因为sfr操作的区域和普通ram区域是重合的,但是功能不一样。 keil中就通过这个标识符区别  详情 回复 发表于 2024-10-9 18:55
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2024-10-9 18:55:49 | 显示全部楼层
本帖最后由 王昱顺 于 2024-10-9 19:02 编辑
wan*** 发表于 2024-10-9 18:52
意思是这个特殊寄存器没办法通过寄存器地址映射,也就是我上面说的方法访问吗?这是为啥呢,51这样做的目 ...

因为sfr操作的地址区域和普通ram地址区域是重合的,但是功能不一样。
keil中就通过这个标识符区别
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-10-10 20:02:45

1

主题

2

回帖

21

积分

新手上路

积分
21
发表于 2024-10-9 18:55:56 | 显示全部楼层
谢谢大家热情的回复,看上去意思是这个特殊寄存器只能用sfr寻址。我就还有点不太明白为什么这样设计,因为ARM的单片机可以寄存器寻址来控制I/O。谢谢。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-10-10 16:05:31 | 显示全部楼层
王*** 发表于 2024-10-9 18:55
因为sfr操作的地址区域和普通ram地址区域是重合的,但是功能不一样。
keil中就通过这个标识符区别 ...

感觉sfr应该是8051设计的时候就已经是这样定义了,sdcc同样也是sfr只是sdcc是__sfr,这个应该是告诉编译器的,和内核有关吧。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:30 , Processed in 0.149178 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表