LCD 8-битный режим до 4-битного - PullRequest
2 голосов
/ 30 октября 2008

У нас есть символьный ЖК-дисплей (www.cloverlcd.com/pdf/S6A0069.pdf), который мы начали работать в 8-битном режиме. Однако сейчас мы пытаемся заставить его работать в 4-битном режиме, но, похоже, ничего не отображается. Я думаю, что инструкция набора функций не была написана. Может кто-нибудь проверить, правильно ли я подхожу к этому? Я выложу свой 8-битный код (который работает) и мой 4-битный код (который я пытаюсь заставить работать)

     //8 bit working
    COMPortC(0x3C);     //function set                                          
    Delay1KTCYx(10);
    COMPortC(0x0F);     //Turn on display and configure cursor settings         
    Delay1KTCYx(10);
    COMPortC(0x01);     //clear display
    Delay1KTCYx(10);
    COMPortC(0x06);     //increment mode and increment direction (entry mode set)
    Delay1KTCYx(10);
    COMPortC(0x02);     //Return Home

       //4 bit
    COMPortC(0x20);     //function set                                          
    Delay1KTCYx(10);
    COMPortC(0x20);     //function set                                          
    Delay1KTCYx(10);
    COMPortC(0x80);     //function set                                          
    Delay1KTCYx(10);

    COMPortC(0x00);     //Turn on display and configure cursor settings         
    Delay1KTCYx(10);
    COMPortC(0xF0);     //Turn on display and configure cursor settings         
    Delay1KTCYx(10);

Ответы [ 6 ]

1 голос
/ 30 октября 2008

Я не уверен, как соединены ваши 4 бита, но я предполагаю, что .... Так как вы отправляете биты на верхнем клочке (0x * 0 - там, где звезда), то вы, вероятно, захотите используйте нижний или младший значащий клев, который будет 0x0 *.

COMPortCWithoutBusy(0x02);      //function set first nibble                                     
Delay1KTCYx(10);
COMPortCWithoutBusy(0x02);      //function set second nibble                                    
Delay1KTCYx(10);
BusyEnable();
Delay1KTCYx(10);
...
1 голос
/ 30 октября 2008

В какой-то мере все выглядит хорошо, но мне интересно несколько вещей:

1 / Почему вы выводите 0x20 дважды, чтобы установить адрес CGRAM в 4-битном разделе? Конечно, это нужно только один раз.

2 / Две другие записи (0x00 и 0xf0), я не понимаю из документов. Можете ли вы исправить комментарии, чтобы указать, что они должны делать?

3 / После переключения в 4-битный режим, вам нужно повторить другие инструкции (увеличение и возврат домой)? Может случиться так, что переключение режимов сбрасывает все данные.

4 / Одна вещь, которую я заметил, - флаг занятости указывает, что система еще не может получить другую инструкцию. Возможно, вы слишком быстро их передаете. Что происходит, когда вы увеличиваете задержки с 10 до 100.

Только некоторые вещи, которые нужно попробовать - дайте нам знать результаты.

=====

РЕПЛИКА:

Спасибо за ответ

1 и 2) Я записываю эти значения на основе стр. 29 таблицы (www.cloverlcd.com/pdf/S6A0069.pdf).

3) Вы правы, мне нужно выполнить и другие инструкции, но сейчас я просто пытаюсь заставить курсор мигать в 4-битном режиме (поэтому достаточно первых двух инструкций)

4) Я только что попробовал 100 задержек, это не сработало.

Извините за плохие комментарии, я постараюсь опубликовать лучший код в следующий раз.

Спасибо

=====

EDIT:

Теперь я вижу, как это работает. В 4-битном режиме используются только d7, d6, d5, d4, но каждая инструкция состоит из 2 записей (для создания 8-битной инструкции). Таким образом, он использует хитрость для записи команды 20 (в 8-битном режиме) или 22 (2020 в 4-битном режиме), которые устанавливают режим 4-битным. Очень умно, Samsung, я впечатлен.

Попробуйте пройти всю последовательность инициализации. Возможно, дисплей не запускается полностью, пока не завершится инициализация.

Таким образом, вам нужно вывести (hex) 20,20,80,00, f0, 00,10,00,60,00,20 . Вы должны добавить смелые.

Кроме того, мне нужно задать еще два вопроса (пожалуйста, ответьте как комментарий к этому ответу, а не отправляйте другой ответ)

1 / Проверяет ли COMPortC () сигнал занятости перед выводом данных?

2 / Задержка 10, в каких единицах, миллисекундах, микросекундах и т. Д.?

0 голосов
/ 28 апреля 2009

Это просто еще один вариант драйвера ЖК-дисплея HD44780, поэтому он должен нормально работать со следующей процедурой инициализации:

