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

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:317
  • 最近打卡:2025-08-05 20:07:18
已绑定手机

14

主题

42

回帖

657

积分

高级会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:495
  • 最近打卡:2025-08-06 15:38:26

33

主题

2484

回帖

5391

积分

论坛元老

积分
5391
发表于 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
  • 打卡总天数:453
  • 最近打卡:2025-08-07 00:47:30

0

主题

336

回帖

1760

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:519
  • 最近打卡:2025-08-07 00:08:02
已绑定手机

19

主题

3248

回帖

5563

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:317
  • 最近打卡:2025-08-05 20:07:18
已绑定手机

14

主题

42

回帖

657

积分

高级会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:317
  • 最近打卡:2025-08-05 20:07:18
已绑定手机

14

主题

42

回帖

657

积分

高级会员

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

谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:317
  • 最近打卡:2025-08-05 20:07:18
已绑定手机

14

主题

42

回帖

657

积分

高级会员

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

感谢回答
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:616
  • 最近打卡:2025-08-07 10:46:20
已绑定手机

54

主题

1880

回帖

3478

积分

论坛元老

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

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

使用道具 举报 送花

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

54

主题

1323

回帖

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
  • 打卡总天数:495
  • 最近打卡:2025-08-06 15:38:26

33

主题

2484

回帖

5391

积分

论坛元老

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

当然, ...

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-7 12:25 , Processed in 0.125699 second(s), 101 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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