📄 readme.txt
字号:
这纯粹是一个练手的东东。叫什么名字呢?就叫“jimo版电子30年历”吧。不过,也可以实用的哦。
如果你觉得你从中获益,就向你不认识的人提供一次帮助。
如果你做了板,还觉得挺漂亮的,就送我一块。我的电路是在试验板上完成的(惭愧,我不会画电路图,也不会制板)。这样我也可以做一个漂亮的电子日历。
我设计时,目标之一是多MPU易于迁移的。事实上,几乎所有的代码是在Windows操作系统里运行调试的,仅仅和硬件相关的少量代码是在Atmega8上调试的。
不仅如此,硬件线路设计也是非常的自由,在写代码时已经考虑了硬件线路设计的某些不便,因此,需要改动硬件线路的连接时,不需要带原代码进行改动,只需要调整一些定义就可以。
因为硬件资源有限,因此,只提供了30年的日历数据。如果换成Atmega16,则可以轻而易举的做成“百年历”。
日历功能说明:
日历的界面标准配置是:11位LED数码显示管,10个LED指示灯,一个蜂鸣器,上下左右四个按钮。3个指示灯用于指示当前正在调整时间、日期和闹钟,另外7个指示灯指示闹钟星期天到星期六的有效日期。
加电时,日历从2000年1月1日0点时刻开始计时。
一共提供5个闹钟,9个铃声,可控制的整点半点报时。
调整日期时,阴历、星期自动调整。
按左键显示日期。7个指示灯还表示整点报时是有有效。显示日期的时候,长按左键可以开关整点报时。如果当天是某节气,则显示该节气的序号(没有点阵式LED嘛)。
按上下键显示闹钟。
按右键显示阴历。并显示下一个节气的序号及距当天还有多少天。
长按右键,进入设置状态。在设置状态,按上下键选择设置闹钟时间日期。
除了参考了Atmega8的Datasheet的少量代码,其它代码都是原创。但是不排除和他人的代码相似。
硬件设计指南:
应用在Atmega8上时,PORTD口驱动LED的8个段,PC0-PC4做位选。
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里有说明。作为一份上再调试中的代码,只给了两个非常简单的乐谱。一个是大家常用的电子钟的“嘀嘀嘀嘀……嘀嘀嘀嘀……”声,一个是“1234567”。
4、Interrupt.cpp
毫无疑问这是和硬件紧密相关中断处理。现在的电子日历只需要一个精确的64Hz定时中断。至于里面还有一个EEPROM准备好中断,那是为EEPROM写而准备的,不属于日历的核心需要。
遗憾之:
1、
应用在Atmege8上,因为Flash空间的限制,不能把节气计算的代码编译进去,所以没有节气显示的功能。但是已经写好的代码都是经过调试无误的。
2、
EEPROM读写是我自以为很得意的一段代码,居然运行的结果不对,读写EEPROM的位置不对,数据也不对,调试了多天依旧没有找到问题。本来想调试好再发布的,但是我马上要回老家过年,没有时间上网了,就只好将有问题的代码上传,恳请大家帮我指出其中的错误,年后我再来维护这份代码。
上传之前,我对代码的版面作了一下美化,希望没有因此无意中弄坏代码。
AVR快乐。
jimo
2007.2.8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -