其实我看到论坛中已经有许多相似教程了,但我想既然已经做了,那就分享出来吧。
本程序使用延时函数作为时钟的来源,根本无法保证精度,仅作为演示。
串口传回的数据为实际刷新一次所需要的时间,从仿真结果来看,时钟大约每一秒都差50us以上,就是说每33分钟将慢1秒钟,24小时将慢48秒以上
通过调节延时的话精度应该还可以提高。
有一篇讲产生高精度方波的帖子我觉得可以给大家一些提高时间精度的灵感。
http://www.51hei.com/bbs/dpj-138357-1.html
当然外接时钟源也是可行的方案,或者尝试用中断应该也是不错的方法。
如果还有其他方案也欢迎大家分享。
改成万年历也是可行的,我就不弄了(懒)。
GIF演示:
代码如下:
- //2018.10.19 QQ:775913024
- //1604/1602显示时间,串口显示的是实际刷新一次所用的时间,单位us
- #include <LiquidCrystal.h>
- LiquidCrystal lcd(13,12,11,10,9,8 );
- int m,h,s;
- int bsel=5; //buttonSelsect
- int bss=4; //buttonStart/Stop
- int bup=6; //buttonUp
- int bdown=7; //buttonDown
- int selflag; //selectflag
- int flag=1;
- void setup()
- {
- pinMode(bsel,INPUT_PULLUP);//选择按钮
- pinMode(bss,INPUT_PULLUP);//开始停止按钮
- pinMode(bup,INPUT_PULLUP);//加按钮
- pinMode(bdown,INPUT_PULLUP);//减按钮
- Serial.begin(9600);
- //时间初始化
- h=9;//小时
- m=59;//分种
- s=55;//秒
- selflag=0;
- flag=1;
- lcd.begin(16,4); //使用1602就把4改成2即可
- }
- void loop() {
- if(digitalRead(bss)==0)//停止开始
- {
- delay(700);
- flag=!flag;
- lcd.setCursor(0,1);
- if(flag==0)
- lcd.print(" stop");
- if(flag==1)
- {lcd.setCursor(0,1);
- lcd.print("runing ");
- }
- }
- else if(flag==1&&digitalRead(5)==1)//正常显示
- {
- uint32_t start = micros();
- delay(995);//一秒刷新一次的时间
- s++;//秒s
- if(s==60)
- s=0;
- if(s==0)//分m
- m=m+1;
- if(m==60)
- m=0;
- if(m==0&&s==0)//小时h
- h=h+1;
- if(h==24)
- h=0;
- delayMicroseconds(800);//细调刷新一次的时间
- shownowtime();
- Serial.println(micros()-start);
- }
- if((digitalRead(bsel)==0)&&flag==0)//选择事件
- {delay(300);
- lcd.setCursor(0,1);
- selflag++;
- if(selflag==3)
- selflag=0;
- if(selflag==0)//小时
- lcd.print("hour");//
- if(selflag==1)//分钟
- lcd.print("min ");
- if(selflag==2)
- lcd.print("Sec ");//秒钟
- }
- if((digitalRead(bup)==0)&&flag==0)//加事件
- {delay(300);
- if(selflag==0)//小时
- {h++;
- if(h==24||h<0)
- h=0;
- shownowtime();
- }
- if(selflag==1)//分钟
- {
- m++;
- if(m==60||m<0)
- m=0;
- shownowtime();
- }
- if(selflag==2)//秒钟
- {
- s++;
- if(s==60||s<0)
- s=0;
- shownowtime();
- }
- }
- if((digitalRead(bdown)==0)&&flag==0)//减事件
- {delay(300);
- if(selflag==0)//小时
- {h--;
- if(h==24||h<0)
- h=0;
- shownowtime();
- }
- if(selflag==1)//分钟
- {
- m--;
- if(m==60||m<0)
- m=0;
- shownowtime();
- }
- if(selflag==2)//秒钟
- {
- s--;
- if(s==60||s<0)
- s=0;
- shownowtime();
- }
- }
- }
- void shownowtime()
- {
- lcd.setCursor(0,0);
- if(h<10)
- lcd.print('0');
- lcd.print(h);
- lcd.print(":");
- if(m<10)
- lcd.print('0');
- lcd.print(m);
- lcd.print(":");
- if(s<10)
- lcd.print('0');
- lcd.print(s);
- }
复制代码
文件在2楼下载
|