找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 540|回复: 14
打印 上一主题 下一主题
收起左侧

为什么32的寄存器可以这样操作,而51单片机的不行

[复制链接]
跳转到指定楼层
楼主
32的是可以直接将地址强制类型转化为指针,然后再解引用,就可以直接给这个寄存器赋值操作了。
但是51的不行,不知道干嘛,





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:258566 发表于 2024-8-21 20:54 | 只看该作者
可以的,你那个括号有问题。
回复

使用道具 举报

板凳
ID:828160 发表于 2024-8-21 22:42 | 只看该作者
51用汇编也可以实现同样的效果
回复

使用道具 举报

地板
ID:161164 发表于 2024-8-22 09:23 | 只看该作者

回复

使用道具 举报

5#
ID:1091094 发表于 2024-8-22 09:45 | 只看该作者
cccc888 发表于 2024-8-21 20:54
可以的,你那个括号有问题。

那你试着不要“reg52.h"头文件,看看能不能把P1的引脚都置0。
回复

使用道具 举报

6#
ID:1034262 发表于 2024-8-22 09:58 | 只看该作者
51的寄存器只能直接寻址操作,不能用间接寻址,所以不能用指针。
回复

使用道具 举报

7#
ID:526108 发表于 2024-8-22 19:36 | 只看该作者
是因为32比较落后,没有bit功能,只能这么操作
而51就比较强大,不但能用bit赋值,也能用指针赋值
只是你没写对
回复

使用道具 举报

8#
ID:258566 发表于 2024-8-22 21:23 | 只看该作者
3038838599 发表于 2024-8-22 09:45
那你试着不要“reg52.h"头文件,看看能不能把P1的引脚都置0。

的确是这样子的,但是xdata寄存器可以这样定义,我看过别的单片机的头文件定义。
回复

使用道具 举报

9#
ID:258566 发表于 2024-8-22 21:33 | 只看该作者
又有新发现。参照别的头文件加上内存区块名



发现加了data和加idata和不加生成的汇编代码一样。这算不算??,既然支持了,就应该有区别吧。



回复

使用道具 举报

10#
ID:21455 发表于 2024-8-23 14:47 | 只看该作者
我尝试回答,不知道是否有误,请指正。
1、51特殊功能寄存器与RAM使用统一编址,如果用这种指针方式访问,编译器不知道指向哪个鬼,编译器会给出警告说:内存空间或许无效。
2、所以,51使用关键字SFR访问特殊寄存器。如:sfr   P1  = 0x90;        //P1口数据寄存器
回复

使用道具 举报

11#
ID:1091094 发表于 2024-8-24 16:08 | 只看该作者
cccc888 发表于 2024-8-22 21:23
的确是这样子的,但是xdata寄存器可以这样定义,我看过别的单片机的头文件定义。

是的 我也是看见过别的51内核的单片机这么做,所以才需要搞懂
#define I2C_SR                    *(_IO  uint8 xdata *)0x402b        // RV:  00H      I2C状态寄存器
回复

使用道具 举报

12#
ID:1091094 发表于 2024-8-25 15:15 | 只看该作者

我也看了这段话,但是没有整明白,有人说32的是地址映射,
回复

使用道具 举报

13#
ID:828160 发表于 2024-8-26 00:21 | 只看该作者
3038838599 发表于 2024-8-24 16:08
是的 我也是看见过别的51内核的单片机这么做,所以才需要搞懂
#define I2C_SR                    *(_IO ...

这个寄存器地址是在xdata区域,不在0x80--0xFF,所以可以这样定义,大多数寄存器地址是0x80--0xFF,需要使用直接寻址,
如果用间接寻址访问0x80--0xFF,就是访问idata的RAM,
如果用直接寻址访问0x80--0xFF,就是访问寄存器
0x00-0x7F可以是data区,也可以是idata区
如果用间接寻址访问0x00--0x7F,就是访问idata区
如果用直接寻址访问0x00--0x7F,就是访问data区
回复

使用道具 举报

14#
ID:161164 发表于 2024-8-26 11:32 | 只看该作者
3038838599 发表于 2024-8-25 15:15
我也看了这段话,但是没有整明白,有人说32的是地址映射,

总而言之
0x80~0xFF地址的寄存器只能用SFR来访问, 如
sfr P3 = 0xB0;
...
P3 = 0x0F;
if(P3 != 0x0F)
{
...
}
回复

使用道具 举报

15#
ID:624769 发表于 2024-8-26 21:08 | 只看该作者
你稍微懂一点点的 硬件知识,就不会有这个问题了。

指针访问属于 “间接访问”。
而51的SFR 属于 只能"直接访问",是不能用指针访问的。
至于,51的扩展寄存器 XSFR 属于只能“间接访问”,即无论如何都必须通过指针才能访问的。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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