打印
[STM8]

lcd1602乱码

[复制链接]
1813|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
负熵|  楼主 | 2019-8-15 15:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 负熵 于 2019-8-15 16:32 编辑

最近在弄一个lcd1602方面的程序,stm8单片机接收串口信息显示到1602上。数据格式为D1xxxxxxxxxxxxxxxx,固定D1开头,1602显示后面16位信息。结果接受第一个数据显示正常,显示第二个数据,另一行就花屏。



相关的程序如下:
int main(void)
{
    //char str[16];
        //u8 c[17] = "12345678901234567";
        //char d[17] = "abcdefghijklmnop7";
   
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
   
    USART_Configuration();//串口初始化
    GPIO_Configuration();
    LCD1602_Init();
    LCD1602_ClearScreen();
        
      
        
        
        while(1)
        {
           LCD1602_Show_Str(0, 1, bluetooth_date);
           SysTick_Delay_Ms(100);
           //LCD1602_Show_Str(0, 0, c);
           //LCD1602_Show_Str(0, 0, "1234");
           
         }
     
        //LCD1602_Show_Str(2, 1, "TEST ");
}
中断程序
extern u8 bluetooth_date[16];
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
  
  
  u8 usart1_rxdata;                  
  
  if(UART1_GetITStatus(UART1_IT_RXNE) != RESET)
  {
    static u8 i,start1,star,start2=0;     //start1:检测第一个字符D,start2:检测第二个字符1
    u8 start3;                             
    usart1_rxdata = UART1_ReceiveData8();
    if (star==1)
    {
      bluetooth_date=usart1_rxdata;   
      i=i+1;
    }
    if (i>=16)
    {
      i=0;
      star=0;
      LCD1602_ClearScreen();
    }
   
   
   
    start3=usart1_rxdata;
    start1=start2;
    start2=start3;
   
   
    if ((start1=='D')&&(start2=='1'))
    {
      star=1;
      i=0;
     
    }
   
    //UART1_ClearITPendingBit(UART1_IT_RXNE);             //清除UART1挂起标志
   
   
   
  }
  
  
}


使用特权

评论回复
沙发
负熵|  楼主 | 2019-8-15 16:41 | 只看该作者
本帖最后由 负熵 于 2019-8-15 16:43 编辑

上个图,只有显示串口接收到的数据会乱码,显示别的内容就正常

使用特权

评论回复
板凳
xuanhuanzi| | 2019-8-15 17:07 | 只看该作者
你收到的数据是什么数据,要写入的必须是ASCII编码。

使用特权

评论回复
地板
负熵|  楼主 | 2019-8-15 17:49 | 只看该作者
xuanhuanzi 发表于 2019-8-15 17:07
你收到的数据是什么数据,要写入的必须是ASCII编码。

数据是没问题的,我用逻辑分析仪看过了。第一次的数据显示正常,第二组数据显示就会有乱码了。
例如第一次发D143.5000000000000,显示正常,第二次发D144.0000000000000就会出现上面的乱码。
刚才试了下同时显示2行就不会有乱码。
例如
  while(1)
        {
           LCD1602_Show_Str(0, 1, bluetooth_date);     
           LCD1602_Show_Str(0, 0, bluetooth_date);
           SysTick_Delay_Ms(100);
           //LCD1602_Show_Str(0, 0, c);
           //LCD1602_Show_Str(0, 0, "1234");
           
         }
就不会有乱码,

使用特权

评论回复
5
戈卫东| | 2019-8-15 18:04 | 只看该作者
不要同时在ISR和main里面操作LCD这类外设。

使用特权

评论回复
6
负熵|  楼主 | 2019-8-15 18:21 | 只看该作者
本帖最后由 负熵 于 2019-8-15 18:23 编辑
戈卫东 发表于 2019-8-15 18:04
不要同时在ISR和main里面操作LCD这类外设。

请教一下,要怎么改比较好。刚才我把中断里面的清屏去掉了,好像加不加都一样。

使用特权

评论回复
7
xuanhuanzi| | 2019-8-15 21:59 | 只看该作者
负熵 发表于 2019-8-15 17:49
数据是没问题的,我用逻辑分析仪看过了。第一次的数据显示正常,第二组数据显示就会有乱码了。
例如第一 ...

你要先清理要写的行后再写就好了。

使用特权

