查看: 710|回复: 0

新手练习之如何设计电子时钟(二)

[复制链接]

该用户从未签到

发表于 2016-3-11 10:32:05 | 显示全部楼层 |阅读模式
分享到:
上接电子时钟的设计(一)。
由于篇幅和板式的限制,将.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 dataKeyCvtBuf ;
extern uchar dataKeyOldBuf ;
//**************函数调用********
extern  voidKeyIn(void);
extern  voidKeyChk(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 dataKeyChkBuf ;
extern uchar dataKeyOldBuf ;
extern uchar dataKeyCvtBuf ;
extern  DataPort ;
//=======================调用函数===================================
extern  void    LedDisp(uchar i, uchar j, uchar m, uchar n) ;
extern  void    Led_Init(void);
extern  void    MnKey(void);
extern  voidKeyIn(void);
extern  voidKeyChk(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 ;
uchar led3 = MINUTE/10 ;
uchar led4 = MINUTE ;
LedDisp(led1, led2, led3, led4);
}
  /******************************************************************
//函 数 名: Time_MonDayDisp( )
//功能描述:
//说明:显示  月份:日期
调用函数:void LedDisp(void);
********************************************************************/
void Time_MonDayDisp(void)
{
uchar led1 = MONTH / 10 ;
uchar led2 = MONTH  ;
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);
}
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

手机版|小黑屋|与非网

GMT+8, 2024-4-26 19:01 , Processed in 0.131396 second(s), 18 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.