花了一个星期终于调出来了啊 。
以原子的KEY,RTC两个例程为基础。
实现以下功能,
按板子的 wk_up一次,进入时间调节模式,并选中 年 项,再按一次则是 月。顺序为 年 月 日 时 分 。再按一次则结束调节,更新时间。
按板子的 K1 对选中的时间加一。
按板子的 K0 对选择的时间减一。
大胆地跑来分享一下,
键盘部分,使用例程的扫描,不过为了好分辨,改了一点,这样子
if(KEYS==0)
{
JTAG_Set(SWD_ENABLE);
return DOWN;
}
else if(KEYA==0)
{
JTAG_Set(SWD_ENABLE);
return UP;
}
else if(KEUP==1)
{
JTAG_Set(SWD_ENABLE);
return SET;
}
时间设置部分程序
extern u8 FLAG; //时钟设置状态
switch(KEY_Scan())
{
case SET: /*******时间设置状态判断*******/
{
flag++;
POINT_COLOR = GREEN;
if(flag==1)
{
date[1] = timer.w_year-2000;
date[2] = timer.w_month;
date[3] = timer.w_date;
date[4] = timer.hour;
date[5] = timer.min;
FLAG = 1;
}
SET_COLOR();
if(flag==6){
flag=0;
RTC_Set(date[1]+2000,date[2],date[3],date[4],date[5],timer.sec);
FLAG = 0;}
}break;
/********进入时间调节********/
case UP: /**********时间加*************/
{
date[flag]++;
date_availble();
LCD_Fill(59,145,140,161,BLACK);
switch(RTC_Get_Week(date[1]+2000,date[2],date[3]))
{
case 0 CD_ShowString(60,145,"Sunday");break;
case 1 CD_ShowString(60,145,"Monday");break;
case 2 CD_ShowString(60,145,"Tuesday");break;
case 3 CD_ShowString(60,145,"Wednesday");break;
case 4 CD_ShowString(60,145,"Thursday");break;
case 5 CD_ShowString(60,145,"Friday");break;
case 6 CD_ShowString(60,145,"Saturday");break;
}
SET_COLOR();
}break;
case DOWN: /********时间减***************/
{
date[flag]--;
date_availble();
LCD_Fill(59,145,140,161,BLACK);
switch(RTC_Get_Week(date[1]+2000,date[2],date[3]))
{
case 0 CD_ShowString(60,145,"Sunday");break;
case 1 CD_ShowString(60,145,"Monday");break;
case 2 CD_ShowString(60,145,"Tuesday");break;
case 3:LCD_ShowString(60,145,"Wednesday");break;
case 4:LCD_ShowString(60,145,"Thursday");break;
case 5:LCD_ShowString(60,145,"Friday");break;
case 6:LCD_ShowString(60,145,"Saturday");break;
}
SET_COLOR();
}break;
}
}
另外两个子函数,一个用来判断时间是否有效,一个让选中项改变颜色
/*********************************/
//date[6] 1 2 3 4 5
// yy MM DD hh mm
/*********************************/
void date_availble(void)
{
switch(flag)
{
case 1:break;
case 2:
{
if(date[2]==0)date[2] = 12;
if(date[2]==13)date[2] = 1;
}break;
case 3:
{
if(date[2]==1||date[2]==3||date[2]==5||date[2]==7||date[2]==8||
date[2]==10||date[2]==12)//大月
{
if(date[3]==32)date[3] = 1;
if(date[3]==0)date[3] = 31;
}
if(date[2]==4||date[2]==6||date[2]==9||date[2]==11)//小月
{
if(date[3]==31)date[3] = 1;
if(date[3]==0)date[3] = 30;
}
if((Is_Leap_Year(date[1]+200))&&(date[2]==2))//闰2月
{
if(date[3]==30)date[3] = 1;
if(date[3]==0)date[3] = 29;
}
else
{
if(date[3]==0)date[3] = 28;
if(date[3]==29)date[3] = 1;
}
}break;
case 4:
{
if(date[4]==255)date[4] =23;
if(date[4]==24)date[4] = 0;
}break;
case 5:
{
if(date[5]==255)date[5] = 59;
if(date[5]==60)date[5] = 0;
}break;
}
}
void SET_COLOR(void) /****使选择项为红色****/
{
switch(flag)
{
/*year*/ case 1:{POINT_COLOR = RED;LCD_ShowNum(60,130,date[1]+2000,4,16) OINT_COLOR = GREEN;
LCD_ShowNum(100,130,date[2],2,16);
LCD_ShowNum(124,130,date[3],2,16);
LCD_ShowNum(60,162,date[4],2,16);
LCD_ShowNum(84,162,date[5],2,16);}break;
/*****************************************************************/
/*month*/ case 2:{ LCD_ShowNum(60,130,date[1]+2000,4,16);
POINT_COLOR = RED;LCD_ShowNum(100,130,date[2],2,16) OINT_COLOR = GREEN;
LCD_ShowNum(124,130,date[3],2,16);
LCD_ShowNum(60,162,date[4],2,16);
LCD_ShowNum(84,162,date[5],2,16);}break;
/*****************************************************************/
/*date*/ case 3:{ LCD_ShowNum(60,130,date[1]+2000,4,16);
LCD_ShowNum(100,130,date[2],2,16);
POINT_COLOR = RED;LCD_ShowNum(124,130,date[3],2,16) OINT_COLOR = GREEN;
LCD_ShowNum(60,162,date[4],2,16);
LCD_ShowNum(84,162,date[5],2,16);}break;
/*****************************************************************/
/*hour*/ case 4:{ LCD_ShowNum(60,130,date[1]+2000,4,16);
LCD_ShowNum(100,130,date[2],2,16);
LCD_ShowNum(124,130,date[3],2,16);
POINT_COLOR = RED;LCD_ShowNum(60,162,date[4],2,16) OINT_COLOR = GREEN;
LCD_ShowNum(84,162,date[5],2,16);}break;
/*****************************************************************/
/*min*/ case 5:{ LCD_ShowNum(60,130,date[1]+2000,4,16);
LCD_ShowNum(100,130,date[2],2,16);
LCD_ShowNum(124,130,date[3],2,16);
LCD_ShowNum(60,162,date[4],2,16);
POINT_COLOR = RED;LCD_ShowNum(84,162,date[5],2,16) OINT_COLOR = GREEN;}break;
}LCD_ShowNum(108,162,timer.sec,2,16);
}
接下来是主函数部分,这里给出while循环里的
while(1)
{
TIME_SET();
if(!FLAG)
{
if(t!=timer.sec)
{
t = timer.sec;
LCD_ShowNum(60,130,timer.w_year,4,16);
LCD_ShowNum(100,130,timer.w_month,2,16);
LCD_ShowNum(124,130,timer.w_date,2,16);
LCD_Fill(59,145,140,161,BLACK);
switch(timer.week)
{
case 0:LCD_ShowString(60,145,"Sunday");break;
case 1:LCD_ShowString(60,145,"Monday");break;
case 2:LCD_ShowString(60,145,"Tuesday");break;
case 3:LCD_ShowString(60,145,"Wednesday");break;
case 4:LCD_ShowString(60,145,"Thursday");break;
case 5:LCD_ShowString(60,145,"Friday");break;
case 6:LCD_ShowString(60,145,"Saturday");break;
}
LCD_ShowNum(60,162,timer.hour,2,16);
LCD_ShowNum(84,162,timer.min,2,16);
LCD_ShowNum(108,162,timer.sec,2,16);
LED0=~LED0;
}
}
delay_ms(20);
}
完了,就这些是自己改写来的,算是山寨作品咯 ;
不过这里写 bug 
结束时间调节的,要等下一秒才会刷新显示,看起来怪怪的。
日期调节时候,加一部分没问题。超出日期最大值则会显示 1;
减一部分则有点问题。闰2月,到 1 号是继续减会变成29,继续减会变成28,功能正常,
平2月继续往下减也正常。
但是其他月份继续往下减又会变成 1 号了。搞不懂。
还有就是键盘不能长按连续加。
在这里附上工程文件,比较乱 |