打印
[51单片机]

请教非位寻址的寄存器,怎么进行位操作

[复制链接]
1351|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我使用的是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

这个方法可不行的

使用特权

评论回复
5
NE5532| | 2015-8-10 17:04 | 只看该作者
byte ^= 0x80,取反还是很容易实现的。

使用特权

评论回复
6
心印菩提|  楼主 | 2015-8-10 20:40 | 只看该作者
NE5532 发表于 2015-8-10 17:04
byte ^= 0x80,取反还是很容易实现的。

后来想到了异或
还是非常感谢你哈

使用特权

评论回复
7
心印菩提|  楼主 | 2015-8-10 20:41 | 只看该作者
ningling_21 发表于 2015-8-10 15:52
可行的办法是

PCA0CPM0= PCA0CPM0&0xfe;

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

应该用异或

使用特权

评论回复
8
oldzhang| | 2015-8-10 22:39 | 只看该作者
置1用“或”,清0用“与”,取反用“异或”

使用特权

评论回复
9
松哥无敌| | 2015-8-11 13:10 | 只看该作者
看看评论是啥

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

39

帖子

0

粉丝