Взаимодействие 16x2 LCD с SPI, ввод персонажей во второй ряд

Я использую микроконтроллер MSP430 для считывания аналоговых сигналов и отображения результатов на ЖК-дисплее с подключением SPI. ЖК-дисплей 16x2 подключен в соответствии с данными о подключении SPI в техническом описании и использует драйвер Hitachi HD44780. Я могу заполнить 16 символов первого ряда без проблем. Когда я перехожу на 16, последний символ не отображается (как и ожидалось), даже если я расширяю массив char, содержащий строку, которую я хочу напечатать. Проблема в том, что во втором ряду ничего не отображается. Когда в позиции в первом ряду нет символов, во всех позициях все еще остается слабый фон, но во втором ряду всегда постоянно пусто. Ниже приведены функции, которые используются в печати. Что я делаю неправильно?

Я знаю, что проводка правильная, а ЖК-дисплей исправен. Чтобы проверить это, я подключил дисплей к arduino для тестирования, так как код стал намного проще, и я смог отображать символы в строчных рядах. Неописательные переменные определяются исходными файлами MSP430 и включают в себя регистры, буферы и другие элементы управления для перевода устройства в режим связи SPI.

void AlignLaserTarget()
{

    int i,k, j;
    struct testResults *ptestResults;
    char mess1[17]; //changed from 8 to hold 16 characters

    ptestResults=getTestResults();

    // reset global vars
    timeI1=0;
    timeA=0;
    i=starResults.ch1Amplitude; //analog integer value to be printed on LCD
    j=starResults.ch2Amplitude; //same
    k=starResults.ch3Amplitude; //same, but should go in second row
    sprintf(mess1,"1:%i 2:%i", i, j);
    stringTo_lcd8( mess1);
}

void stringTo_lcd8( char* lcdString )
{
    int i;

        LCD_COMMAND_MODE;       // display code
        timer_us(20);
        write_lcd8( 0x01); // clear display
        timer_ms(2);
        LCD_DATA_MODE; //enable data sending pin

        for ( i=0; *lcdString !=0 ; ++i)
        {
            write_lcd8( *lcdString);
            ++lcdString;
        }                       // end of display code

        timer_us(10000);    // 10ms delay . should not be needed as normal interval between counts is at least 75 ms or 12 in. at 800ft/min rate
}
//*******************************************************

void write_lcd8( unsigned char lcdbyte)
{
      UCA0IFG &= ~UCTXIFG;  // CLEAR FLAG
      UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
      UCA0CTL0 = UCMST+UCSYNC+ UCMSB+ UCCKPH;
      UCA0BR0 = 0x80;                           // /hex80
      UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
      timer_us(100);
        LCD_CHIP_ENABLE;            // LCD enable pin output
        timer_us(20); // added trp
        UCA0TXBUF =lcdbyte;
        timer_us(150);
        while (!(UCA0IFG&UCTXIFG));
        UCA0IFG &= ~UCTXIFG;  // CLEAR FLAG
        LCD_CHIP_DISABLE;
        timer_us(30);
          UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
          UCA0CTL0 |= UCMST+UCSYNC+ UCMSB+ UCCKPH;
          UCA0BR0 = 0x02;                           // /2
          UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**

}

2 ответа

Решение

HD44780 ожидает 40 символов в строке, поэтому я просто добавил пробелы для заполнения первого ряда, а затем написал символы для следующего ряда. Я уверен, что есть лучшее решение, но это было быстро, и это сработало. Мне также пришлось изменить спецификации инициализации для двухстрочной конфигурации.

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

void Lcd8_Set_Cursor(char line, char col)
{
    if(line == 1)
      Lcd8_Cmd(0x80 + col);
    else if(line == 2)
        Lcd8_Cmd(0xC0 + col);
}

Затем используйте то же самое в вашей логике печати. Когда длина превышает 16, вы можете переключать строки и начинать писать.

Другие вопросы по тегам