试图了解avr代码中的左移

时间:2016-08-30 00:58:09

标签: c 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/#

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

看起来它将ctrl(PORTD)的使能位设置为1,等待1 ms然后将其设置为0.

代码没有显示它对硬件有何影响,但我的猜测是其中一个头文件中的某个地方是一些代码,它将PORTD转换为设备的寄存器级对象。

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

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