非位寻址寄存器怎么进行位操作?
时间:10-02
整理:3721RD
点击:
我使用的是C8051F040
在头文件里定义了这样一个寄存器
sfr PCA0CPM0 0xDA ;
我想单独操作基中的一位
于是我自己在程序中这样定义
sbit PWM = PCA0CPM0 ^ 1;
或者
#define PWM PCA0CPM0 ^ 1
但是都不行,编译报错说invalid base address
因为需要在中断服务函数中对这一位进行取反操作,字节操作好像不容易实现,请问有办法吗?
另外有一个问题如下图
按照DATASHEET的描述,ECOMn和PWMn以与的形式作为比较器的使能
但是实验发现,ECOMn为0禁止比较器的话,输出为低
而PWMn为0禁止比较器的话,输出为高
为什么有这样的区别?
在头文件里定义了这样一个寄存器
sfr PCA0CPM0 0xDA ;
我想单独操作基中的一位
于是我自己在程序中这样定义
sbit PWM = PCA0CPM0 ^ 1;
或者
#define PWM PCA0CPM0 ^ 1
但是都不行,编译报错说invalid base address
因为需要在中断服务函数中对这一位进行取反操作,字节操作好像不容易实现,请问有办法吗?
另外有一个问题如下图
按照DATASHEET的描述,ECOMn和PWMn以与的形式作为比较器的使能
但是实验发现,ECOMn为0禁止比较器的话,输出为低
而PWMn为0禁止比较器的话,输出为高
为什么有这样的区别?
可行的办法是
PCA0CPM0= PCA0CPM0&0xfe;
或 PCA0CPM0 = PCA0CPM0|0x01;
这并能放在中断服务函数中每次进行取反
byte ^= 0x80,取反还是很容易实现的。