OpenEdv-开源电子网

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

oled显示时钟

[复制链接]

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
发表于 2016-4-15 09:39:16 | 显示全部楼层 |阅读模式
5金钱
先上图片,在 描述问题,我用OLED做一个时钟,秒显示不太正常,具体现象是 :走完59秒后 分钟可以加1,但秒走完59后,秒就成了09 19 29 39 49 59 69 79 89 99  10 11 12 13 14 15 16 17 .....59。
2F3770EFAA0F6F0ED59CEA14718A2029.jpg
BA86431EAFE55143E860FC837590BC60.jpg

最佳答案

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

这是数值显示的问题,比如实际是09的时候,你的程序没有确定数值位数,它只在显示坐标位置显示“9”,而不是 “空格9";所以59之后,只更新了第一位,变成09 19………… 自己写一个函数吧,用于更新数值,需要给定数值宽度。给你一个参考,我的显示是一个串行通信屏,但算法是通用的: [mw_shl_code=cpp,true]/**************************************************************************** * 名 称: DisNumber() * ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

276

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2014-6-20
在线时间
146 小时
发表于 2016-4-15 09:39:17 | 显示全部楼层
本帖最后由 313668972 于 2016-4-15 12:55 编辑

这是数值显示的问题,比如实际是09的时候,你的程序没有确定数值位数,它只在显示坐标位置显示“9”,而不是 “空格9";所以59之后,只更新了第一位,变成09 19…………
自己写一个函数吧,用于更新数值,需要给定数值宽度。给你一个参考,我的显示是一个串行通信屏,但算法是通用的:

[mw_shl_code=cpp,true]/****************************************************************************
* 名    称: DisNumber()
* 功    能: 设置控件的数值
* 入口参数: x,显示数值的X坐标
* 入口参数: y,显示数值的Y坐标
* 入口参数: back    背景色使能
* 入口参数: font    字库编码

* 入口参数: Number,显示的数值
* 入口参数: param_len,参数长度
* 入口参数: Float_param,不为0,表示输入的参数为浮点数,倒数Float_param位为小数位
* 入口参数: TopZero,为1,则说明需要显示开始的0
* 出口参数: 无
****************************************************************************/

void DisNumber(unsigned int x,unsigned int y,unsigned char back,unsigned char font,unsigned long Number,unsigned char param_len,unsigned char Float_param,unsigned char TopZero)
{
        unsigned long i=1;                                //i:用于对数据进行处理,取出对应的位
        unsigned char j=0,k=0;//,l=0;                //j:用于依次显示数据,其大小等于数据长度
        SendBeginCMD();                                        //k:用于标示是否显示到第一个非0数据,如果未检测到,为0,检测到为1
        SendData(0x20);                                        //l:
        SendChar((x>>8)&0xff);
        SendChar(x&0xff);
          SendChar((y>>8)&0xff);
          SendChar(y&0xff);
          SendChar(back);
          SendChar(font);
        j=param_len;
        while(j){i=i*10;j--;}
        i=i/10;
        for(j=param_len;j>0;j--)                //依次从高至低位显示数据
        {
                if((Float_param!=0)&&(j==Float_param))                //当前已经显示到了小数位,则在指定的小数位显示小数点,         
                {                 
                        SendData('.');
                }
                if(k==0&&((Number/i)%10)==0&&TopZero==0)          //如果还没有遇到第一个非0数、本次数据不为非0、开始的非0数据不显示
                {
                        if(j==Float_param+1){k=1;SendData(0x30);}        //如果当前显示的数据已经为小数点前一位,则使其显示0
                                                                                                                //如果没有小数位,当数据为0时,显示0
                        else{SendData(' ');}                                         //如果需要显示的第一位就为0(数据没有预料中的大),则显示空格以填充空间
                }
                else
                {
                        SendData(((Number/i)%10)+0x30);        k=1;        //如果检测到第一个不为0的位,则之后的0都需要进行显示
                }
                i=i/10;
        }
        SendEndCmd();
}[/mw_shl_code]

回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-4-15 09:43:51 | 显示全部楼层

时间数值从哪里来的,
是读取RTC、直接显示,
还是自己做定时器、然后加一、进位、自己算?

这些背景必须交代清楚。

回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-4-15 10:44:39 | 显示全部楼层
问题应出在算法上吧
回复

使用道具 举报

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
 楼主| 发表于 2016-4-15 11:59:55 | 显示全部楼层
读取RTC
回复

使用道具 举报

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
 楼主| 发表于 2016-4-15 12:00:27 | 显示全部楼层
xuande 发表于 2016-4-15 09:43
时间数值从哪里来的,
是读取RTC、直接显示,
还是自己做定时器、然后加一、进位、自己算?

移植正点原子的读取RTC
回复

使用道具 举报

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
 楼主| 发表于 2016-4-15 12:09:55 | 显示全部楼层
xuande 发表于 2016-4-15 09:43
时间数值从哪里来的,
是读取RTC、直接显示,
还是自己做定时器、然后加一、进位、自己算?

OLED_DispChar(20,36,':',&tFont16);        
     OLED_DispChar(42,36,':',&tFont16);                        
           OLED_DispNum(2,36,calendar.hour,&tFont16);
           OLED_DispNum(28,36,calendar.min,&tFont16);
                 OLED_DispNum(52,36,calendar.sec,&tFont16);   
                OLED_DispStr(16,52,  "电子协会", &tFont12);     
