原创 电子时钟的设计(二)

2016-3-4 13:39 1126 17 17 分类: MCU/ 嵌入式
上接电子时钟的设计(一)。
由于篇幅和板式的限制,将.h和.c 合并在同一个文件,便于大家查看。
这里再贴上 模式选择函数和秒表函数。
 /********************************************
//*****文件名:Mode.c
//*****
说明:
每次按KEY4进入模式选择 显示--P_
按KEY1 键进行模式的切换,
显示--P1 钟表校对模式,按KEY4后进入该功能 ,调用函数Set_Time();
  --P2 秒表模式 ,按KEY4后进入该功能,调用函数 Cnt_Time()
--P3 定时器模式,按KEY4后进入该功能,调用函数 Limt_Time ();
--P4 闹钟模式 ,按KEY4后进入该功能,调用函数  Rin_Time() ;   
  uchar SetMode  = 0 ; //时间的显示//1 :钟表校对模式, 2:秒表模式 3:定时器模式 4:闹钟模式 

按KEY1切换显示的模式,按KEY4确定当前显示的模式,选择进入该模式。
**********************************************/ 
#include "reg51.h"
#define uchar  unsigned char
#define uint  unsigned int
//=======================变量=================================
uchar DispModePage = 0 ;  //显示的页面的标记,1为P1,2为P2,3为P3。
extern  uchar SetMode ;//用于模式的选择
extern  uchar data KeyCvtBuf ;
extern  uchar data KeyOldBuf ;
//**************函数调用********
extern  void KeyIn(void);
extern  void KeyChk(void);
extern  void    LedDisp(uchar i, uchar j, uchar m, uchar n) ;
 /********************************************
//*****函数名:ModeSetDisp()
//*****函数功能: 数码管显示模式
//*****输入参数: 无
//*****输出参数:无
说明:uchar SetMode  = 0 ; //时间的显示//1 :钟表校对模式, 2:秒表模式 3:定时器模式 4:闹钟模式 
  P1为钟表校对模式,调用函数Set_Time();
  P2为 秒表模式 ,调用函数 Cnt_Time()
  p3为定时器模式,调用函数 Limt_Time ();
  P4为闹钟模式 ,调用函数  Rin_Time() 。
按KEY1切换显示的模式,按KEY4确定当前显示的模式,选择进入该模式。
**********************************************/  
void ModeSetDisp (void )
{
KeyIn();
    KeyChk();
if(KeyCvtBuf==KeyOldBuf)
return;
else if (DispModePage == 0)
{
LedDisp(21 ,21, 17 ,24);   //显示--P_
DispModePage = 1;
}
else if  (DispModePage != 0 )  //--P_ 消隐
{   
KeyOldBuf = KeyCvtBuf;
switch ( KeyCvtBuf)
{
case 0x00 : 
  { return ; }
case 0x01 : 
   {  
if (DispModePage ==1) //当前显示为P1,为时钟校对模式 ,再按KEY1,切换至P2模式
{
LedDisp(21 ,21, 17 ,1);
DispModePage = 2 ;
}
  else if(DispModePage == 2)  //当前显示为P2,为秒表模式 ,再按KEY1,切换至P3模式
{
LedDisp(21 ,21, 17 ,2);
  DispModePage = 3 ;
}
else if(DispModePage == 3)   //当前显示为P3,为定时器模式,再按KEY1,切换至P4模式
{
LedDisp(21 ,21, 17 ,3);
DispModePage = 4 ;
}
else if( DispModePage == 4)   //当前显示为P4,为定时器模式,再按KEY1,切换至P1模式
{
LedDisp(21 ,21, 17 ,4);
DispModePage = 1;
}
break ;
 }
case 0x08 :
{
if( DispModePage == 2 )    //显示为P1,为时钟校对模式
{
DispModePage= 1; //退出时还原
   SetMode = 1;
}
else if( DispModePage == 3 )    //显示为P2,为时秒表模式 
{
DispModePage = 2; //退出时还原
SetMode = 2 ;
}
else if(DispModePage == 4)  //当前显示为P3,为定时器模式,
{
DispModePage = 3; //退出时还原
SetMode = 3 ;
}
else if(DispModePage == 1)    //当前显示为P4,为闹钟模式
{
DispModePage = 4; //退出时还原
SetMode = 4 ;
}
break ;
}
}
}
}
 
/************************************************
//文件名: clock.c
// 说明:   时钟功能文件,
电子表时钟初始化为2012年10月13日06点00分
四个按键的定义: KEY1 S0 ;  KEY2 S1 ;  KEY3 S3 ;  KEY4 S4 ;

演示步骤: 1. 钟表功能:
初始化主页面上显示2012年10月13日06点00分。 首先四个数码管显示06:04
  (1)不对此页面进行设置。查看年月日:按KEY2表示上翻查看日期,再按KEY2上翻查看年;
   类似地,按KEY3下翻查看年分显示 2012 ;   
再按KEY3表示查看日期,显示 10 -13。 
按KEY4跳至功能选择 .
  (2)功能模式的选择。按KEY4进入此页的设置(从年开始进行设置),显示--P_  按KEY1键进行功能切换。

*************************************************/

