2008-10-30 2 views
2

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

Вопрос: если он работает в режиме 8 бит, зачем вы хотите использовать 4 бит? – 2008-10-30 01:05:51

+0

Мы пытаемся переключиться на 4-битный режим, потому что нам нужно 4 дополнительных провода, чтобы перейти к другим компонентам, подключенным к нашему микроконтроллеру. – 2008-10-30 02:27:01

ответ

1

Это выглядит хорошо до точки, но мне интересно о паре вещи:

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, я впечатлен.

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

Таким образом, вам необходимо вывести (шестнадцатеричный) 20,20,80,00, f0, 00,10,00,60,00,20. Смелые - это те, которые вам нужно добавить.

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

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

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

-1

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

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

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

0

Вот лучше прокомментировал кусок кода для режима 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
 
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); 
}
1

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

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

Это просто еще один вариант драйвера HD44780 LCD, и как таковой он должен работать нормально с помощью следующей процедуры инициализации:

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; 
} 

Вам нужно определить свои собственные, Написать4 Написать8, и задержки, но они относительно просты. Убедитесь, что у вас установлен регистр (RS) в командном режиме. Написать4 передает одну команду 4 бит, в то время записи 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 
} 

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

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