单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-19 发布时间:
|
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++;
   }
}

关键字:1602LCD液晶  数字电子钟  时钟表 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC单片机基础知识之二