OpenEdv-开源电子网

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

这几天学校电子竞赛做的多功能万年历

[复制链接]

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2012-6-12 09:35:37 | 显示全部楼层 |阅读模式



 

          随便拍了几张,现在我的队友在做硬件,有些功能等硬件出来再做,现在完成的主要功能有:
            1.阳历年,月,日,时,分,秒,星期,闰年,平年显示
            2.农历月,日
            3,生肖,节气,重要节假日显示
            4.模拟时钟
            5.时间设置,时间自动校准+/-8second,3个闹钟设置,分单次和每天两个模式
            6.主界面是图形菜单,最多有三级菜单
            7.能存贮,校准值,闹钟设置,掉电后不消失
            8,温度显示

主要硬件有:1块ST7920控制器的12864,主控MCU:STC12C5A60S2,DS1302,DS18B20,4个按键
        源码暂不上传,等完工后,会把视频和源码一并奉上,呵呵

 

 

 

上图是所有工程文件。fficeffice" />

///////////////////////////////////////////////////////////////////////////////

//变量定义

unsigned char  KeyFuncIndex=0;    //存放当前的菜单索引

unsigned char  KEY_TYPE=0;   //当前按下的键值类型

void (*KeyFuncPtr)();            //定义按键功能指针

//////////////////////////////////////////////////////////////////////////////////

//定义菜单切换链表

StatusTab code KeyTab[MENU_SIZE]=

{

{0,3,2,1,0,(*InitMenuIterface)},     //初始化主菜单界面 默认时钟

{1,7,0,2,1,(*state0)},      //主界面菜单设置

{2,2,1,0,2,(*state1)},      //主界面菜单说明

  {3,5,4,4,0,(*state2)},      //时钟选择界面1

{4,6,3,3,0,(*state3)},      //时钟选择界面2

{5,5,5,5,3,(*state4)},      //数字时钟

{6,6,6,6,4,(*state5)},      //模拟时钟

{7,10,9,8,1,(*state6)},      //时间设置

  {8,11,7,9,1,(*state7)},      //时间校准

{9,12,8,7,1,(*state8)},      //闹钟设置

{10,10,10,10,7,(*state9)},      //时间设置界面

{11,11,11,11,8,(*state10)},       //时间自动校准 +/-8 sec

{12,15,14,13,9,(*state11)},       //闹钟设置1菜单

{13,16,12,14,9,(*state12)},       //闹钟设置2菜单

{14,17,13,12,9,(*state13)},       //闹钟设置3菜单

{15,15,15,15,12,(*state14)},       //闹钟1设置界面

{16,16,16,16,13,(*state15)},       //闹钟2设置界面

{17,17,17,17,14,(*state16)},       //闹钟3设置界面

};

///////////////////////////////////////////////////////////////////////////////

void MenuOperate()   //运行菜单

{

    switch(KEY_TYPE)

{

case  1:   

KeyFuncIndex=KeyTab[KeyFuncIndex].KeyOKStatus;  //确认按键

break; 

case  2:  

KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpStatus; //向上按键

break; 

    case  3:       

     KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDownStatus; //向下按键

break; 

case  4:

KeyFuncIndex=KeyTab[KeyFuncIndex].KeyBackStatus; //返回按键

break; 

default: 

break;

//此处添加按键错误代码

}

KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate; //下面是执行按键的操作

(*KeyFuncPtr)();     //执行当前的按键操作

}  

采用上面的菜单管理所有的程序,这种架构就是那种状态机的思维,对应菜单项都有对应的操作,每次操作都会,所有的状态都是一环扣一环的,跳转很方便,每次跳转执行相应的函数,处于一种稳定的状态。如下面的函数:

///////////////////////////////////////////////////////////////////////////////

//初始化主菜单界面 默认时钟

void InitMenuIterface()

