微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 1602LCD液晶数字电子钟 时钟表 C语言

1602LCD液晶数字电子钟 时钟表 C语言

时间:11-18 来源:互联网 点击:
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++;

}

}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top