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