я обошелся возможностями Eclipse....
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Код: Выделить всё
void lcd_HD44780_init(void) {
initLogging(&logger, "HD44780 driver");
addConsoleAction("lcdinfo", lcdInfo);
if (engineConfiguration->displayMode == DM_HD44780) {
// initialize hardware lines
mySetPadMode("lcd RS", HD44780_PORT_RS, HD44780_PIN_RS, PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd E", HD44780_PORT_E, HD44780_PIN_E, PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB4", HD44780_PORT_DB4, HD44780_PIN_DB4, PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB6", HD44780_PORT_DB5, HD44780_PIN_DB5, PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB7", HD44780_PORT_DB6, HD44780_PIN_DB6, PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB8", HD44780_PORT_DB7, HD44780_PIN_DB7, PAL_MODE_OUTPUT_PUSHPULL);
// and zero values
palWritePad(HD44780_PORT_RS, HD44780_PIN_RS, 0);
palWritePad(HD44780_PORT_E, HD44780_PIN_E, 0);
palWritePad(HD44780_PORT_DB4, HD44780_PIN_DB4, 0);
palWritePad(HD44780_PORT_DB5, HD44780_PIN_DB5, 0);
palWritePad(HD44780_PORT_DB6, HD44780_PIN_DB6, 0);
palWritePad(HD44780_PORT_DB7, HD44780_PIN_DB7, 0);
}
chThdSleepMilliseconds(20); // LCD needs some time to wake up
lcd_HD44780_write(LCD_HD44780_RESET); // reset 1x
chThdSleepMilliseconds(1);
lcd_HD44780_write(LCD_HD44780_RESET); // reset 2x
lcd_HD44780_write(LCD_HD44780_RESET); // reset 3x
lcd_HD44780_write(LCD_HD44780_4_BIT_BUS); // 4 bit, 2 line
chThdSleepMicroseconds(40);
lcd_HD44780_write(LCD_HD44780_4_BIT_BUS); // 4 bit, 2 line
lcd_HD44780_write(0x80);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x08); // display and cursor control
chThdSleepMicroseconds(40);
lcd_HD44780_write(LCD_HD44780_DISPLAY_CLEAR);
chThdSleepMilliseconds(2);
lcd_HD44780_write(LCD_HD44780_SHIFT_CURSOR_RIGHT);
chThdSleepMilliseconds(2);
lcd_HD44780_write(LCD_HD44780_DISPLAY_ON);
lcd_HD44780_set_position(0, 0);
}
отключить питание на логику экранчика (не на подсветку), подключить обратно питание (тут выводились всякие кракозябры), сбросить кнопкой дискоборд (тут становилось всё окей)
Он не будет реагировать если команда дается в 8-битном режиме(а библиотека откуда узнает что ты индикатор используешь в 4-битном режиме?) Адресация символов/строк зависит от индикатора а не от чипа в него установленного - надо уточнять в даташите на конкретный индикатор где какая строка начинается в памяти.если брать инициализацию из даташита , он работает , но через строчку символы выводятся .
иногда у меня экран запускается , но очень много мусора в необновляемых областях
на команду 0x01 он не реагирует
Это типа к питанию индикатора чтоли?Gudd-Head писал(а): есть модификация где светодиод подключен к пинам 1 и 2 через пофигистор 1206
Нету там ничего, звонится напрямую от А/К светодиода до контактов 1/2 которые таки да, для питания дисплея.aam писал(а):Может там с другой стороны платы резистор уже есть?
библиотека по идее должна работать только в 4 битном режиме .Alexeyslav писал(а): Он не будет реагировать если команда дается в 8-битном режиме(а библиотека откуда узнает что ты индикатор используешь в 4-битном режиме?) Адресация символов/строк зависит от индикатора а не от чипа в него установленного - надо уточнять в даташите на конкретный индикатор где какая строка начинается в памяти.
Вобщем какая-то стремная библиотека, работу которой надо пошагово проверить на соответствие спецификации. Очень похожа на бред абстракциониста, какой-то крайний запущенный вариант уровня абстракций, надо быть ближе к земле.
Код: Выделить всё
void lcd_HD44780_init(void) {
initLogging(&logger, "HD44780 driver");
addConsoleAction("lcdinfo", lcdInfo);
if (engineConfiguration->displayMode == DM_HD44780) {
// initialize hardware lines
mySetPadMode("lcd RS", getHwPort(boardConfiguration->HD44780_rs), getHwPin(boardConfiguration->HD44780_rs), PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd E", getHwPort(boardConfiguration->HD44780_e), getHwPin(boardConfiguration->HD44780_e), PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB4", getHwPort(boardConfiguration->HD44780_db4), getHwPin(boardConfiguration->HD44780_db4), PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB6", getHwPort(boardConfiguration->HD44780_db5), getHwPin(boardConfiguration->HD44780_db5), PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB7", getHwPort(boardConfiguration->HD44780_db6), getHwPin(boardConfiguration->HD44780_db6), PAL_MODE_OUTPUT_PUSHPULL);
mySetPadMode("lcd DB8", getHwPort(boardConfiguration->HD44780_db7), getHwPin(boardConfiguration->HD44780_db7), PAL_MODE_OUTPUT_PUSHPULL);
// and zero values
palWritePad(getHwPort(boardConfiguration->HD44780_rs), getHwPin(boardConfiguration->HD44780_rs), 0);
palWritePad(getHwPort(boardConfiguration->HD44780_e), getHwPin(boardConfiguration->HD44780_e), 0);
palWritePad(getHwPort(boardConfiguration->HD44780_db4), getHwPin(boardConfiguration->HD44780_db4), 0);
palWritePad(getHwPort(boardConfiguration->HD44780_db5), getHwPin(boardConfiguration->HD44780_db5), 0);
palWritePad(getHwPort(boardConfiguration->HD44780_db6), getHwPin(boardConfiguration->HD44780_db6), 0);
palWritePad(getHwPort(boardConfiguration->HD44780_db7), getHwPin(boardConfiguration->HD44780_db7), 0);
}
chThdSleepMilliseconds(50); // LCD needs some time to wake up
int a;
for ( a = 0; a < 4; a++ )
{
palSetPad(getHwPort(boardConfiguration->HD44780_db4), getHwPin(boardConfiguration->HD44780_db4));
palSetPad(getHwPort(boardConfiguration->HD44780_db5), getHwPin(boardConfiguration->HD44780_db5));
palSetPad(getHwPort(boardConfiguration->HD44780_e), getHwPin(boardConfiguration->HD44780_e));
chThdSleepMilliseconds(1);
palClearPad(getHwPort(boardConfiguration->HD44780_e), getHwPin(boardConfiguration->HD44780_e));
chThdSleepMilliseconds(6);
}
// LCD = 0b00100000;
palClearPad(getHwPort(boardConfiguration->HD44780_db4), getHwPin(boardConfiguration->HD44780_db4));
chThdSleepMilliseconds(1);
palSetPad(getHwPort(boardConfiguration->HD44780_e), getHwPin(boardConfiguration->HD44780_e));
chThdSleepMilliseconds(1);
palClearPad(getHwPort(boardConfiguration->HD44780_e), getHwPin(boardConfiguration->HD44780_e));
chThdSleepMilliseconds(6);
palClearPad(getHwPort(boardConfiguration->HD44780_db5), getHwPin(boardConfiguration->HD44780_db5));
chThdSleepMilliseconds(6);
//SendLCDc( 0b00101000 ); // Настройка функций
//SendLCDc( 0b00001100 ); // Включить дисплей
//SendLCDc( 0b00000001 ); // Дисплей очистить
//SendLCDc( 0b00000110 ); // Entry Mode
//SendLCDc( 0b10000000 ); // DDRAM addresss 0000
//SendLCDc( 0b00000010 ); // return home
lcd_HD44780_write(0x28);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x0C);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x01);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x06);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x80);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x02);
chThdSleepMicroseconds(40);
/*
chThdSleepMilliseconds(20); // LCD needs some time to wake up
lcd_HD44780_write(LCD_HD44780_RESET); // reset 1x
chThdSleepMilliseconds(1);
lcd_HD44780_write(LCD_HD44780_RESET); // reset 2x
lcd_HD44780_write(LCD_HD44780_RESET); // reset 3x
lcd_HD44780_write(LCD_HD44780_4_BIT_BUS); // 4 bit, 2 line
chThdSleepMicroseconds(40);
lcd_HD44780_write(LCD_HD44780_4_BIT_BUS); // 4 bit, 2 line
lcd_HD44780_write(0x80);
chThdSleepMicroseconds(40);
lcd_HD44780_write(0x08); // display and cursor control
chThdSleepMicroseconds(40);
lcd_HD44780_write(LCD_HD44780_DISPLAY_CLEAR);
chThdSleepMilliseconds(2);
lcd_HD44780_write(LCD_HD44780_SHIFT_CURSOR_RIGHT);
chThdSleepMilliseconds(2);
lcd_HD44780_write(LCD_HD44780_DISPLAY_ON);
lcd_HD44780_set_position(0, 0);
*/
}а почему бы не использовать проверенные временем библиотеки? есть очень хорошая, гибкая и неоднократно испытанная...rus084 писал(а):перепишу библиотеку послностью из статьи