首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用txt文件中的换行符将lcd光标移到下一行?

如何使用txt文件中的换行符将lcd光标移到下一行?
EN

Stack Overflow用户
提问于 2019-01-21 02:19:51
回答 1查看 513关注 0票数 0

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

我已经使用pySerial串行读取了txt文件中的字符。我已经做了适当的编码,并在Windows10上运行。我还将字符逐个写到UART上。这是代码的一部分,它使用必要的编码进行串行写入。我不确定这是不是我错的地方。

代码语言:javascript
复制
with open(args.file) as f:
        for line in f:
            for ch in line:
                serialPort.write(ch.encode())

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

代码语言:javascript
复制
    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);
        }       
    }

传输到串口的串行数据的格式为'11,23,8\nC1,A5,F3 #‘散列表示串行数据的结束。

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

11、23、8

C1、A5、F3

任何帮助都是非常感谢的。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-01-30 01:45:32

似乎append函数没有按原样接受换行符。这是我如何解决我的问题的。

代码语言:javascript
复制
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)进行了比较,如果发现相等,则跳过该字符并将光标移动到lcd显示屏的第二行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54279511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档