Маскирование и сдвиг битов PIC для управления 4-битным ЖК-дисплеем

У меня есть вопрос относительно маскировки и смещения битов.

У меня есть следующий код:

void WriteLCD(unsigned char word, unsigned commandType, unsigned usDelay)
{
    // Most Significant Bits
    // Need to do bit masking for upper nibble, and shift left by 8.
    LCD_D = (LCD & 0x0FFF) | (word << 8);
    EnableLCD(commandType, usDelay); // Send Data

    // Least Significant Bits
    // Need to do bit masking for lower nibble, and shift left by 12.
    LCD_D = (LCD & 0x0FFF) | (word << 12);
    EnableLCD(commandType, usDelay); // Send Data
}

«Слово» состоит из 8 бит и передается через 4-битный ЖК-интерфейс. Это означает, что я должен разбить самые значащие биты и наименее значащие биты, прежде чем отправлять данные.

LCD_D - это 16-битное число, в котором я передаю только самые значащие биты, которые я хочу на самом деле что-то «сделать». Я хочу, чтобы предыдущие 12 бит были сохранены на случай, если они делали что-то еще.

Является ли моя логика с точки зрения маскировки битов и смещения «слова» правильной с точки зрения передачи верхнего и нижнего полубайтов соответствующим образом на LCD_D?

Спасибо за помощь!


person Christopher Cheuvront    schedule 12.02.2013    source источник


Ответы (1)


Выглядит нормально, за исключением необходимости приводить «слово» к беззнаковому короткому (16-битному) перед сдвигом в обоих случаях, так что сдвиг не выполняется для символа и теряет данные. например:

LCD_D = (LCD & 0x0FFF) | ((unsigned short) word << 8);
person Martin    schedule 12.02.2013
comment
Спасибо за помощь! Актерский состав сделал это. - person Christopher Cheuvront; 14.02.2013