2016-08-30 1 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 Извините, но я не согласен с обозначением 'off-topic'. Он не ищет «отладочную помощь» и имеет «ясную задачу»: «* Попытка понять смысл *». Скорее, мне кажется, что ОП (понятно) запутался в избыточном '(0 << rs) | (0 << rw)' в назначениях. Простой ответ заключается в том, что оставление этих элементов (даже при избыточности) делает код более читаемым, поскольку все присваивания будут выглядеть аналогично '(v1 << rs) | (v2 << rw) | (v3 << en)', когда '0 'terms are * not * omitted .. – dxiv

+1

@dxiv Я немного встраивал программирование; нам не хватает важной информации, чтобы помочь ОП понять, почему это так. На самом базовом уровне эти значения представляют собой установленные настройки регистров; и они установлены явно по какой-то причине. Вопрос поставлен на удержание, чтобы дать ОП возможность исправить недостатки: вы ожидали бы, что название вопроса поможет кому-либо еще? Ожидаете ли вы, что кто-нибудь сможет решить вопрос «почему» в вопросе без необходимости отправляться в другое место? нам не хватает информации. Вот почему он держится. –

ответ

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' раз влево.