#include "reg51.h"

#define uchar  unsigned char
#define uint  unsigned int

//=======================变量=================================
 //显示小时分钟时为1 ,显示 日期 标志 为2// 显示年的标志 3 //模式页时为0//   4:不显示--P_
uchar ShowPage  = 1 ;  //数码管显示页面标记,初始化为1,显示小时分
extern uchar SetMode;
extern uchar SetFlag   ; //1 :钟表模式,2:计时模式。。。。
extern uchar DispModePage  ;

uchar StFg = 3 ; //修改标志,初始化为3,当年份修改完成后变为2,当日期修改完成变为1,当时间设置后变为0;

uchar SECOND = 3 ;  // 秒
uchar MINUTE = 14 ;  // 分
uchar HOUR = 6 ; // 6 时
uchar DAY = 13 ;  // 13日
uchar MONTH = 10 ; // 10月
uint YEAR = 2012 ;   //  2012年
uchar YearFlag = 0 ;
extern uchar DispModePage ;
extern uchar SecondFlag  ; //每秒的标志位

uchar SecondFlagOld ;  //每秒的上一次标志位

//******************外部变量**********************
extern  uchar data KeyChkBuf ;
extern  uchar data KeyOldBuf ;
extern  uchar data KeyCvtBuf ;
extern  DataPort ;  
//=======================调用函数===================================
extern  void    LedDisp(uchar i, uchar j, uchar m, uchar n) ;
extern  void    Led_Init(void);
extern  void    MnKey(void);
extern  void KeyIn(void);
extern  void KeyChk(void);


/******************************************************************
//函 数 名: Time_Process()
//功能描述: 
//说明:时间进程函数,时间: 秒、分、小时、日、月、年
********************************************************************/
 void Time_Process(void)
 {
  if(SecondFlag != SecondFlagOld)
{
  SECOND ++ ;
SecondFlagOld = SecondFlag; 
if(SECOND == 60 )
{
MINUTE ++;
    SECOND = 0;
if(MINUTE ==60)
    {
HOUR++;
    MINUTE = 0;
    if(HOUR == 24)
    {
   HOUR = 0;
if(MONTH == 4 || MONTH == 6 || MONTH == 9 || MONTH == 11)
{
DAY ++;
if(DAY ==31)
{
DAY = 1;
MONTH  ++ ;
}
else if(MONTH == 2)
{
DAY ++ ;
if(YearFlag == 4||YearFlag == 0)
    {
if(DAY == 30) 
DAY = 1;
    }
else if(DAY == 29)
{
DAY = 1;
}
}
else  //1、3、5、7、9、10、12
{
DAY ++;
if(DAY == 32)
{
DAY = 1;
MONTH  ++ ;
if(MONTH == 13)
{
MONTH = 1;
YEAR ++ ; 
YearFlag  ++ ;
}
}  
}
    }
    }
}
}
 }
   /******************************************************************
//函 数 名: Time_HorMinDisp()
//功能描述: 
//说明:显示  小时:分种
调用函数:void  LedDisp(void);
********************************************************************/
void Time_HorMinDisp(void)
{
uchar led1 = HOUR/10 ; 
uchar led2 = HOUR%10 ;
uchar led3 = MINUTE/10 ; 
uchar led4 = MINUTE%10 ; 
LedDisp(led1, led2, led3, led4);
}

  /******************************************************************
//函 数 名: Time_MonDayDisp( )
//功能描述: 
//说明:显示  月份:日期
调用函数:void  LedDisp(void);
********************************************************************/
void Time_MonDayDisp(void)
{
uchar led1 = MONTH / 10 ;
uchar led2 = MONTH %10 ;
uchar led3 = DAY / 10 ;
uchar led4 = DAY % 10 ; 
LedDisp(led1, led2, led3, led4);
}
   /******************************************************************
//函 数 名: Time_ProcessDisp()
//功能描述: 
//说明:显示  年
调用函数:void  LedDisp(void);
********************************************************************/
void Time_YearDisp(void)
{
uchar led1 = (YEAR / 1000 ) ;
uchar led2 = (YEAR- led1*1000) / 100 ;
uchar led3 = (YEAR - led1*1000 - led2*100)/10  ;
uchar led4 = YEAR  % 10  ;
LedDisp(led1, led2, led3, led4);
}


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
17
关闭 站长推荐上一条 /3 下一条