void initlcd(void)
{
    delayms(20);    // Wait for LCD to power up ( >15ms )
    RS=0;       // Set RS low for instruction 
    write4(3);  // Set interface to 8 bits 
    delayms(5); // Wait for LCD execute instruction ( >4.1ms )
    write4(3);  // Set interface to 8 bits 
    delayms(1); // Wait for LCD execute instruction ( >100us )
    write4(3);  // Set interface to 8 bits 
    delayms(5);     // Wait for LCD execute instruction (At this point 
            // we could actually start using the busy flag) 
    write4(2);  // Set the display to 4 bit interface 
    delayms(5); // Wait for LCD execute instruction 
    write8(0x28);   // Set the display to two line and ???
    delayms(5); // Wait for LCD execute instruction 
    write8(6);  // ???
    delayms(5); // Wait for LCD execute instruction 
    write8(1);  // Clear the LCD
    delayms(5); // Wait for LCD execute instruction
    write8(0xf);    // ???
    delayms(5); // Wait for LCD execute instruction
    return;
}

Вам нужно определить свои собственные функции write4, write8 и delayms, но они относительно просты. Убедитесь, что регистр выбора (RS) установлен в командный режим. write4 отправляет одну 4-битную команду, в то время как write 8 отправляет две четырехбитные команды подряд, сначала с высоким клевом, затем с низким клевом:

void write8(uns8 byte)
{
    uns8 nibble;
    nibble = (byte & 0xf0) >> 4;    // Rotate the high 4 bits (7-4) of byte into bits (3-0) of nibble
    write4(nibble);         // Write the high 4 bits to the LCD
    nibble = byte & 0xf;        // Copy the low four bits of byte into the low four bits of nibble
    write4(nibble);         // Write the low 4 bits to the LCD
}

Код , который я написал , предназначен для микроконтроллера PIC, использующего бесплатную версию компилятора cc5x. Должен быть понятным и переносимым на другие языки.

Процедура инициализации во многом заимствована у многих других на протяжении многих лет инициализации ЖК-дисплея - поиска и преодоления различных изюминок HD44780 и его вариантов. Он должен хорошо работать для большинства подобных ЖК-дисплеев.

0 голосов
/ 30 октября 2008
void LCDInitialization(void)
{

    COMPortCWithoutBusy(0x20);      //function set first nibble                                     
    Delay1KTCYx(10);
    COMPortCWithoutBusy(0x20);      //function set second nibble                                    
    Delay1KTCYx(10);
    BusyEnable();
    Delay1KTCYx(10);

    COMPortCWithoutBusy(0x80);      //function set  third nibble                                        
    Delay1KTCYx(10);
    BusyEnable();
    Delay1KTCYx(10);

    COMPortCWithoutBusy(0x00);      //Turn on display and configure cursor settings first nibble
    Delay1KTCYx(10);
    COMPortCWithoutBusy(0xF0);      //Turn on display and configure cursor settings second nibble
    Delay1KTCYx(10);
    BusyEnable();
    Delay1KTCYx(10);

    COMPortCWithoutBusy(0x00);      //disp clear first nibble                                       
    Delay1KTCYx(10);
    COMPortCWithoutBusy(0x10);      //disp clear second nibble                                  
    Delay1KTCYx(10);
    BusyEnable();
    Delay1KTCYx(10);

    COMPortCWithoutBusy(0x00);      //entry mode set first nibble                                       
    Delay1KTCYx(10);
    COMPortCWithoutBusy(0x60);      //entry mode set second nibble                                  
    Delay1KTCYx(10);
    BusyEnable();
    Delay1KTCYx(10);

    COMPortCWithoutBusy(0x20);      //20 first nibble                                       
    Delay1KTCYx(10);
    BusyEnable();
    Delay1KTCYx(10);
}
0 голосов
/ 30 октября 2008

Вот лучше прокомментированный кусок кода для 4-битного режима

    COMPortC(0x20);     //function set first nibble                                     
    Delay1KTCYx(10);
    COMPortC(0x20);     //function set second nibble                                    
    Delay1KTCYx(10);
    COMPortC(0x80);     //function set  third nibble                                        
    Delay1KTCYx(10);

    COMPortC(0x00);     //Turn on display and configure cursor settings first nibble
    Delay1KTCYx(10);
    COMPortC(0xF0);     //Turn on display and configure cursor settings second nibble
    Delay1KTCYx(10);

Я до сих пор не знаю, что случилось. Кроме того, на странице 18 таблицы данных она показывает временную диаграмму, которая практически идентична временной диаграмме 8-битного режима, за исключением того, что имеется AC3. Что означает этот AC3?

0 голосов
/ 30 октября 2008

1 и 2) Я пишу эти значения на основе страницы 29 таблицы данных (www.cloverlcd.com/pdf/S6A0069.pdf).

3) Вы правы, мне тоже нужно выполнить другие инструкции, но сейчас я просто пытаюсь заставить курсор мигать в 4-битном режиме (поэтому достаточно первых двух инструкций)

4) Я только что попробовал 100 задержек, это не сработало.

...