打印
[STM8]

lcd1602乱码

[复制链接]
2277|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyjie|  楼主 | 2021-8-8 18:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近在弄一个lcd1602方面的程序,stm8单片机接收串口信息显示到1602上。数据格式为D1xxxxxxxxxxxxxxxx,固定D1开头,1602显示后面16位信息。结果接受第一个数据显示正常,显示第二个数据,另一行就花屏。

使用特权

评论回复
沙发
llljh| | 2021-8-8 18:17 | 只看该作者
相关的程序?

使用特权

评论回复
板凳
wyjie|  楼主 | 2021-8-8 18:21 | 只看该作者
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挂起标志
   
   
   
  }
  
  
}

使用特权

评论回复
地板
pengf| | 2021-8-8 18:21 | 只看该作者
上个图

使用特权

评论回复
5
wyjie|  楼主 | 2021-8-8 18:26 | 只看该作者
只有显示串口接收到的数据会乱码,显示别的内容就正常

使用特权

评论回复
6
wyjie|  楼主 | 2021-8-8 18:30 | 只看该作者

使用特权

评论回复
7
jlyuan| | 2021-8-8 18:32 | 只看该作者
你收到的数据是什么数据,要写入的必须是ASCII编码。

使用特权

评论回复
8
wyjie|  楼主 | 2021-8-8 18:35 | 只看该作者
数据是没问题的,我看过了

使用特权

评论回复
9
wyjie|  楼主 | 2021-8-8 18:38 | 只看该作者
第一次的数据显示正常,第二组数据显示就会有乱码了?

使用特权

评论回复
10
wyjie|  楼主 | 2021-8-8 18:40 | 只看该作者
例如第一次发D143.5000000000000,显示正常,第二次发D144.0000000000000就会出现上面的乱码。

使用特权

评论回复
11
wyjie|  楼主 | 2021-8-8 18:42 | 只看该作者
刚才试了下同时显示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");
           
         }
就不会有乱码,

使用特权

评论回复
12
huangchui| | 2021-8-8 18:45 | 只看该作者
不要同时在ISR和main里面操作LCD这类外设。

使用特权

评论回复
13
wyjie|  楼主 | 2021-8-8 18:49 | 只看该作者
请教一下,要怎么改比较好。刚才我把中断里面的清屏去掉了,好像加不加都一样。

使用特权

评论回复
14
zhenykun| | 2021-8-8 18:52 | 只看该作者
你要先清理要写的行后再写就好了。

使用特权

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

使用特权

评论回复
16
wyjie|  楼主 | 2021-8-8 18:59 | 只看该作者
试过了,一样会有乱码。很奇怪只有显示接收到的串口才会有乱码。
例如这样写就不会有乱码
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);     
}

使用特权

评论回复
17
wyjie|  楼主 | 2021-8-8 19:01 | 只看该作者
如果是显示串口接收到的内容,例如我在pc上用串口助手发一个数据,显示正常,再发第二个数据就会出上面图里的乱码。

使用特权

评论回复
18
heweibig| | 2021-8-8 19:02 | 只看该作者
不管刷新前有没有清屏都有乱码?

使用特权

评论回复
19
yszong| | 2021-8-8 19:04 | 只看该作者
首先中断里不要去操作屏,除非专门措施,防止与主循环的操作有冲突,这是基本的问题

使用特权

评论回复
20
zwll| | 2021-8-8 19:08 | 只看该作者
其次可能是时序不严谨造成的

使用特权

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

本版积分规则

927

主题

12706

帖子

5

粉丝