【问题标题】:How do I make use of the newline character from my txt file to get the lcd cursor to the next line?如何利用 txt 文件中的换行符将 lcd 光标移至下一行?
【发布时间】:2019-06-14 05:25:14
【问题描述】:

我正在编写一个程序来从 .txt 文件中读取字符并将这些数据串行发送到 MCU ATMEGA2560 的 UART。此单片机所附的液晶显示器应逐行显示字符。一旦遇到换行符“\n”,.txt 行的下一行应打印在 LCD 显示屏的下一行中。现在我在这里面临的问题是,虽然我能够在 LCD 上一个接一个地打印字符,但换行符不会将光标移动到下一行的开头。取而代之的是一个日文(或者我不确定)字符被打印在它的位置,下一行的字符被打印在与其他字符相同的行上。我只需要帮助 LCD 将换行符视为命令/请求,以便光标移动到下一行,而不是在同一行上打印随机特殊字符。

我已经使用 pySerial 从 txt 文件中连续读取了字符。我已经完成了适当的编码并在 Windows 10 上运行。我还将字符一一写入 UART。这是使用必要编码进行串行写入的代码的一部分。我不确定这是否是我要去的地方。

with open(args.file) as f:
        for line in f:
            for ch in line:
                serialPort.write(ch.encode())

来到 C 代码,数据是串行接收的,接收到的字符存储在一个变量中。我试过附加字符,但我认为这似乎是导致问题的原因。

    volatile unsigned char data;
    unsigned char h[] ;

    //Function to print string on LCD
    void lcd_string(char *str)
{
    while(*str != '\0')
    {
        lcd_wr_char(*str);
        str++;
    }
}
    void append(char* s, char c)
    {
        int len = strlen(s);
        s[len]=c;
        s[len+1]='\0';
    }

    SIGNAL(SIG_USART2_RECV)         // ISR for receive complete interrupt
    {
        data = UDR2;
        UDR2 = data;
        append(h,data);
    }

    //The main program which has to do the job. 

    int main(void)
    {   
        init_devices();
        lcd_set_4bit();
        lcd_init();
            while(1)
        {
            lcd_cursor(1,1);
            lcd_string(h);
        }       
    }

传输到 UART 的串行数据格式为 '11, 23, 8\nC1, A5, F3 #' 哈希表示串行数据结束。

在液晶显示屏上应显示如下:

11、23、8

C1、A5、F3

非常感谢任何帮助。谢谢。

【问题讨论】:

  • 试试回车?还是两者兼而有之?
  • The LCD display什么液晶显示器? lcd_set_4bit 看起来像 HD44780。 HD44780 具有设置光标位置的指定命令。熟悉他们。阅读 HD44780 和 arduino HD44780 库的文档。您可能必须手动处理换行符并将光标位置设置为下一行。
  • 没关系。我自己解决了这个问题。谢谢您的帮助。 :)
  • @KarthikNayak 然后标记为已解决并编辑或回答这个问题,也许有人会遇到同样的问题。
  • @dunajski 是的。更新。我猜我太忙于我的项目工作了。谢谢你。 :)

标签: c newline atmega lcd


【解决方案1】:

似乎 append 函数没有按原样接收换行符。这是我解决问题的方法。

ISR(USART2_RX_vect)     // ISR for receive complete interrupt
{
    data[count]= UDR2;
    UDR2 = data[count];
    if(data[count] == 0x0A)
    {
        lcd_cursor(2,1);
        pos = count;
        count++;
        flag = FALSE;
    }
    else if(count > pos && flag == FALSE)
    {
        lcd_wr_char(data[count]);
        x[a]=data[count];
        a++;
        count++;
        flag = FALSE;
    }
    else if(flag==TRUE)
    {
        lcd_wr_char(data[count]);
        y[b]=data[count];
        b++;
        count++;
        flag = TRUE;
    }
}

我将传入的数据与换行符十六进制值 (0x0A) 进行了比较,如果发现相等,则跳过该字符并将光标移动到液晶显示器的第二行。

【讨论】:

    猜你喜欢
    • 2015-06-20
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多