[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测评报告】06.日期时间及温湿度动态显示的试验

[复制链接]
 楼主| hu9jj 发表于 2021-4-6 16:17 | 显示全部楼层 |阅读模式
#申请原创#
    本次测试的计划是做一个带有定时功能的时钟,原来计划使用DS1307来作计时,但测试了多天,从DS1307读出的数据都不正确,而这个驱动代码是从其他项目中移植过来的,之前也正常使用,但不知道是在移植过程中出了什么问题造成的,为了测试大字体的显示效果,我就自己编写了一段简易的计时和日历计算代码暂时代替DS1307的功能。
    动态显示是每秒刷新一次,依次按照年份、月日、时分秒、湿度和温度等四组数据动态分别显示,测试时的照片如下:


    这是测试过程的视频动画:



    屏幕最底一行用小字体显示了湿度、温度、日期及时间信息,也是每秒刷新一次,与大字体显示的内容相同。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| hu9jj 发表于 2021-4-6 18:26 | 显示全部楼层
    不知是什么原因,在显示变量数值时,同样的代码,在用常规5*7点阵字库显示时正常,但在用24*40点阵字库显示时却不正常。在显示四位数的年号时,用小字体显示就不会出错,而用大字体显示则出错,2021显示为0229。2021对应的十六进制是0x7E5,而0229对应的十六进制是0xE5,恰恰“遗失”了16位变量的高8位。
    下面是使用5*7点阵字库的变量显示函数:
  1. /*********************************************
  2. * 函数名称:LCD_write_value
  3. * 函数功能:显示变量字符5*7(8)或7*12(16)
  4. * 入口参数:x,y,L,D,N,val :座标、长度、小数、前导零(1显示 0不显示)、负号(1显示 0不显示)、变量
  5. * 出口参数:无                编号(行号)
  6. * 备注:ASCII码表的数组ASC_5[95][8]来寻址
  7. *********************************************/
  8. void LCD_write_value(uint8_t X,uint8_t Y,uint8_t L,uint8_t D,uint8_t Z,uint16_t val)
  9. {
  10.     uint8_t i,j,f = 0;            //列循环、字循环、显示标志
  11.     uint16_t t,cid;               //当前余数、当前数字
  12.     uint32_t n;                   //当前倍数

  13.     t = val;
  14.     n = 1;
  15.     if(Z == 1)
  16.         f = 16;                   //空格=0,“0”=16
  17.     for (j = 0; j < L; j++)
  18.         n = n * 10;
  19.    
  20.     LCD_set_XY(X,Y);                      //定位(左上角)

  21.     for (j = L; j > 0; j--)       //字符循环开始
  22.     {
  23.         n = j < 2 ? 1: n / 10;    //计算当前的倍数
  24.         cid = t / n;              //当前位数字
  25.         t = t - (cid * n);

  26.         if ((cid > 0)|(j-1 == D)) //显示字符0
  27.             f = 16;       
  28.                
  29.         for ( i=0; i<5; i++)      //写一个5*7字符
  30.         {
  31.             WriteData(ASC_5[cid + f][i],1);
  32.         }
  33.         if ((D>0) & (D==(j - 1)))
  34.         {
  35.             for ( i=0; i<5; i++)  //写小数点
  36.             {
  37.                 WriteData(ASC_5[14][i],1);
  38.             }
  39.         }
  40.         else
  41.             if(j>1) WriteData(0x00,1);//插入空列
  42.     }
  43. }


    这是使用24*40点阵字库的变量显示函数,这个函数代码是从上面的函数中改写过来的:
  1. /*********************************************
  2. * 函数名称:LCD_write_GT_value
  3. * 函数功能:显示变量字符24*40
  4. * 入口参数:x,y,L,D,N,val :座标、长度、前导零(1显示 0不显示)、变量
  5. * 出口参数:无                编号(行号)
  6. * 备注:大字体显示24*40
  7. *********************************************/
  8. void LCD_write_GT_value(uint8_t X,uint8_t Y,uint8_t L,uint8_t Z,uint16_t val)
  9. {
  10.     uint8_t i,j,f;                //列循环、字循环、显示标志
  11.     uint16_t t,cid;               //当前余数、当前数字
  12.     uint32_t n;                   //当前倍数

  13.     t = val;
  14.     n = 1;
  15.     f = Z;                        //空格=0,“0”=16
  16.     for (j = 0; j < L; j++)
  17.         n = n * 10;
  18.    
  19.     for (j = L; j > 0; j--)       //字符循环开始
  20.     {
  21.         n = j < 2 ? 1: n / 10;    //计算当前的倍数
  22.         cid = t / n;              //当前位数字
  23.         t = t - (cid * n);

  24.         if ((cid > 0)|(j-1 == L)) //显示字符0
  25.             f = 1;       
  26.                 if(f>0)
  27.             LCD_write_ASC_GT(X+(L-j)*24,Y,cid);
  28.     }
  29. }



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

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1063

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1063

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部