2016-08-30 74 views
-1

左移试图了解下面的代码中给出的follwing线的含义是:想了解AVR代码

ctrl =(0<<rs)|(0<<rw)|(1<<en); 

请让我明白这个道理。

#define LCD_DATA PORTB    //LCD data port 
#define ctrl PORTD 
#define en PD2       // enable signal 
#define rw PD1      // read/write signal 
#define rs PD0      // register select signal 

, 
, 

void LCD_cmd(unsigned char cmd) 
{ 
LCD_DATA=cmd; 
ctrl =(0<<rs)|(0<<rw)|(1<<en); 
_delay_ms(1); 
ctrl =(0<<rs)|(0<<rw)|(0<<en); 
_delay_ms(50); 
return; 
} 

源:http://www.electronicshub.org/interfacing-16x2-lcd-avr-microcontroller/#

+0

我们错过了PDO,PD1和PD2的定义,并且我们错过了您遇到的实际问题陈述。如果你不明白左移是如何工作的,那么我们已经有问题了。如果您可以大声叫嚷PORTD是什么定义(即从这里的数据表中粘贴适当的注册信息),然后给我们一个问题标题,它能够准确反映您要解决的问题,并给我们一个问题陈述对未来访问者有用,我们将能够提供帮助。 –

+1

@GeorgeStocker对不起,但我不同意'离题'的名称。它不寻求“调试帮助”,它确实有一个“明确的问题陈述”:“*试图理解*的含义。相反,在我看来,操作系统(可理解地)对于赋值中多余的“(0 << rs)|(0 << rw)”感到困惑。简单的答案是,将它们留在(即使多余)使得代码更易读,因为当'0 '术语*不*省略。 – dxiv

+1

@dxiv我做了一些嵌入式编程;我们错过了关键信息,以帮助OP了解为什么在那里。在非常基本的层面上,这些值代表设置的寄存器设置;并且明确设置它们是有原因的。这个问题被搁置,让OP有机会解决这些不足之处:你会期望这个问题标题能够帮助其他人吗?你希望任何人都能够解决问题中的'为什么'而不必去别的地方?我们缺少信息。这就是为什么它被搁置。 –

回答

0

看起来它是设置使CTRL(PORTD)的位为1,等待1毫秒,然后将其设置回0

的代码没有按” t显示了它如何影响硬件,但我的猜测是头文件中的某处是一些将PORTD转换为设备寄存器级别对象的代码。

ctrl =(0<<rs)|(0<<rw)|(1<<en); 

中位移的点是根据硬件期望的内容到正确位值(0,在这种情况下,0和1)移动到其正确的比特位置在寄存器中。

1

ctrl =(0<<rs)|(0<<rw)|(1<<en);相当于ctrl = (1<<en);,意思是向左移动1'en'次。