按位运算

时间:2010-08-23 10:46:10

标签: c embedded bit-manipulation pic

// PWM frequency:
// 0 - 48 kHz
// 1 - 12 kHz
// 2 -  3 kHz
enum { MOTOR_FREQUENCY = 1 };

// Configure Timer 2 w. 250x period.
T2CON = 1 << 2 | MOTOR_FREQUENCY /* << 0 */;

我明白了吗?

11111111算术左移0或1或2

意思是:

T2CON = 1 << 2 | 0 = 1111 1100    
T2CON = 1 << 2 | 1 = 1111 1000    
T2CON = 1 << 2 | 2 = 1111 0000

亲切的问候,Sonite

3 个答案:

答案 0 :(得分:4)

1 << 2 = 100b

所以使用OR:

100b | 1 = 101b
100b | 2 = 110b

答案 1 :(得分:3)

假设您正在使用带有8位寄存器的微控制器。

0000 0001 << 2 = 0000 0100
then 
0000 0100 OR 0000 0000 = 0000 0100
-----
0000 0001 << 2 = 0000 0100
then 
0000 0100 OR 0000 0001 = 0000 0101
-----
0000 0001 << 2 = 0000 0100
then 
0000 0100 OR 0000 0010 = 0000 0110

答案 2 :(得分:2)

上下文:

TCON2是PIC MCU上的定时器寄存器,其中最后两位配置预分频器。

TCON2 configuration register on PICs

  • T2CKPS[1:0] = 0b00 = 0 =&gt; / 1预分频器
  • T2CKPS[1:0] = 0b01 = 1 =&gt; / 4预分频器
  • T2CKPS[1:0] = 0b1x = 2或3 =&gt; / 16预分频器

第2位实际上打开了定时器,所以它总是需要设置为执行任何操作,因此1 << 2(实际上应该写为1 << T2CON_TMR2ON_bit并定义T2CON_TMR2ON_bit一些CPU配置头)

所有的说法和完成,三个设置是0b1000b1010b110,它们打开计时器,并调整预分频器以获取评论中提到的那些频率。

另外,使用带有一个元素的enum几乎没有意义;使用#define