Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Знатоки HD44780
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Sirko
Имеется LCD 4х20, соединение 8 бит, вывод "RW" - не задействован.
Проявилась интересная особенность, если заполнять экран целиком, т.е. с адреса 0 и до финиша, то все знаки ложаться как положено. Если с адреса 40, то тоже все замечательно. А если стартовать с адреса больше 40, начинаются чудеса. Символы, которые находятся за пределами позиции 63, пляшут загадочным образом.

Для пущей ясности, прикладываю фото и ему соответствующий код,

Код
        u08 str[] = "01234567890123456789ABCDEFGHIJKLMNOPQRST"
                    "abcdefghijklmnopqrst*****-----+++++/////";

        lcd.setAddress(0);
        lcd.sendData(str, 80);    //1
        OS:Sleep(1000);

        lcd.clear();
        lcd.setAddress(40);
        lcd.sendData(str, 40);    //2
        OS::Sleep(1000);

        lcd.clear();
        lcd.setAddress(50);
        lcd.sendData(str, 30);    //3
        OS::Sleep(1000);

        lcd.clear();
        lcd.setAddress(60);
        lcd.sendData(str, 20);    //4
        OS::Sleep(1000);

        lcd.clear();
        lcd.setAddress(40);
        lcd.sendData(str, 40);    //5
        OS::Sleep(1000);


Функция sendData() принимает указатель на строку и кол-во символов, необходимых для отображения
Нажмите для просмотра прикрепленного файла <-- 1 setAddress( 0); sendData(str, 80);
Нажмите для просмотра прикрепленного файла <-- 2 setAddress(40); sendData(str, 40);
Нажмите для просмотра прикрепленного файла <-- 3 setAddress(50); sendData(str, 30);
Нажмите для просмотра прикрепленного файла <-- 4 setAddress(60); sendData(str, 20);
Нажмите для просмотра прикрепленного файла <-- 5 setAddress(40); sendData(str, 40);

С одной стороны, один и тот же код ведет себя по разному, с другой, возможно, есть какой то нюанс.
Инициализация вот такая
Код
void LCD_HD44780::///////////////////////////////////////////////////////////////////
init(){
    mutex->Lock();
    ON(LCD_PIN_RS);
    DRIVER(LCD_PIN_RS, OUT);
    ON(LCD_PIN_STROB);
    DRIVER(LCD_PIN_STROB, OUT);
    mutex->Unlock();

    OS::Sleep(200);

    for(u08 i=0; i<3; ++i){
        sendCommand(BIN8(00110000));    //    Шина 8 бит
        OS::Sleep(50);
    }

    clear();                            //    CLS
    sendCommand(BIN8(00111000));        //    Шина 8 бит, 2 строки
    sendCommand(BIN8(00000110));        //    Инкремент адреса. Экран не движется
    sendCommand(BIN8(00001100));        //    Включть дисплей (D=1)
    clear();                            //    CLS
    ON_LIGHT_LCD;
}

rezident
В сообщении не указан конкретный тип LCD-модуля, но в даташите их обычно приводится карта памяти. LCD 20*4 обычно организован в виде двух блоков памяти. Визуально третья строка является продолжением первой, а четвертая продолжением второй. Причем второй блок памяти адресуется с адреса 0x40, где 40 число не десятичное, а шестнадцатеричное.
Sirko
Тип LCD - WM-C2004M
но мне здается, что все подобные дисплеи однотипные и двухчиповые.

По поводу чередования строк я знаю, а на счет
Цитата
Причем второй блок памяти адресуется с адреса 0x40, где 40 число не десятичное, а шестнадцатеричное.

не обратил внимание. На самом деле проблема именно в этом.
Огромное спасибо.

P.S. Непонятно, как код lcd.setAddress(40); lcd.sendData(str, 40); отрабатывает корректно, ну да ладно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.