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

还有其他方式访问IO值的方式吗?

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:316
  • 最近打卡:2025-04-14 12:35:14
已绑定手机

14

主题

41

回帖

623

积分

高级会员

积分
623
发表于 2024-6-10 20:54:07 | 显示全部楼层 |阅读模式
现在能够通过‘&’来获取引脚P2的地址,但是无法通过‘*’来获取或修改P2的值,
sfr    P2 = 0xA0;
char *pin = &P2;
*pin = 0xFF;     //无法赋值

想问一下,还有其他方法来修改P2的值吗?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:463
  • 最近打卡:2025-06-17 17:53:48

33

主题

2448

回帖

5174

积分

论坛元老

积分
5174
发表于 2024-6-10 21:30:13 | 显示全部楼层
C51 就只能这样(或者说keil C51 只能这样,其他的编译器不知道),,你可以用sbit 定义其中的一个位,,sbit P20 = P2^0;  大概是这样写,,,

指针的方式就别想了,,

点评

所有 51(包括251)指令集,不支持指针的方式对 IO口寻址,所以,与编译器无关(硬件不支持)。 当然,也可以写个伪函数,模仿M0/M3, 用指针方式读写 IO口,只是效率很低。  详情 回复 发表于 2024-6-11 07:10
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-06-16 00:53:18

0

主题

336

回帖

1628

积分

金牌会员

积分
1628
发表于 2024-6-10 21:41:10 | 显示全部楼层
51单片机中高128字节RAM和特殊程序寄存器使用相同的逻辑地址,所以应该是普通指针变量只能表示RAM中的地址,是没法操作特殊程序寄存器的。没看到过其他方法操作特殊程序寄存器,还是老老实实用sfr 定义吧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-06-17 06:26:47
已绑定手机

19

主题

3231

回帖

5285

积分

论坛元老

积分
5285
发表于 2024-6-10 21:42:37 | 显示全部楼层
还可以这样,P2=x;然后对x就行操作。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:316
  • 最近打卡:2025-04-14 12:35:14
已绑定手机

14

主题

41

回帖

623

积分

高级会员

积分
623
发表于 2024-6-10 22:01:09 | 显示全部楼层
_奶*** 发表于 2024-6-10 21:30
C51 就只能这样(或者说keil C51 只能这样,其他的编译器不知道),,你可以用sbit 定义其中的一个位,,sb ...

好的谢谢,之前用sdcc的时候可以,现在就想keil能不能这样,尝试了一天也没有结果
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:316
  • 最近打卡:2025-04-14 12:35:14
已绑定手机

14

主题

41

回帖

623

积分

高级会员

积分
623
发表于 2024-6-10 22:01:50 | 显示全部楼层
so*** 发表于 2024-6-10 21:42
还可以这样,P2=x;然后对x就行操作。

谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:316
  • 最近打卡:2025-04-14 12:35:14
已绑定手机

14

主题

41

回帖

623

积分

高级会员

积分
623
发表于 2024-6-10 22:02:17 | 显示全部楼层
xxxe*** 发表于 2024-6-10 21:41
51单片机中高128字节RAM和特殊程序寄存器使用相同的逻辑地址,所以应该是普通指针变量只能表示RAM中的地址 ...

感谢回答
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:565
  • 最近打卡:2025-06-17 07:50:58
已绑定手机

50

主题

1816

回帖

3134

积分

论坛元老

积分
3134
发表于 2024-6-11 06:33:54 | 显示全部楼层
so*** 发表于 2024-6-10 21:42
还可以这样,P2=x;然后对x就行操作。

这个主意不错,可以写成函数形式,通过形参赋值
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5499

积分

荣誉版主

积分
5499
发表于 2024-6-11 07:10:38 | 显示全部楼层
_奶*** 发表于 2024-6-10 21:30
C51 就只能这样(或者说keil C51 只能这样,其他的编译器不知道),,你可以用sbit 定义其中的一个位,,sb ...

所有 51(包括251)指令集,不支持指针的方式对 IO口寻址,所以,与编译器无关(硬件不支持)。

当然,也可以写个伪函数,模仿M0/M3, 用指针方式读写 IO口,只是效率很低。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:463
  • 最近打卡:2025-06-17 17:53:48

33

主题

2448

回帖

5174

积分

论坛元老

积分
5174
发表于 2024-6-11 07:12:56 | 显示全部楼层
LAO*** 发表于 2024-6-11 07:10
所有 51(包括251)指令集,不支持指针的方式对 IO口寻址,所以,与编译器无关(硬件不支持)。

当然, ...

哦哦 了解了 ,,在往深的 就不太清楚了,就只知道51的没法直接指针访问寄存器,
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-17 18:56 , Processed in 0.200265 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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