热度 17
2016-3-4 13:39
1103 次阅读|
0 个评论
上接电子时钟的设计(一)。 由于篇幅和板式的限制,将.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); }