放假前买了zl0801的一块MP3板,于是利用假期把原来的程序更新了一下,有很多地方都是参考Bozai和zl0801的程序。现公布源码,有此板的朋友们可以参考一下。
主要加入的功能就是菜单显示,是看到手机上的显示方式来的灵感。本人比较喜欢玩吉他,于是加入了几个平时玩吉他要用的小工具。
目前只实现了,音乐播放,吉他调音器,音乐文件浏览等功能,其它的功能正在开发中,只支持FAT32文件格式。现有的程序中还有很多bug,放歌时有时会死机(不过现在很少出现了),显示汉字时有些字显示不完全,可能是字库文件跨簇引起的。
在这里要感谢Bozai和zl0801,若不是他们的程序,我不可能在这么短时间内弄懂FAT。
源代码:
点击此处下载ourdev_223655.rar(文件大小:921K)
原理图和PCB:
点击此处下载ourdev_224515.rar(文件大小:228K) 在这也可以下到,这是zl0801的贴 http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=855912&bbs_page_no=1&bbs_id=1000
另附液晶取模软件:(今天网速太慢了,传了半天也传不上去,下次再补上)
本菜单的实现占了很多RAM,因为我在RAM里建了一个菜单结构数组,大家从代码里可以看到。原先是打算在ROM里做一个双向的环形链表,后来发现实现不了,请看如下代码
struct OPTION {
unsigned char index;
PGM_P string; //选项名字
PGM_VOID_P nomIco; //没有选中时的图标
PGM_VOID_P sltIco; //选中时的图标
struct OPTION *lastOpt; //上一个选项
struct OPTION *nextOpt; //下一个选项
};
typedef struct OPTION OPTION;
//这是声明的第一个选项,
OPTION optPlay PROGMEM ={
1,
("播放音乐"), //可能不能这样写,但编译可以通过
ico1,
ico2,
optSetup, //设置 //在这里就出现了问题,因为optSetup在前面没有声明,但不能把optSetup放在前面声明,原因请看下面
optTone, //调音 //optTone也没有声明
};
//这是声明的最后一个选项,
OPTION optSetup PROGMEM ={
8,
("系统设置"),
ico3,
ico4,
optFileView, //上一个选项,在前面已声明
optPlay, //下一个选项,将回到第一个选项,播放音乐的选项,前面已声明,如果把optSetup放在optPlay的前面声明,那这里又
}; //会出现没有声明
我想过,其实用汇编很好实现,指向结构的指针无非就是存放另一个结构在ROM中的起始地址,完全可以在ROM中做这样一个环形链表,但
用汇编写菜单的话工量太大了。
本人学AVR的时间不是很长,对GCC中PGM_P,和PGM_VOID_P的区别不是很懂,希望哪位朋友能指点一下
贴几张图片
12345 http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=931228&bbs_page_no=1&search_mode=1&search_text=mp3&bbs_id=9999
用户149535 2008-5-11 16:54