[PIC®/AVR®/dsPIC®产品]

【CuriosityNano测评报告】06.日期时间及温湿度动态显示的试验

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

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


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


使用特权

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

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

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

        if ((cid > 0)|(j-1 == D)) //显示字符0
            f = 16;       
               
        for ( i=0; i<5; i++)      //写一个5*7字符
        {
            WriteData(ASC_5[cid + f][i],1);
        }
        if ((D>0) & (D==(j - 1)))
        {
            for ( i=0; i<5; i++)  //写小数点
            {
                WriteData(ASC_5[14][i],1);
            }
        }
        else
            if(j>1) WriteData(0x00,1);//插入空列
    }
}


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

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

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



使用特权

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

本版积分规则

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

144

主题

1031

帖子

11

粉丝