要求
1、设置DS1302时钟芯片时间
2、读取DS1302时钟芯片时间并显示在LCD1602上
3、通过独立按键可修改当前时间,在修改模式中,对选中的属性进行闪烁以提示用户该属性被选中
K1:进入/退出修改模式
K2:选择修改的具体属性
K3:选中属性值加1
K4:选中属性值减1
4、修改后的时间增加合法判定(平年闰年,大月小月),比较简单,我写的代码没有给出,可自行添加
提示:
1、可将法和判定做成一个函数,传入time数组,函数将time数组修改为合法的时间
2、该函数紧跟在对time[flag]增减的代码之后(修改之后立马判定)
效果
资源
工程文件压缩包
链接:https://pan.baidu.com/s/1EapEC862yxjL8rWxXXnX4w
提取码:9mmm
main函数
#include <REGX52.H>
#include "Delay.H"
#include "LCD1602.H"
#include "Key.H"
#include "DS1302.H"
//时间显示
void ShowTime(unsigned char *time){
//静态字符初始化显示
LCD_ShowString(1,3,"-");
LCD_ShowString(1,6,"-");
LCD_ShowString(2,3,":");
LCD_ShowString(2,6,":");
LCD_ShowNum(1,1,time[0],2); //显示年
LCD_ShowNum(1,4,time[1],2); //显示月
LCD_ShowNum(1,7,time[2],2); //显示日
LCD_ShowNum(2,1,time[3],2); //显示时
LCD_ShowNum(2,4,time[4],2); //显示分
LCD_ShowNum(2,7,time[5],2); //显示秒
}
//被选中时间属性闪烁
void Selected(unsigned char *time,unsigned char flag){
unsigned char column;
if(flag<3){
column=3*flag+1;
LCD_ShowString(1,column," ");
Delayms(600);
LCD_ShowNum(1,column,time[flag],2);
Delayms(600);
}
else{
column=3*(flag-3)+1;
LCD_ShowString(2,column," ");
Delayms(600);
LCD_ShowNum(2,column,time[flag],2);
Delayms(600);
}
}
void main(){
unsigned char time[]={22,4,27,16,33,20,3};
unsigned char KEY;
unsigned char flag;
//状态初始化
LCD_Init();
DS1302_Init();
//时间初始化
DS1302_SetTime(time);
while(1){
DS1302_ReadTime(time); //读取时间
ShowTime(time); //显示时间
KEY=get_key();
if(KEY==1){ //读取到K1按下,进入修改模式
KEY=0; //复位
flag=0; //指向time数组中待修改的值
while(1){
Selected(time,flag);//flag指向的值闪烁
KEY=get_key(); //获取按键值
if(KEY==2){flag=(flag+1)%6;KEY=0;Delayms(400);} //指向下一个待修改的值
if(KEY==3){time[flag]+=1;KEY=0;Delayms(400);} //将指向的值加1,复位
if(KEY==4){time[flag]-=1;KEY=0;Delayms(400);} //将指向的值减一,复位
if(KEY==1){DS1302_SetTime(time);break;KEY=0;} //完成修改,退出,复位
}
Delays(1); //延迟1秒(用户按下的K1时间过长,延迟一下防止被下一条get_key捕捉)
}
}
}