|
上接电子时钟的设计(一)。
由于篇幅和板式的限制,将.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);
} |
|