/* 星期映射表 */
unsigned char * code p[7] = {"Sun.","Mon.","Tue.","Wed.","Thur.","Fri.","Sat."};
/* 定义标志 0:年 1:月 2:日 3:周 4:时 5:分*/
unsigned char flag_adjust = 0;
/** @brief 时间显示函数
* @param 无
* @reval 无
*/
void Time_Display(void){
DS1302_ReadTime(); // 读取实时时间
lcd_w_cmd(0x82);
lcd_w_nums(TIM[0],2); // 年
lcd_w_cmd(0x85);
lcd_w_nums(TIM[1],2); // 月
lcd_w_cmd(0x88);
lcd_w_nums(TIM[2],2); // 日
lcd_w_cmd(0x8E);
lcd_w_num(flag_adjust); // 调整位
lcd_w_cmd(0xC0);
lcd_w_nums(TIM[4],2); // 时
lcd_w_cmd(0xC3);
lcd_w_nums(TIM[5],2); // 分
lcd_w_cmd(0xC6);
lcd_w_nums(TIM[6],2); // 秒
lcd_w_cmd(0xCF);
lcd_w_str(" ");
lcd_w_cmd(0xCB);
lcd_w_str(p[TIM[3]-1]); // 星期英文缩写
}
/** @brief 时间列表调整函数
* @param char i 1 自加 -1 自减
* @reval 无
*/
void time_adjust(char i){
int temp = TIM[flag_adjust];
if(i==1 || i==-1)temp+=i;
switch(flag_adjust){
case 0: // 年
if(temp<0)
temp=99;
else if(temp>99)
temp=0;
break;
case 1: // 月
if(temp<=0)
temp=12;
else if(temp>=13)
temp=1;
break;
case 2: // 日
if(temp<=0)
temp=31;
else if(temp>31)
temp=1;
break;
case 3: // 周
if(temp<1)
temp=7;
else if(temp>7)
temp=1;
break;
case 4: // 时
if(temp<0)
temp=23;
else if(temp>=23)
temp=0;
break;
case 5: // 分
if(temp<0)
temp=59;
else if(temp>=60)
temp=0;
break;
}
temp = ((temp/10)<<4)|(temp%10); // 将数字转化为BCD码
TIM[flag_adjust] = temp; // 将对应的BCD码填入表格中
}
/** @brief 按键处理函数
* @param 无
* @reval 无
*/
void key_pro(void){
unsigned char key = 0; // 存储按键值
key = key_scanf(0); // 获取按键值
switch(key){
case 1: flag_adjust++;if(flag_adjust>5)flag_adjust=0;break;
case 2: time_adjust(1);break;
case 3: time_adjust(-1);break;
default:break;
} // 按键处理
if(key==2||key==3){
DS1302_WriteData(0X8E,0x00);
DS1302_WriteData(RTC_WRITE_ADDR[flag_adjust],TIM[flag_adjust]);
DS1302_WriteData(0X8E,0x80);
} // 把按键更新的数据写进对应寄存器里
}
/** @brief 主函数
* @param 无
* @reval 无
*/
void main(void){
lcd_int(); // 液晶初始化
DS1302_Init(); // DS302初始化
lcd_w_str("2019-10-19");
lcd_w_cmd(0xC0);
lcd_w_str("15:38:30"); // 显示
while(1){
Time_Display(); // 刷新时间
key_pro(); // 按键处理
}
}
DS1302.rar
(1.65 MB, 下载次数: 19)
|