|
楼主 |
发表于 2007-3-7 13:48:31
|
显示全部楼层
这纯粹是一个练手的东东。叫什么名字呢?就叫“jimo版电子40年历”吧。不过,也可以实用的哦。
如果你觉得你从中获益,就向你不认识的人提供一次帮助。
如果你做了板,还觉得挺漂亮的,就送我一块。我的电路是在试验板上完成的(惭愧,我不会画电路图,也不会制板)。这样我也可以做一个漂亮的电子日历。
我设计时,目标之一是多MPU易于迁移的。事实上,几乎所有的代码是在Windows操作系统里运行调试的,仅仅和硬件相关的少量代码是在Atmega8上调试的。
不仅如此,硬件线路设计也是非常的自由,在写代码时已经考虑了硬件线路设计的某些不便,因此,需要改动硬件线路的连接时,不需要带原代码进行改动,只需要调整一些定义就可以。
因为硬件资源有限,因此,只提供了40年的日历数据。如果换成Atmega16,则可以轻而易举的做成“百年历”。
日历功能说明:
日历的界面标准配置是:11位LED数码显示管,10个LED指示灯,一个蜂鸣器,上下左右四个按钮。3个指示灯用于指示当前正在调整时间、日期和闹钟,另外7个指示灯指示闹钟星期天到星期六的有效日期。
加电时,日历从2000年1月1日0点时刻开始计时。
一共提供5个闹钟,9个铃声,可控制的整点半点报时。
调整日期时,阴历、星期自动调整。
按左键显示日期。7个指示灯还表示整点报时是有有效。显示日期的时候,长按左键可以开关整点报时。如果当天是某节气,则显示该节气的序号(没有点阵式LED嘛)。
按上下键显示闹钟。
按右键显示阴历。并显示下一个节气的序号及距当天还有多少天。
长按右键,进入设置状态。在设置状态,按上下键选择设置闹钟时间日期。
除了参考了Atmega8的Datasheet的少量代码,其它代码都是原创。但是不排除和他人的代码相似。
硬件设计指南:
应用在Atmega8上时,PORTD口驱动LED的8个段,PC0-PC3做位选。
PB1驱动蜂鸣器,PB2-PB5作按键输入,下拉表示按键。PB6-PB7接32768Hz晶振。
前面说了,设计目标之一是易于迁移,因此我把与硬件相关的内容没有设计到核心部分。如果要迁移到不同的硬件平台上,下列几个类及文件可能需要重写:
CAvrCalendar,
CEEprom,
CRing,
Interrupt.cpp
1、CAvrCalendar
CAvrCalendar是日历框架的派生类,实现在不同硬件平台上的主程序运行。包括端口初始化、时钟初始化、LED驱动、按键驱动。
日历核心只需要一个64Hz的精确定时即可,时钟初始化就是为了得到这64Hz的精确时钟。
日历核心假设所需的四个按键使用一个字节的其中4个比特位来表示,按键驱动则是获得当前四个按键状态的,某个键接触用1表示,断开了用0表示。
2、CEEprom
闹钟数据及日历数据是保存在EEPROM里的,不同的硬件读写EEPROM的方法可能会不一样。或者,干脆选择其它的保存方式。CEEprom就是提供掉电数据保存的。
3、CRing
驱动铃声的方式亦随硬件的不同而变化,因此,根据不同的硬件来编写合适的铃声驱动代码。
铃声是用16Hz定时信号控制,16位Timer驱动的,每一个脉冲相当于乐谱里的1/16拍,针对不同的硬件,需要修改里面定义的访问硬件的宏,及表示12个乐符频率的代码。当然在AVR上是不需要再修改了。
乐谱的表示,在Ring.cpp里有说明。作为一份上再调试中的代码,只给了五个非常简单的乐谱。分别是四个短嘀声,一长两短的嘀声,儿歌《小燕子》,儿歌《一分钱》,催眠曲。
4、Interrupt.cpp
毫无疑问这是和硬件紧密相关中断处理。现在的电子日历只需要一个精确的64Hz定时中断。至于里面还有一个EEPROM准备好中断,那是为EEPROM写而准备的,不属于日历的核心需要。
软件移植指南:
现在的程序是基于Atmega8编写,但是已经把和硬件相关的代码提取出来,因此,要移植到不同的MCU上(主要还是针对Atmage芯片),请参考如下说明。
附加说明:代码里已经给出了移植到Atmega16上例子,但是仅仅是个例子而已,我没有阅读Atmega16的Datasheet,针对Atmega16的端口的定义,是从Atmega8的代码复制而来,确保能编译,但是运行可能不能得到期望的结果。
1、修改CAvrCalendar::InitPort()
修改CAvrCalendar::InitPort()的目的,是定义目标芯片的引脚定义,使得其它部分的代码能正确驱动外部电路。
2、修改CAvrCalendar::InitTimer()
修改CAvrCalendar::InitTimer()的目的,是得到两个定时时钟,一个64Hz的时间驱动,一个是蜂鸣器驱动。蜂鸣器的定时时钟默认是关闭状态。
3、修改device.h文件里的头文件包含、Timer操作宏、功能定义、LED驱动、键盘驱动五部分的定义。
头文件包含部分里,加入你期望的芯片判断及该芯片的头文件,格式请看代码中的范例。
Timer操作宏定义了蜂鸣器操作所代码对Timer的操作方法。
功能定义部分针对不同的芯片及期望,可以定义不同的功能。
LED驱动部分定义了如何对LED的数据输出、位选、消隐进行操作。
键盘驱动定义了如何获取键盘状态。键盘状态要求用一个字节表示,最低位开始的四个比特位分别表示:UP, DOWN, LEFT, RIGHT。当然,可以修改defines.h文件来重新定义。
如何移植到其它平台,请和作者联系。
其它说明:
1、作者试图用GCC编译,并且编写代码时也考虑过其它编译器问题。但是因为代码量比较多,GCC不能将代码大小优化到能装入Atmega8,所以放弃使用GCC。
2、代码里有WIN32之类的字眼,请忽略它。这是作者在Windows操作系统上调试代码时编写的,考虑到以后还可能在Windows操作系统上调试,就保留下来了。
3、出于个人学习的目的,您可以自由的修改使用这份代码。但是请不要分发原始代码及修改后的代码,更不要用于商业用途。您可以向第三方自然人推荐这份代码,但是请说明代码的作者,以及只有在www.ouravr.com能下载到这份代码。
4、如果您修改了这份代码,建议您告诉作者您做了何修改,但这不是必须的。
5、本代码的农历数据来自互联网络,无法确定数据录入者。但是作者仍然向最初录入数据的人致敬。
AVR快乐。
jimo
2007.3.8 |
|