10.3 DS1302可调时钟

张开发
2026/4/8 0:11:12 15 分钟阅读

分享文章

10.3 DS1302可调时钟
#include REGX52.H#include LCD1602.h#include DS1302.h#include Key.h#include Timer0.hunsigned char KeyNum,MODE,TimeSetSelect,TimeSetFlashFlag;void TimeShow(void)//时间显示功能{DS1302_ReadTime();//读取时间LCD_ShowNum(1,1,DS1302_Time[0],2);//显示年LCD_ShowNum(1,4,DS1302_Time[1],2);//显示月LCD_ShowNum(1,7,DS1302_Time[2],2);//显示日LCD_ShowNum(2,1,DS1302_Time[3],2);//显示时LCD_ShowNum(2,4,DS1302_Time[4],2);//显示分LCD_ShowNum(2,7,DS1302_Time[5],2);//显示秒}void TimeSet(void)//时间设置功能{if(KeyNum2)//按键2按下{TimeSetSelect;//设置选择位加1TimeSetSelect%6;//越界清零}if(KeyNum3)//按键3按下{DS1302_Time[TimeSetSelect];//时间设置位数值加1if(DS1302_Time[0]99){DS1302_Time[0]0;}//年越界判断if(DS1302_Time[1]12){DS1302_Time[1]1;}//月越界判断if( DS1302_Time[1]1 || DS1302_Time[1]3 || DS1302_Time[1]5 || DS1302_Time[1]7 ||DS1302_Time[1]8 || DS1302_Time[1]10 || DS1302_Time[1]12)//日越界判断{if(DS1302_Time[2]31){DS1302_Time[2]1;}//大月}else if(DS1302_Time[1]4 || DS1302_Time[1]6 || DS1302_Time[1]9 || DS1302_Time[1]11){if(DS1302_Time[2]30){DS1302_Time[2]1;}//小月}else if(DS1302_Time[1]2){if(DS1302_Time[0]%40){if(DS1302_Time[2]29){DS1302_Time[2]1;}//闰年2月}else{if(DS1302_Time[2]28){DS1302_Time[2]1;}//平年2月}}if(DS1302_Time[3]23){DS1302_Time[3]0;}//时越界判断if(DS1302_Time[4]59){DS1302_Time[4]0;}//分越界判断if(DS1302_Time[5]59){DS1302_Time[5]0;}//秒越界判断}if(KeyNum4)//按键3按下{DS1302_Time[TimeSetSelect]--;//时间设置位数值减1if(DS1302_Time[0]0){DS1302_Time[0]99;}//年越界判断if(DS1302_Time[1]1){DS1302_Time[1]12;}//月越界判断if( DS1302_Time[1]1 || DS1302_Time[1]3 || DS1302_Time[1]5 || DS1302_Time[1]7 ||DS1302_Time[1]8 || DS1302_Time[1]10 || DS1302_Time[1]12)//日越界判断{if(DS1302_Time[2]1){DS1302_Time[2]31;}//大月if(DS1302_Time[2]31){DS1302_Time[2]1;}}else if(DS1302_Time[1]4 || DS1302_Time[1]6 || DS1302_Time[1]9 || DS1302_Time[1]11){if(DS1302_Time[2]1){DS1302_Time[2]30;}//小月if(DS1302_Time[2]30){DS1302_Time[2]1;}}else if(DS1302_Time[1]2){if(DS1302_Time[0]%40){if(DS1302_Time[2]1){DS1302_Time[2]29;}//闰年2月if(DS1302_Time[2]29){DS1302_Time[2]1;}}else{if(DS1302_Time[2]1){DS1302_Time[2]28;}//平年2月if(DS1302_Time[2]28){DS1302_Time[2]1;}}}if(DS1302_Time[3]0){DS1302_Time[3]23;}//时越界判断if(DS1302_Time[4]0){DS1302_Time[4]59;}//分越界判断if(DS1302_Time[5]0){DS1302_Time[5]59;}//秒越界判断}//更新显示根据TimeSetSelect和TimeSetFlashFlag判断可完成闪烁功能if(TimeSetSelect0 TimeSetFlashFlag1){LCD_ShowString(1,1, );}else {LCD_ShowNum(1,1,DS1302_Time[0],2);}if(TimeSetSelect1 TimeSetFlashFlag1){LCD_ShowString(1,4, );}else {LCD_ShowNum(1,4,DS1302_Time[1],2);}if(TimeSetSelect2 TimeSetFlashFlag1){LCD_ShowString(1,7, );}else {LCD_ShowNum(1,7,DS1302_Time[2],2);}if(TimeSetSelect3 TimeSetFlashFlag1){LCD_ShowString(2,1, );}else {LCD_ShowNum(2,1,DS1302_Time[3],2);}if(TimeSetSelect4 TimeSetFlashFlag1){LCD_ShowString(2,4, );}else {LCD_ShowNum(2,4,DS1302_Time[4],2);}if(TimeSetSelect5 TimeSetFlashFlag1){LCD_ShowString(2,7, );}else {LCD_ShowNum(2,7,DS1302_Time[5],2);}}void main(){LCD_Init();DS1302_Init();Timer0Init();LCD_ShowString(1,1, - - );//静态字符初始化显示LCD_ShowString(2,1, : : );DS1302_SetTime();//设置时间while(1){KeyNumKey();//读取键码if(KeyNum1)//按键1按下{if(MODE0){MODE1;TimeSetSelect0;}//功能切换else if(MODE1){MODE0;DS1302_SetTime();}}switch(MODE)//根据不同的功能执行不同的函数{case 0:TimeShow();break;case 1:TimeSet();break;}}}void Timer0_Routine() interrupt 1{static unsigned int T0Count;TL0 0x18; //设置定时初值TH0 0xFC; //设置定时初值T0Count;if(T0Count500)//每500ms进入一次{T0Count0;TimeSetFlashFlag!TimeSetFlashFlag;//闪烁标志位取反}}#include REGX52.H#include Delay.h/*** brief 获取独立按键键码* param 无* retval 按下按键的键码范围0~4无按键按下时返回值为0*/unsigned char Key(){unsigned char KeyNumber0;if(P3_10){Delay(20);while(P3_10);Delay(20);KeyNumber1;}if(P3_00){Delay(20);while(P3_00);Delay(20);KeyNumber2;}if(P3_20){Delay(20);while(P3_20);Delay(20);KeyNumber3;}if(P3_30){Delay(20);while(P3_30);Delay(20);KeyNumber4;}return KeyNumber;}

更多文章