OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4889|回复: 6

怎么将串口的数据显示在LCD上

[复制链接]

9

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-7
在线时间
16 小时
发表于 2016-4-18 15:41:19 | 显示全部楼层 |阅读模式
5金钱
我用18B20读温度,再串口调试助手上显示正常,但是我想把数据显示在LCD上,应该怎么办啊?用的STM32单片机

最佳答案

查看完整内容[请看2#楼]

在LCD上动态显示数据,有几个要注意的地方 1:显示数据的长度要注意, 否则当数据变大小时, 由于长度的变化显出现新的显示内容与前面一次的显示内容都出现在屏幕上, 看起来不满意, 2:做一个全局全变, 记录一下前一次的显示数据, 每次更新显示时,都与这个值比较, 不相同则显示, 且更新这个全局变量, 相同就不用更新显示了, 这样, 程序不会每次都毫无意义的更新显示屏, 消除显示闪乐现像。 给你几个函数 /* ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3340
金钱
3340
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-4-18 15:41:20 | 显示全部楼层
本帖最后由 likunxue 于 2016-4-18 17:46 编辑

在LCD上动态显示数据,有几个要注意的地方

1:显示数据的长度要注意, 否则当数据变大小时, 由于长度的变化显出现新的显示内容与前面一次的显示内容都出现在屏幕上, 看起来不满意,
2:做一个全局全变, 记录一下前一次的显示数据, 每次更新显示时,都与这个值比较, 不相同则显示, 且更新这个全局变量, 相同就不用更新显示了, 这样, 程序不会每次都毫无意义的更新显示屏, 消除显示闪乐现像。

给你几个函数

/********************************************************************************************
函 数 名: 有符号整数转换为字符串函数,高位为0,则不显示
调    用: CX_printh(u8 *str, s32 Dat,u8 len)
参    数: *str  字符串转换后保存的首地址
          Dat:数值(+-0~4294967295);
          len:长度(即要显示的位数,最大只转换8位有效值)
返 回 值: 转换结果保存 字符串指针所指向的地址中
********************************************************************************************/
void CX_printh(u8 *str, s32 Dat,u8 len)
     {   
     u8 i,tem,at,af;
     at = 0; //清标志位
     af = 0; //清标志位
     if(len>10)len=10;
     if(Dat < 0){Dat =-Dat; *str = '-'; str++; af = 0xff;}//如果是负数,先转为正数,并装入符号位                                          
     for(i=0;i<len;i++)
        {
        tem=(Dat/CX_pow(10,len-i-1))%10;//取得当前位数字
        if(tem == 0){if(at != 0){*str = 0x30; str ++;}}
        else{
            at = 0xff; //置标位位
            *str = tem + 0x30;
            str ++;
            }
        }
     if(at == 0 && af == 0xff)
       {
       str --;
       *str = '0';
       str ++;
       }
     else{
         if(at == 0 && af ==0){*str = '0'; str ++;}
         }
     *str = '\0'; //写入结束符号
     }
/********************************************************************************************
函数名:浮点数转化为字符串函数
调  用:CX_printf(*str, float Fdat,u8 Hc,u8 Fl);
参  数:*str 字符串转换后保存的首地址
        Fdat:数值(+-0.0005~999999.9999);         
        Hc:整数长度(即要显示的位数)
        Fl:小数长度(即要显示的位数)
返回值:转换结果保存 字符串指针所指向的地址中
********************************************************************************************/
void CX_printf(u8 *str, float Fdat,u8 Hc,u8 Fl)
     {  
     u32 const Pow[]={1,10,100,1000,10000,100000,10000000,100000000,1000000000};
     u32 Dat1, Dat2;
     u8 i,tem,at;
     if(Fdat < 0){Fdat = -Fdat;        *str ='-'; str ++; }
     if(Hc>8)Hc=8; //限制整数部份最多8个位
     if(Fl>4)Fl=4; //限制小数部份最多4个位的精度
     Dat1 = Fdat;  //取整数部份
     Dat2 = (Fdat-Dat1) * Pow[Fl];//取小数部份并将其转换为整数
     i = ((Fdat-Dat1)*Pow[Fl+1])- Dat2 *10; //四舍五入处理
     if(i>=5)
       {
       Dat2 += 1;
       if(Dat2 ==Pow[Fl]){Dat2 =0;Dat1 += 1;}
       }
     at = 0; //清标志位
     for(i=0;i<Hc;i++)        //处理整数部份
        {
        tem = (Dat1/Pow[Hc-i-1])%10; //取得当前位数字
        if(tem == 0){if(at != 0){*str = 0x30; str ++;}}
        else{
            at = 0xff; //置标位位
            *str = tem + 0x30;
            str ++;
            }
        }
     if(at == 0){*str = 0x30; str ++;}  //如果整数部份为零则补零
     *str = '.'; //写入小数点
     str ++;
     for(i=0;i<Fl;i++)          //处理小数部份
        {
        tem = (Dat2/Pow[Fl-i-1])%10; //取得当前位数字
        *str = tem + 0x30;
        str ++;
        }
     *str = '\0' ; //装入结束符号
     }
/********************************************************************************************
函 数 名: 浮点数转换为字符串函数,位数不足用空格补充
调    用: CX_printh(u8 *str, s32 Dat,u8 len)
参    数: *str 转换数据保存的数据缓存区指针
          Dat:数值(+-0~4294967295);
          K 数据类型 0整数, 其它浮点数
          len:长度(即要显示的位数,最大只转换8位有效值)
返 回 值: 转换结果保存 字符串指针所指向的地址中
********************************************************************************************/
void CX_print_out(u8 *str, float Dat,u8 k, u8 len)
     {      
     u8 i,tem,Br[12];     
     if(len >10) len = 10; //最多转换10个数           
     for(i=0; i<len; i++ )str=0x20;
     if(k ==0)CX_printh(Br,Dat,5);//将数字转为字符串
     else CX_printf(Br,Dat,3,2);
     tem = CX_strlen(Br);
     if(tem <len) str += len-tem;
     for(i=0; i<len; i++ )
        {
        *str = Br;
        str ++;
        }
     *str = '\0'; //写入结束符号
     }



程序调用的方法
u8 Bi[20];   定义一个数组
s32 Mai, Mx;
Mai = 0xffffffff;
while(1)         
      {
      Mx = xxxxxxxxxxxx();  //调用你的读取函数, 取得你要显示的参数
      if(Mxi != Mai)        
        {
        Mai = Mxi; //存副本
       CX_print_out(Br,Mai,0,5); //将参数转化为按规定的数据格式(字符串)
       LCD_word(74,0,(const char *)SM);//显示数据到指定的坐标上 (这个函数用你的函数)
       }
   }



回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11475
金钱
11475
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-4-18 16:01:59 | 显示全部楼层

串口和你这事没关系。

先学会LCD怎么操作。

回复

使用道具 举报

9

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-7
在线时间
16 小时
 楼主| 发表于 2016-4-18 16:37:00 | 显示全部楼层
xuande 发表于 2016-4-18 16:01
串口和你这事没关系。

先学会LCD怎么操作。

我会显示静态的字符,动态的变量就不会了,
回复

使用道具 举报

9

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-7
在线时间
16 小时
 楼主| 发表于 2016-4-18 16:37:30 | 显示全部楼层
xuande 发表于 2016-4-18 16:01
串口和你这事没关系。

先学会LCD怎么操作。

我会显示静态的字符,动态的变量就不会了,
回复

使用道具 举报

9

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-7
在线时间
16 小时
 楼主| 发表于 2016-4-18 16:37:50 | 显示全部楼层
xuande 发表于 2016-4-18 16:01
串口和你这事没关系。

先学会LCD怎么操作。

我会显示静态的字符,变量就不会了,
回复

使用道具 举报

9

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-3-7
在线时间
16 小时
 楼主| 发表于 2016-4-18 23:07:43 | 显示全部楼层
likunxue 发表于 2016-4-18 17:36
在LCD上动态显示数据,有几个要注意的地方

1:显示数据的长度要注意, 否则当数据变大小时, 由于长度的 ...

谢谢了,我自己也弄出来了,还是感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 00:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表