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++;
}
}