Я пытался подключиться к дисплею, совместимому с HD44780 (16x2), в течение нескольких часов, но столкнулся с некоторыми странными проблемами поведения, которые я не могу решить.
Моя установка:
Моя последовательность инициализации:
(с низким RS)
Здесь некоторые вещи происходят не так, как ожидалось:
Затем я пытаюсь написать несколько символов с высоким уровнем RS, отправляя по 2 байта на символ.
Здесь я тоже получаю странное поведение: вместо того, чтобы писать 1 символ на 2 байта, он пишет 2 (по одному на байт). Я заставил его пройти через символы 0-15, и я получаю случайные символы (например, косую черту) и японские символы. Все они взяты из случайных мест в таблице символов, в основном из нижней строки, не в каком-либо обычном порядке, но всегда печатаются одни и те же символы в одном и том же порядке.
Мой вопрос: у меня действительно закончились идеи, чтобы исправить это. Я пропустил что-то очевидное? Какие у меня могут быть проблемы и как я могу отлаживать дальше?
Изменить: это то, что я вижу на своем экране после инициализации, это может быть полезно
Редактировать 2:
Мой основной код:
GPIOPin lcdEnablePin = PIN_B(11);
GPIOPin lcdRSPin = PIN_B(10);
GPIOPin lcdDataPins[] = {PIN_E(2), PIN_E(3), PIN_E(4), PIN_E(5)};
//Set all pins as outputs
GPIO::pinModeDigital(lcdEnablePin, 1);
GPIO::pinModeDigital(lcdRSPin, 1);
for(int i = 0; i < 4; i++)
GPIO::pinModeDigital(lcdDataPins[i], 1);
GPIO::writePinDigital(lcdRSPin, 0); //Instruction register
lcdSendData4(lcdEnablePin, lcdDataPins, 2); //Enable 4 bit
lcdSendData8(lcdEnablePin, lcdDataPins, 40); //Function set, 2 line
lcdSendData8(lcdEnablePin, lcdDataPins, 1); //Clear and return home
lcdSendData8(lcdEnablePin, lcdDataPins, 2); //Entry Mode, Increment cursor position, No display shift
lcdSendData8(lcdEnablePin, lcdDataPins, 8); //All off
lcdSendData8(lcdEnablePin, lcdDataPins, 15); //All on
GPIO::writePinDigital(lcdRSPin, 1); //Data register
for(int i = 0; i < 16; i++) //Write test data, 4 bit because that's what seemed to work
lcdSendData4(lcdEnablePin, lcdDataPins, i);
Мои функции SendData:
void lcdSendData4(GPIOPin lcdEnablePin, GPIOPin lcdDataPins[], char data)
{
simpleBusy();
//Set enable high
GPIO::writePinDigital(lcdEnablePin, 1);
simpleBusy();
//Write data
for(int i = 0; i < 4; i++)
GPIO::writePinDigital(lcdDataPins[i], data & (1 << i));
simpleBusy();
//Falling edge
GPIO::writePinDigital(lcdEnablePin, 0);
}
void lcdSendData8(GPIOPin lcdEnablePin, GPIOPin lcdDataPins[], char data)
{
lcdSendData4(lcdEnablePin, lcdDataPins, data >> 4); //Send MSB
lcdSendData4(lcdEnablePin, lcdDataPins, data); //Send LSB
}
На некоторых моделях вам необходимо отправить команды начальной настройки несколько раз. Кроме того, некоторые модели, которые у меня есть, потребляют энергию агрессивно, импульсно, поэтому у меня есть большой конденсатор рядом с источником питания (+ -) ЖК-дисплея, чтобы избежать шума шины питания.
Вы до сих пор не упомянули линию E.
E должен быть низким, затем представить данные, установить E высоким, затем низким и т. д.
Допустили ли вы необходимые задержки для инициализации? В техническом описании сказано, что вам нужно ждать более 4,1 мс после отправки первого 0x3.
Однажды я получил дисплей с похожим поведением. Мне нужно было установить его в 8-битный режим три раза и еще раз установить его в 4-битный режим, чтобы перевести его «действительно» в 4-битный режим. Это был единственный способ заставить его работать в 4-битном режиме. Может быть, это поможет.
Спехро Пефхани
Игнасио Васкес-Абрамс
техвалрис
техвалрис
Венни
Венни
техвалрис
техвалрис
Венни
техвалрис
Венни
техвалрис
техвалрис