回复

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2016-4-15 12:17:49 来自手机 | 显示全部楼层
没有清屏的原因
回复

使用道具 举报

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
 楼主| 发表于 2016-4-15 12:30:55 | 显示全部楼层

额  那我试试、。
回复

使用道具 举报

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
 楼主| 发表于 2016-4-15 12:38:48 | 显示全部楼层
                OLED_ClrScr(0);               //清屏
        while(1)
        {                       
                if(t!=calendar.sec)
                {
                t=calendar.sec;
                OLED_DispNum(2,0,calendar.w_year,&tFont16);   //ÏÔê¾Äê       
                OLED_DispStr(42, 0,  "年", &tFont16);      //ÏÔê¾Äê ÎÄ×Ö       
                OLED_DispNum(60,0,calendar.w_month,&tFont16);   //ÏÔê¾ÔÂ
                OLED_DispStr(72, 0,  "月", &tFont16);      //ÏÔê¾Ô ÎÄ×Ö               
                OLED_DispNum(86,0,calendar.w_date,&tFont16);   //ÏÔê¾èÕ
                OLED_DispStr(104, 0,  "日", &tFont16);      //ÏÔê¾èÕ ÎÄ×Ö       
                        switch(calendar.week)
                        {
                                case 0:
                    OLED_DispStr(16, 16,  "sunday", &tFont16);      //ÏÔê¾ÎÄ×Ö
                                        break;
                                case 1:                       
                                 OLED_DispStr(16, 16,  "Monday", &tFont16);      //ÏÔê¾ÎÄ×Ö
                                        break;
                                case 2:
                                 OLED_DispStr(16, 16,  "Tuesday", &tFont16);      //ÏÔê¾ÎÄ×Ö
                                        break;
                                case 3:                                       
                                 OLED_DispStr(16, 16,  "Wednesday", &tFont16);      //ÏÔê¾ÎÄ×Ö
                                        break;
                                case 4:
                                 OLED_DispStr(16, 16,  "Thursday", &tFont16);      //ÏÔê¾ÎÄ×Ö
                                        break;
                                case 5:
                                 OLED_DispStr(16, 16,  "Friday", &tFont16);      //ÏÔê¾ÎÄ×Ö
                                        break;
                                case 6:
                                 OLED_DispStr(16, 16,  "Saturday", &tFont16);      //ÏÔê¾ÎÄ×Ö
                                        break;  
                        }                 
                 OLED_DispChar(20,36,':',&tFont16);         //ÏÔê¾×Ö·û       
     OLED_DispChar(42,36,':',&tFont16);         //ÏÔê¾×Ö·û                       
           OLED_DispNum(2,36,calendar.hour,&tFont16); //ÏÔê¾ê±
           OLED_DispNum(28,36,calendar.min,&tFont16); //ÏÔê¾·Ö       
                 OLED_DispNum(52,36,calendar.sec,&tFont16);   //ÏÔê¾Ãë               
                OLED_DispStr(16,52,  "电子协会", &tFont12);      //ÏÔê¾ÎÄ×Ö
                }                
                Delay(50);
}
       
回复

使用道具 举报

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
 楼主| 发表于 2016-4-15 12:39:08 | 显示全部楼层
也不能解决。
回复

使用道具 举报

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
 楼主| 发表于 2016-4-15 13:09:31 | 显示全部楼层
313668972 发表于 2016-4-15 12:47
这是数值显示的问题,比如实际是09的时候,你的程序没有确定数值位数,它只在显示坐标位置显示“9”,而 ...

谢谢        
回复

使用道具 举报

13

主题

276

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2014-6-20
在线时间
146 小时
发表于 2016-4-15 13:16:03 | 显示全部楼层

希望能解决你的问题
回复

使用道具 举报

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
 楼主| 发表于 2016-4-15 13:22:41 | 显示全部楼层

已经解决了。
         OLED_DispNum(52,36,calendar.sec%60/10,&tFont16);   //显示秒       
                 OLED_DispNum(52+8,36,calendar.sec%60%10,&tFont16);   //显示秒
回复

使用道具 举报

13

主题

276

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2014-6-20
在线时间
146 小时
发表于 2016-4-15 13:43:25 | 显示全部楼层
huxinwang 发表于 2016-4-15 13:22
已经解决了。
         OLED_DispNum(52,36,calendar.sec%60/10,&tFont16);   //显示秒       
                 OLED_DispNum(52+8 ...


你这也是方法之一,最简单不过如此,注意其他位也会有同样的问题
回复

使用道具 举报

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
 楼主| 发表于 2016-4-15 16:27:02 | 显示全部楼层
313668972 发表于 2016-4-15 13:43
你这也是方法之一,最简单不过如此,注意其他位也会有同样的问题

其他位没有,就只有秒,谢谢你的分析
回复

使用道具 举报

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
 楼主| 发表于 2016-4-20 17:18:52 | 显示全部楼层

OLED

OLED

回复

使用道具 举报

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
 楼主| 发表于 2016-4-20 17:20:13 | 显示全部楼层
新问题出来了  我想让下面的文字 电子协会 移动   ,可发现时钟不走了,文字到是移动
回复

使用道具 举报

16

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2015-12-15
在线时间
72 小时
 楼主| 发表于 2016-4-20 17:21:46 | 显示全部楼层
复位后  时钟发现了变化,但明面上不显示,
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2016-5-24
在线时间
13 小时
发表于 2016-6-2 18:54:34 | 显示全部楼层
可以分享一下代码么?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 16:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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