2840|4

932

帖子

3

TA的资源

纯净的硅(中级)

楼主
 

GD32E230C显示变量 [复制链接]

    写了一个函数,作用是将变量以十进制方式显示在LCD上,调试这个函数却花费了不少时间,一直都是三位数可以正常显示,大于三位数则显示不正常,反反复复检查代码都没有效果,一上午很快就过去了,下午继续调试时忽然发现是数据类型的问题,原来我将倍数变量定义成字符型了,最大仅能表示255(即三位数),后来将这个变量类型修改成32位的,顺利地解决了问题。下图是用不同位数显示同一变量:


下面是程序代码:
  1. /****************************************************************
  2. * 显示变量函数display_value()
  3. * 输入参数:开始显示(左上角)坐标:x,y,(uint16_t)
  4. *           前景色,背景色,(White,Black,Red,Green,Blue,Yellow)
  5. *           变量,(uint32_t)
  6. *           显示长度(不含小数点),小数位数,(uint8_t)
  7. *           前导0(0=显示,1=空格)
  8. *****************************************************************/
  9. void display_value(uint16_t x,uint16_t y,uint16_t fc,uint16_t bc,uint32_t v,uint8_t l,uint8_t b,uint8_t z)
  10. {
  11.     unsigned char i,j,m;
  12.     unsigned short k,x0;
  13.         uint32_t u,n;
  14.        
  15.     x0 = x;
  16.         u = v;
  17.         z = z > 0 ? 0: 16;            //前导0:z=16;前空格:z=0

  18.         n = 1;
  19.         for(j = 1; j < l; j++)        //计算倍数
  20.         n = n * 10;
  21.        
  22.         LCD_CS_CLR;                   //选择LCD
  23.         for(m = l;m > 0;m --)         //开始分拆变量
  24.         {

  25.                 k = u / n;                //当前位数字
  26.                 u = u - (k * n);          //剩余数字
  27.                 if(k > 0) z = 16;         //只要有一位数字>0,之后不能显示空格
  28.                 if(m == 1) z = 16;        //小数点之前的'0'显示
  29.                 n = m < 2 ? 1: n / 10;    //计算当前的倍数
  30.         
  31.         if((m == b) & (m > 0))    //显示小数点
  32.                 {
  33.                     for(i = 0;i < 16;i ++){
  34.                         for(j = 0;j < 8;j ++){
  35.                     if(asc16[14 * 16 + i] & (0x80 >> j))//从asc16[]数组中取字符.数据
  36.                         /* draw a point on the lcd */
  37.                         lcd_draw_point(x + j,y + i,fc);
  38.                     else{
  39.                         if(fc != bc)
  40.                             /* draw a point on the lcd */
  41.                             lcd_draw_point(x + j,y + i,bc);
  42.                     }
  43.                                 }
  44.                         }
  45.                         x += 8;
  46.                 }
  47.                
  48.             for(i = 0;i < 16;i ++){    //显示字符(k=字符序号)
  49.             for(j = 0;j < 8;j ++){
  50.                 if(asc16[(k+z) * 16 + i] & (0x80 >> j))//从asc16[]数组中取字符数据
  51.                     /* draw a point on the lcd */
  52.                     lcd_draw_point(x + j,y + i,fc);
  53.                 else{
  54.                     if(fc != bc)
  55.                         /* draw a point on the lcd */
  56.                         lcd_draw_point(x + j,y + i,bc);
  57.                 }
  58.             }
  59.                 }
  60.         x += 8;

  61.         }
  62.         LCD_CS_SET;
  63. }
复制代码







此帖出自GD32 MCU论坛

最新回复

并且这类错误检查起来还不好检查  详情 回复 发表于 2019-2-26 13:34
点赞 关注
 

回复
举报

3416

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
支持一下,我的撸回来还没上过电,惭愧
此帖出自GD32 MCU论坛
 
个人签名

So TM what......?

 

 

回复

6366

帖子

4913

TA的资源

版主

板凳
 
这种错误一般都犯过,我也犯过几次这种错误
此帖出自GD32 MCU论坛

点评

是啊,按理这类低级错误不应该犯,但却很容易犯,我已经是屡犯了。  详情 回复 发表于 2019-2-26 12:05
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

4
 
tiankai001 发表于 2019-2-26 09:25
这种错误一般都犯过,我也犯过几次这种错误

是啊,按理这类低级错误不应该犯,但却很容易犯,我已经是屡犯了。
此帖出自GD32 MCU论坛

点评

并且这类错误检查起来还不好检查  详情 回复 发表于 2019-2-26 13:34
 
 
 

回复

6366

帖子

4913

TA的资源

版主

5
 
hujj 发表于 2019-2-26 12:05
是啊,按理这类低级错误不应该犯,但却很容易犯,我已经是屡犯了。

并且这类错误检查起来还不好检查
此帖出自GD32 MCU论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表