1602LCD液晶数字电子钟 基本设计思路:
1. 1602LCD显示:
第一行: 年, 月, 日 2012-01-22
第二行: 时, 分, 秒 23:59:00
2. 独立按键功能:
Key1 恢复单片机调时之前的实际时间, 由于在调整时间期间,定时器T0暂停, 则启动定时器T1, 保证单片机的时间正确.(即 取消调时)
Key2 进入调整时间状态: 停止定时器T0,启动定时器T1.
Key3 退出调整时间状态: 启动定时器T0,停止定时器T1.
Key4 选择调整时间: 秒, 分, 时, 日, 月, 年
Key5 调时: 递增 同时启动蜂鸣器
Key6 调时: 递减 同时启动蜂鸣器
花了2天半的时间,终于按照自己的设计思路来实现了 时钟表, 在这两天多的时间, 感觉最难的就是,当发生错误的时候,不知道如何进行调试,差错,因为有些错误无法进行调试,因此往往都要换一个方向思考问题,所以面对困惑就必须要检测了, 自己的错误,只能自己解决,因为别人对你的错误往往都不容易理解。 哎,像我这样独自一个奋斗,真是寂寞啊, 遇到困惑,要么放弃,要么坚持,可是却不知道要坚持多久, 心里总是害怕 这样 浪费时间。
目前,还有一个问题没有解决: 如果调整时间,不合理,则必须恢复 原来的时间,并且有错误提示。
比如时间: 2012-2-34 , 若更改为这个日期,那么必须要有错误提示,并且要取消 这个时间。
#include
#include"MyFuntion.h" //自定义头文件
//扫描这些按键是否被按下
void Keycan()
{
if(Key1==0) //进入调整时间状态
{
Delay();
if(Key1==0) //停止定时器T0 启动定时器T1
{
ButtonBeep();
SaveCurrentTime(); //进入调整时间状态 必须保存当前时间 若取消调时 则可以恢复时间
TR0=0;//停止定时器T0
TR1=1;//启动定时器T1
tempSecond=0;
}
while(!Key1);
}
if(Key2==0)
{
Delay();
if(Key2==0) // 取消调时 恢复单片机调时之前的实际时间
{
if(TR0==0) //在调整时间状态下 恢复时间
{
ButtonBeep();
CurrentTime();
}
}
while(!Key2);
}
if(Key3==0) //退出调整时间状态:
{
Delay();
if(Key3==0)
{
ButtonBeep(); //停止定时器T1 启动定时器T0
TR0=1;//启动定时器T0
TR1=0;//停止定时器T1
Write_Command(0x0c); //设置开显示 不显示光标
}
while(!Key3);
}
//当定时器T0 停止时 才能 进行下面的各个按键的操作
if(TR0==0) //定时器T0 停止
{
if(Key4==0) // Key4 控制光标往右移动
{
Delay();
if(Key4==0)
{
AdjustCursorRight(); //控制光标往右移动
ButtonBeep();
}
while(!Key4);
}
if(Key5==0) // Key5 控制光标往左移动
{
Delay();
if(Key5==0)
{
AdjustCursorLeft(); //控制光标往左移动
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 实现自动 计时
void LCD_Timer0() interrupt 1 using 0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
}
//定时器T1 实现自动 计时 从而减少调整时间产生的误差
void LCD_Timer1() interrupt 3 using 1
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t1++;
if(t1==20)
{
t1=0;
tempSecond++;
}
}