{

LCD12864PutStr(0,3,"时钟");  //写字符串函数

LCD12864DrawPicture(0,16,15,47,gImage_arrows_left,0); 

LCD12864DrawPicture(112,16,127,47,gImage_arrows_right,0); 

LCD12864DrawPicture(16,16,47,47,gImage_set,0);

  LCD12864DrawPicture(48,16,79,47,gImage_timer,1);

LCD12864DrawPicture(80,16,111,47,gImage_explanation,0);

LCD12864PutStr(3,3,"选择");  //写字符串函数

while(1)

{

KEY_TYPE = KeyScan();

if((KEY_TYPE!=0)&&(KEY_TYPE!=4))

{

WriteCom(CLEAR_DDRAM);  //清楚DDRAM

     CLEAR_GDRAM(); //清楚GDROM如果不清除会出现花屏

break; //无按键或者,按下返回键则 都无效,处于等待状态!

}

}

}

上面使用while(1)的原因是因为上面只要执行一次的,当接受到按键消息的时候立即作出相应的处理,跳入到下一个状态。一环扣一环,当我加入闹钟功能的时候就比较蛋疼了,闹钟需要不断的实时检测,不向STM32那样自带的闹钟中断,我只能把闹钟检测加入到所有的状态中去了。不知道各位兄弟有什么比较好的办法没。还有我基本上把所有的状态都添加到了menu_function这个文件中去了,似乎也不太合理。程序过于庞大,都超过1500行了。但是再放到其他的文件当中又怕过于凌乱,以后检查菜单跳转又不怎么方便。

题外话:本来打算用STM32做一个大型的带GUI的项目,硬件,基本上准备好了,就差一个能够综合所有东西的架构了。这次电赛,题目不是很难,基本上上面的这种架构就可以满足系统的要求了,可是对于STM32如何组织起来,结构更加合理,我还是一脸茫然。


 

 

 

 


 

站在巨人的肩膀上不断的前进。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2012-6-12 10:57:46 | 显示全部楼层
https://github.com/roxma
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-6-12 11:37:45 | 显示全部楼层
期待中。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2012-6-12 18:36:00 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------麻烦原子哥快来解答我的困惑,呵呵
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-6-12 19:51:35 | 显示全部楼层
一点点加了.没什么窍门.
比如你有10个功能,都分别实现了(一个工程一个.c文件和.h文件).
然后你就选择其中一个做你的母工程,然后把其他的9个功能代码往里面加,这样一点点加起来,就成了一个综合的工程了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2012-6-12 20:43:53 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
准备研究PIC GUI ,然后想办法改成自己的,嫁接到自己的工程中去,估计这样做可以让代码组织的来更合理些。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-10-26
在线时间
0 小时
发表于 2012-10-26 20:38:10 | 显示全部楼层
亲,源程序啊!!我也想做一个试试,就发一个给我吧!!亲!!亲,发我邮箱吧269962171@qq.com
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-4-22
在线时间
3 小时
发表于 2013-4-22 20:03:44 | 显示全部楼层
参考了
回复 支持 反对

使用道具 举报

1

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-2-19
在线时间
1 小时
发表于 2013-5-15 23:47:21 | 显示全部楼层
挺强大
回复 支持 反对

使用道具 举报

4

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2013-3-8
在线时间
5 小时
发表于 2013-5-17 19:19:20 | 显示全部楼层
哇塞,指针式时钟,有难度啊,嘿嘿,我也想做了。
我的未来不是梦!
回复 支持 反对

使用道具 举报

27

主题

774

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1473
金钱
1473
注册时间
2013-4-12
在线时间
77 小时
发表于 2013-5-17 23:58:42 | 显示全部楼层
界面不错哦
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-12-13
在线时间
0 小时
发表于 2014-12-13 12:07:36 | 显示全部楼层
初学万年历,想让大神发这个程序来研究一下!谢谢!!
回复 支持 反对

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2013-11-21
在线时间
42 小时
发表于 2014-12-13 16:25:18 | 显示全部楼层
自动校准???
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 08:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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