1602LCD液晶數(shù)字電子鐘 時鐘表 C語言
1. 1602LCD顯示:
第一行: 年, 月, 日 2012-01-22
第二行: 時, 分, 秒 23:59:00
2. 獨立按鍵功能:
Key1 恢復(fù)單片機調(diào)時之前的實際時間, 由于在調(diào)整時間期間,定時器T0暫停, 則啟動定時器T1, 保證單片機的時間正確.(即 取消調(diào)時)
Key2 進(jìn)入調(diào)整時間狀態(tài): 停止定時器T0,啟動定時器T1.
Key3 退出調(diào)整時間狀態(tài): 啟動定時器T0,停止定時器T1.
Key4 選擇調(diào)整時間: 秒, 分, 時, 日, 月, 年
Key5 調(diào)時: 遞增 同時啟動蜂鳴器
Key6 調(diào)時: 遞減 同時啟動蜂鳴器
花了2天半的時間,終于按照自己的設(shè)計思路來實現(xiàn)了 時鐘表, 在這兩天多的時間, 感覺最難的就是,當(dāng)發(fā)生錯誤的時候,不知道如何進(jìn)行調(diào)試,差錯,因為有些錯誤無法進(jìn)行調(diào)試,因此往往都要換一個方向思考問題,所以面對困惑就必須要檢測了, 自己的錯誤,只能自己解決,因為別人對你的錯誤往往都不容易理解。 哎,像我這樣獨自一個奮斗,真是寂寞啊, 遇到困惑,要么放棄,要么堅持,可是卻不知道要堅持多久, 心里總是害怕 這樣 浪費時間。
目前,還有一個問題沒有解決: 如果調(diào)整時間,不合理,則必須恢復(fù) 原來的時間,并且有錯誤提示。
比如時間: 2012-2-34 , 若更改為這個日期,那么必須要有錯誤提示,并且要取消 這個時間。
#include
#include"MyFuntion.h" //自定義頭文件
//掃描這些按鍵是否被按下
void Keycan()
{
if(Key1==0) //進(jìn)入調(diào)整時間狀態(tài)
{
Delay();
if(Key1==0) //停止定時器T0 啟動定時器T1
{
ButtonBeep();
SaveCurrentTime(); //進(jìn)入調(diào)整時間狀態(tài) 必須保存當(dāng)前時間 若取消調(diào)時 則可以恢復(fù)時間
TR0=0;//停止定時器T0
TR1=1;//啟動定時器T1
tempSecond=0;
}
while(!Key1);
}
if(Key2==0)
{
Delay();
if(Key2==0) // 取消調(diào)時 恢復(fù)單片機調(diào)時之前的實際時間
{
if(TR0==0) //在調(diào)整時間狀態(tài)下 恢復(fù)時間
{
ButtonBeep();
CurrentTime();
}
}
while(!Key2);
}
if(Key3==0) //退出調(diào)整時間狀態(tài):
{
Delay();
if(Key3==0)
{
ButtonBeep(); //停止定時器T1 啟動定時器T0
TR0=1;//啟動定時器T0
TR1=0;//停止定時器T1
Write_Command(0x0c); //設(shè)置開顯示 不顯示光標(biāo)
}
while(!Key3);
}
//當(dāng)定時器T0 停止時 才能 進(jìn)行下面的各個按鍵的操作
if(TR0==0) //定時器T0 停止
{
if(Key4==0) // Key4 控制光標(biāo)往右移動
{
Delay();
if(Key4==0)
{
AdjustCursorRight(); //控制光標(biāo)往右移動
ButtonBeep();
}
while(!Key4);
}
if(Key5==0) // Key5 控制光標(biāo)往左移動
{
Delay();
if(Key5==0)
{
AdjustCursorLeft(); //控制光標(biāo)往左移動
ButtonBeep();
}
while(!Key5);
}
if(Key6==0) // 遞增
{
Delay();
if(Key6==0)
{
UpDown=1;
ButtonSetTime();
ButtonBeep();
}
while(!Key6);
}
if(Key7==0) // 遞減
{
Delay();
if(Key7==0)
{
UpDown=0;
ButtonSetTime();
ButtonBeep();
}
while(!Key7);
}
}
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
ET1=1;
TR0=1; //啟動定時器T0
// TR1=0; //停止定時器T1 即暫時不啟動定時器T1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
InitLCD(); //初始化LCD
Init_Table_YMD(table1); // LCD 時間表 年月日
Init_Table_HMS(table2); // LCD 時間表 時分秒
DisplayLCD_YMD(table1, 10); //LCD顯示時間 年月日
DisplayLCD_HMS(table2, 8); //LCD顯示時間 時分秒
while(1)
{
Keycan();
if(t0==20)
{
t0=0;
IncreaseHMS(); // 時分秒 遞增
}
}
}
//定時器T0 實現(xiàn)自動 計時
void LCD_Timer0() interrupt 1 using 0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
}
//定時器T1 實現(xiàn)自動 計時 從而減少調(diào)整時間產(chǎn)生的誤差
void LCD_Timer1() interrupt 3 using 1
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t1++;
if(t1==20)
{
t1=0;
tempSecond++;
}
}
評論