找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1546|回复: 3
打印 上一主题 下一主题
收起左侧

code数组定义在其他C语言文件extern后无法正常调用的问题

[复制链接]
跳转到指定楼层
楼主
本帖最后由 Carose 于 2021-6-19 14:01 编辑

最近做了一个52单片机板子的可爱的LCD显示的音乐盒,能实现播放、暂停、切歌、停止并重新播放以及弹奏功能,并且会在LCD1602显示状态。
目前已经基本开发完成,我们采用了多文件编程的形式,并且配了大量注释,有很高的可移植性。目前尝试完成升降调的开发。完成后考虑开源:P
但是我们开发过程中遇到过一些问:
  1. //以下为歌曲数据文件

  2. u16 code Astronomia[] =      //音阶,第几个八度(0,1,2,3),时值(八分音符为1),以0,0,0结尾才能循环
  3. {
  4.         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),\
  5.         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),\
  6.         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),\
  7.         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),\
  8.         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),\
  9.         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),\
  10.         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),\
  11.         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),\
  12.         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),\
  13.         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),\
  14.         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),\
  15.         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),\
  16.         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),\
  17.         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),\
  18.         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),\
  19.         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),\
  20.         NOTE(6,3,2), NOTE(6,3,2), NOTE(0,0,0)
  21. };
复制代码
我们用u16 code存储歌曲数据。本来在ROM这个文件夹里有musicLib这个c文件是打算用来存储歌曲信息的。但是code定义的变量在主函数extern u16 code Astronomia[]后,编译器不会报错,但实际上并不能正常播放。必须将code 的数据全部移到main.c才能正常使用。这导致了main.c有三百多行代码,我们自己看着也头疼。

因此希望有相关开发经验或者了解keil编译原理的大神能够解释一下这个问题,能否有相应的解决方案。



结果见置顶帖

enlight.jpg (985.66 KB, 下载次数: 45)

enlight

enlight

正面.jpg (2.34 MB, 下载次数: 28)

正面

正面

背面.jpg (3.05 MB, 下载次数: 31)

背面

背面

图片1.png (121.88 KB, 下载次数: 36)

keil界面,问题代码所在

keil界面,问题代码所在
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:298123 发表于 2021-6-19 12:11 | 只看该作者
在这个.c文件里,定义一个 u16 *pdata = &Astronomia[0];  然后头文件里声明这个extern u16 *pdata;
回复

使用道具 举报

板凳
ID:176854 发表于 2021-6-19 08:59 | 只看该作者
将"musicLib.c"改为"musicLib.h",将数组Astronomia[]放入"musicLib.h"中,最后在“main.c”加上#include “"musicLib.h"
回复

使用道具 举报

地板
ID:922355 发表于 2021-6-19 10:36 来自手机 | 只看该作者
jjjjjjir 发表于 2021-6-19 08:59
将"musicLib.c"改为"musicLib.h",将数组Astronomia[]放入"musicLib.h"中,最后在“main.c”加上#include “ ...

感谢回复,不过这么做是不是会导致这个h文件只能被include一次。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表