本帖最后由 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編譯原理的大神能夠解釋一下這個問題,能否有相應的解決方案。
結果見置頂帖
|