评论回复
8
xuanhuanzi| | 2019-8-15 22:00 | 只看该作者
比如你对某一行要更新内容,先清理要用到的区域,然后写。

使用特权

评论回复
9
负熵|  楼主 | 2019-8-16 09:35 | 只看该作者
xuanhuanzi 发表于 2019-8-15 22:00
比如你对某一行要更新内容,先清理要用到的区域,然后写。

试过了,一样会有乱码。很奇怪只有显示接收到的串口才会有乱码。
例如这样写就不会有乱码
int main(void)
{
    //char str[16];
        //u8 c[17] = "12345678901234567";
        
   
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
   
    USART_Configuration();//串口初始化
    GPIO_Configuration();
    LCD1602_Init();
    LCD1602_ClearScreen();
    LCD1602_Show_Str(0, 1, c);

    LCD1602_Show_Str(0, 1, c);   

    LCD1602_Show_Str(0, 1, c);     
}
如果是显示串口接收到的内容,例如我在pc上用串口助手发一个数据,显示正常,再发第二个数据就会出上面图里的乱码。不管刷新前有没有清屏都有乱码


使用特权

评论回复
10
ayb_ice| | 2019-8-16 11:24 | 只看该作者
本帖最后由 ayb_ice 于 2019-8-16 11:27 编辑

首先中断里不要去操作屏,除非专门措施,防止与主循环的操作有冲突,这是基本的问题

其次可能是时序不严谨造成的

使用特权

评论回复
11
dongnanxibei| | 2019-8-16 21:48 | 只看该作者
你这样测试:先将接收的内容存入一个字符串,然后用串口打印这个字符串观察。如果没问题,将这个字符串显示到LCD

使用特权

评论回复
12
负熵|  楼主 | 2019-8-17 17:36 | 只看该作者
本帖最后由 负熵 于 2019-8-17 17:42 编辑
ayb_ice 发表于 2019-8-16 11:24
首先中断里不要去操作屏,除非专门措施,防止与主循环的操作有冲突,这是基本的问题

其次可能是时序不严谨 ...

中断部分已经改了,没在中断中操作屏了,乱码依旧。
目前找到乱码规律是当第二行数据有改变的时候地一行就会出乱码。
例如这样不会有乱码。
int main(void)
{
    //char str[16];
        //u8 c[17] = "12345678901234567";
        
   
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
   
    USART_Configuration();//串口初始化
    GPIO_Configuration();
    LCD1602_Init();
    LCD1602_ClearScreen();

while (1)
   {
      LCD1602_Show_Str(0, 1, c);

    }   
}
这样写就会有乱码
int main(void)
{
         u8 a[16]="abcdefghijklmnop";
        u8 c[16] = "1234567890123456";
        
   
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
   
    USART_Configuration();//串口初始化
    GPIO_Configuration();
    LCD1602_Init();
    LCD1602_ClearScreen();

while (1)
   {
      LCD1602_Show_Str(0, 1, c);

LCD1602_Show_Str(0, 1, a);         //改变了第二行显示的内容,第一行出现乱码

    }   
}


使用特权

评论回复
13
小明的同学| | 2019-8-17 19:37 | 只看该作者
我觉得是编码的问题。

使用特权

评论回复
14
ayb_ice| | 2019-8-19 08:29 | 只看该作者
负熵 发表于 2019-8-17 17:36
中断部分已经改了,没在中断中操作屏了,乱码依旧。
目前找到乱码规律是当第二行数据有改变的时候地一行就 ...

直接显示第二行呢,不显示第一行

使用特权

评论回复
15
负熵|  楼主 | 2019-8-20 09:23 | 只看该作者
问题找到了,是数组的长度搞错了,16位字符应该设置到17的,少了个'\0'

使用特权

评论回复
16
tfqi| | 2019-9-13 11:36 | 只看该作者
字符库不兼容吧

使用特权

评论回复
17
qcliu| | 2019-9-13 11:49 | 只看该作者
刷新率高不高

使用特权

评论回复
18
wakayi| | 2019-9-16 15:17 | 只看该作者
是不是有外部干扰啊

使用特权

评论回复
19
wowu| | 2019-9-16 15:20 | 只看该作者
接地可靠吗

使用特权

评论回复
20
xiaoqizi| | 2019-9-16 15:38 | 只看该作者
如果只显示一行呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

78

帖子

0

粉丝