OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6683|回复: 10

可调RTC,利用例程KEY,RTC修改来的

[复制链接]

19

主题

248

帖子

2

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2012-2-8
在线时间
19 小时
发表于 2012-3-25 16:30:29 | 显示全部楼层 |阅读模式
            

花了一个星期终于调出来了啊

以原子的KEY,RTC两个例程为基础。

实现以下功能,

  1. 按板子的 wk_up一次,进入时间调节模式,并选中 年 项,再按一次则是 月。顺序为 年 月 日 时 分 。再按一次则结束调节,更新时间。
  2. 按板子的 K1 对选中的时间加一。
  3. 按板子的 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 0CD_ShowString(60,145,"Sunday");break;
case 1CD_ShowString(60,145,"Monday");break;
case 2CD_ShowString(60,145,"Tuesday");break;
case 3CD_ShowString(60,145,"Wednesday");break;
case 4CD_ShowString(60,145,"Thursday");break;
case 5CD_ShowString(60,145,"Friday");break;
case 6CD_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 0CD_ShowString(60,145,"Sunday");break;
case 1CD_ShowString(60,145,"Monday");break;
case 2CD_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 号了。搞不懂。

还有就是键盘不能长按连续加。

在这里附上工程文件,比较乱

RTC.rar

759.04 KB, 下载次数: 321

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

248

帖子

2

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2012-2-8
在线时间
19 小时
 楼主| 发表于 2012-3-25 16:31:07 | 显示全部楼层
原理用搜狗浏览器要用高速模式才能使用编辑栏里面的功能啊。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-25 17:34:34 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

19

主题

248

帖子

2

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2012-2-8
在线时间
19 小时
 楼主| 发表于 2012-3-25 18:13:51 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,那几个bug应该怎么解决啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-25 20:07:06 | 显示全部楼层
回复【4楼】寒寒:
---------------------------------
去论坛建设区发帖.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
886
金钱
886
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-3-25 23:23:25 | 显示全部楼层
回复【楼主位】寒寒:
---------------------------------
也学会发表哦。。呵呵。。
很喜爱电子行业
回复 支持 反对

使用道具 举报

19

主题

248

帖子

2

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2012-2-8
在线时间
19 小时
 楼主| 发表于 2012-3-27 16:30:39 | 显示全部楼层
回复【6楼】冰是睡着的水:
---------------------------------
发表还是会的
回复 支持 反对

使用道具 举报

12

主题

216

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2011-4-7
在线时间
3 小时
发表于 2012-3-27 21:23:03 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

12

主题

216

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2011-4-7
在线时间
3 小时
发表于 2012-3-27 21:39:00 | 显示全部楼层
咦不能调秒 改下
回复 支持 反对

使用道具 举报

19

主题

248

帖子

2

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2012-2-8
在线时间
19 小时
 楼主| 发表于 2012-3-27 23:04:31 | 显示全部楼层
回复【9楼】lixupeng:
---------------------------------
我觉得没必要改秒就不弄了,程序有几个bug
回复 支持 反对

使用道具 举报

9

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-5-12
在线时间
0 小时
发表于 2013-5-17 22:12:27 | 显示全部楼层
不错。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-20 04:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表