[51单片机] 请教非位寻址的寄存器,怎么进行位操作

[复制链接]
1607|8
 楼主| 心印菩提 发表于 2015-8-10 15:29 | 显示全部楼层 |阅读模式
我使用的是C8051F040
在头文件里定义了这样一个寄存器  
sfr PCA0CPM0 0xDA ;
我想单独操作基中的一位
于是我自己在程序中这样定义
sbit PWM = PCA0CPM0 ^ 1;
或者
#define PWM PCA0CPM0 ^ 1
但是都不行,编译报错说invalid base address

因为需要在中断服务函数中对这一位进行取反操作,字节操作好像不容易实现,请问有办法吗?

另外有一个问题如下图


按照DATASHEET的描述,ECOMn和PWMn以与的形式作为比较器的使能
但是实验发现,ECOMn为0禁止比较器的话,输出为低
而PWMn为0禁止比较器的话,输出为高
为什么有这样的区别?

非常感谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
pang7 发表于 2015-8-10 15:33 | 显示全部楼层
就是字节进行与或操作
ningling_21 发表于 2015-8-10 15:52 | 显示全部楼层
可行的办法是

PCA0CPM0= PCA0CPM0&0xfe;
或 PCA0CPM0 = PCA0CPM0|0x01;
ayb_ice 发表于 2015-8-10 16:31 | 显示全部楼层
或者
#define PWM PCA0CPM0 ^ 1

这个方法可不行的
NE5532 发表于 2015-8-10 17:04 | 显示全部楼层
byte ^= 0x80,取反还是很容易实现的。
 楼主| 心印菩提 发表于 2015-8-10 20:40 | 显示全部楼层
NE5532 发表于 2015-8-10 17:04
byte ^= 0x80,取反还是很容易实现的。

后来想到了异或
还是非常感谢你哈
 楼主| 心印菩提 发表于 2015-8-10 20:41 | 显示全部楼层
ningling_21 发表于 2015-8-10 15:52
可行的办法是

PCA0CPM0= PCA0CPM0&0xfe;

这并能放在中断服务函数中每次进行取反

应该用异或
oldzhang 发表于 2015-8-10 22:39 | 显示全部楼层
置1用“或”,清0用“与”,取反用“异或”
松哥无敌 发表于 2015-8-11 13:10 | 显示全部楼层
看看评论是啥
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

39

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部