本帖最后由 Carose 于 2021-6-19 14:01 编辑
最近做了一个52单片机板子的可爱的LCD显示的音乐盒,能实现播放、暂停、切歌、停止并重新播放以及弹奏功能,并且会在LCD1602显示状态。
目前已经基本开发完成,我们采用了多文件编程的形式,并且配了大量注释,有很高的可移植性。目前尝试完成升降调的开发。完成后考虑开源:P 。
但是我们开发过程中遇到过一些问:
- //以下为歌曲数据文件
- u16 code Astronomia[] = //音阶,第几个八度(0,1,2,3),时值(八分音符为1),以0,0,0结尾才能循环
- {
- NOTE(6,1,2), NOTE(6,1,1), NOTE(3,2,1), NOTE(2,2,2), NOTE(1,2,2), NOTE(7,1,2), NOTE(7,1,1), NOTE(7,1,1), NOTE(2,2,2),\
- NOTE(1,2,1), NOTE(7,1,1), NOTE(6,1,2), NOTE(6,1,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1),\
- NOTE(6,1,2), NOTE(6,1,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(6,1,2), NOTE(6,1,1),\
- NOTE(3,2,1), NOTE(2,2,2), NOTE(1,2,2), NOTE(7,1,2), NOTE(7,1,1), NOTE(7,1,1), NOTE(2,2,2), NOTE(1,2,1), NOTE(7,1,1),\
- NOTE(6,1,2), NOTE(6,1,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(1,2,1), NOTE(1,2,1),\
- NOTE(1,2,1), NOTE(1,2,1), NOTE(3,2,1), NOTE(3,2,1), NOTE(3,2,1), NOTE(3,2,1), NOTE(2,2,1), NOTE(2,2,1), NOTE(2,2,1),\
- NOTE(2,2,1), NOTE(5,2,1), NOTE(5,2,1), NOTE(5,2,1), NOTE(5,2,1), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2),\
- NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(6,2,2), NOTE(2,2,1),\
- NOTE(1,2,1), NOTE(7,1,1), NOTE(5,1,1), NOTE(6,1,2), NOTE(6,1,1), NOTE(3,2,1), NOTE(2,2,2), NOTE(1,2,2), NOTE(7,1,2),\
- NOTE(7,1,1), NOTE(7,1,1), NOTE(2,2,2), NOTE(1,2,1), NOTE(7,1,1), NOTE(6,1,2), NOTE(6,1,1), NOTE(1,3,1), NOTE(7,2,1),\
- NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(6,1,2), NOTE(6,1,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(7,2,1),\
- NOTE(1,3,1), NOTE(6,1,2), NOTE(6,1,1), NOTE(3,2,1), NOTE(2,2,2), NOTE(1,2,2), NOTE(7,1,2), NOTE(7,1,1), NOTE(7,1,1),\
- NOTE(2,2,2), NOTE(1,2,1), NOTE(7,1,1), NOTE(6,1,2), NOTE(6,1,1), NOTE(1,3,1), NOTE(7,2,1), NOTE(1,3,1), NOTE(7,2,1),\
- NOTE(1,3,1), NOTE(1,3,1), NOTE(1,3,1), NOTE(1,3,1), NOTE(1,3,1), NOTE(3,3,1), NOTE(3,3,1), NOTE(3,3,1), NOTE(3,3,1),\
- NOTE(2,3,1), NOTE(2,3,1), NOTE(2,3,1), NOTE(2,3,1), NOTE(5,3,1), NOTE(5,3,1), NOTE(5,3,1), NOTE(5,3,1), NOTE(6,3,2),\
- NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2), NOTE(6,3,2),\
- NOTE(6,3,2), NOTE(6,3,2), NOTE(0,0,0)
- };
复制代码 我们用u16 code存储歌曲数据。本来在ROM这个文件夹里有musicLib这个c文件是打算用来存储歌曲信息的。但是code定义的变量在主函数extern u16 code Astronomia[]后,编译器不会报错,但实际上并不能正常播放。必须将code 的数据全部移到main.c才能正常使用。这导致了main.c有三百多行代码,我们自己看着也头疼。
因此希望有相关开发经验或者了解keil编译原理的大神能够解释一下这个问题,能否有相应的解决方案。
结果见置顶帖
|