|
其實(shí)我看到論壇中已經(jīng)有許多相似教程了,但我想既然已經(jīng)做了,那就分享出來吧。
本程序使用延時(shí)函數(shù)作為時(shí)鐘的來源,根本無法保證精度,僅作為演示。
串口傳回的數(shù)據(jù)為實(shí)際刷新一次所需要的時(shí)間,從仿真結(jié)果來看,時(shí)鐘大約每一秒都差50us以上,就是說每33分鐘將慢1秒鐘,24小時(shí)將慢48秒以上
通過調(diào)節(jié)延時(shí)的話精度應(yīng)該還可以提高。
有一篇講產(chǎn)生高精度方波的帖子我覺得可以給大家一些提高時(shí)間精度的靈感。
http://www.zg4o1577.cn/bbs/dpj-138357-1.html
當(dāng)然外接時(shí)鐘源也是可行的方案,或者嘗試用中斷應(yīng)該也是不錯(cuò)的方法。
如果還有其他方案也歡迎大家分享。
改成萬年歷也是可行的,我就不弄了(懶)。
GIF演示:
代碼如下:
- //2018.10.19 QQ:775913024
- //1604/1602顯示時(shí)間,串口顯示的是實(shí)際刷新一次所用的時(shí)間,單位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);
- //時(shí)間初始化
- h=9;//小時(shí)
- 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);//一秒刷新一次的時(shí)間
- s++;//秒s
- if(s==60)
- s=0;
- if(s==0)//分m
- m=m+1;
- if(m==60)
- m=0;
- if(m==0&&s==0)//小時(shí)h
- h=h+1;
- if(h==24)
- h=0;
- delayMicroseconds(800);//細(xì)調(diào)刷新一次的時(shí)間
- 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)//小時(shí)
- 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)//小時(shí)
- {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)//小時(shí)
- {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);
- }
復(fù)制代碼
文件在2樓下載
|
評分
-
查看全部評分
|