其實我看到論壇中已經有許多相似教程了,但我想既然已經做了,那就分享出來吧。
本程序使用延時函數作為時鐘的來源,根本無法保證精度,僅作為演示。
串口傳回的數據為實際刷新一次所需要的時間,從仿真結果來看,時鐘大約每一秒都差50us以上,就是說每33分鐘將慢1秒鐘,24小時將慢48秒以上
通過調節延時的話精度應該還可以提高。
有一篇講產生高精度方波的帖子我覺得可以給大家一些提高時間精度的靈感。
http://www.zg4o1577.cn/bbs/dpj-138357-1.html
當然外接時鐘源也是可行的方案,或者嘗試用中斷應該也是不錯的方法。
如果還有其他方案也歡迎大家分享。
改成萬年歷也是可行的,我就不弄了(懶)。
GIF演示:
lcd顯示時間.gif (403.94 KB, 下載次數: 58)
下載附件
2018-10-19 22:23 上傳
代碼如下:
- //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樓下載
|