音乐播放器按键控制模块.docxVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
音乐播放器按键控制模块

4.2.1 键盘的实现 凌阳SPCE061A单片机精简开发板自身带有4个按键,分别为S1、S2、S3、S4,其中S4用于对单片机进行复位,因此还有S1、S2、S3三个按键可用。在SPCE061A中,S1、S2、S3都在内部与IOA0~IOA2相连接,因此可以通过控制IOA口低八位控制这几个键,在程序中,S1、S2、S3相当于一个1×3的键盘,通过读写IOA口低八位,得到端口数据,通过移位运算等,即可得到键值,并将键值存放于变量KeyCode中。 为实现通过IOA口控制1×3的键盘,需要将IOA口低八位设置为输入模式,只有这样才能确保能够读取IOA口的状态;同时,将IRQ6中断作为键盘的中断,每当IRQ6中断到来,系统自动调用键扫描程序Key_Scan(),扫描键盘,通过检测按键的抬起状态和抬起时间,判断是否有键按下。程序中,IRQ6中断由按键扫描初始化程序启动,在初始化程序中,首先完成对IO口的输入以及变量的初始化,然后开启IRQ6中断。之后,没每当有键按下,便会产生一个IRQ6中断,并进入中断服务子程序,在进入该程序以后,调用键扫描程序扫描键盘,读取键值并存储。 在键盘实现中,定义3个全局变量KeyCode、ScanCnt、KeyUp分别用来保存得到的键值、按键持续时间、按键抬起标志,当本次扫描有键按下时,KeyUp置0,若本次得到的键值与上次键值相等时,则ScanCnt加1,否则保存新键值并将ScanCnt置1;当本次扫描无键按下,则KeyUp置1。当按键持续时间ScanCnt小于4时,则认为没有发生按键;当按键持续时间ScanCnt等于64则认为有发生一次按键;若ScanCnt介于4于64之间且按键抬起标志KeyUp为1时,则认为发生一次按键。 键盘的实现,主要是完成四个函数,即键盘初始化程序Key_Init()、键扫描程序Key_Scan()、取键值程序Key_Get()以及中断服务程序。由于这些程序面向硬件进行操作,因此使用汇编语言进行编写。 键盘初始化程序的流程图如图4.3所示,初始化操作主要包含寄存器数据的保存、变量的初始化、IOA口读写方式的设置以及IRQ6(128HZ)中断的开启等。 图4.3 键盘初始化程序流程图 键扫描程序的流程图如图4.4所示,键盘扫描程序事实上是一个去抖程序,先判断是否有键按下,如果有的话,判断键值和上次扫描到的键值是否相同,如果相同,按键持续时间加1,也就是延时;如果不同,按键持续时间赋1,保存键值以便和下次扫描键值比较;如果没有键按下,认为键盘已经抬起。 图4.4 键扫描程序流程图 取键值程序如图4.5所示,由于扫描键盘是在中断中进行的,所以取键值时要先关中断,是否延时到设定时间,即是否扫描了四次键值都相等,如果是,比较按键的时间间隔是否小于0.5s(ScanCnt64),比较时间间隔主要是为了设定按键时间间隔,如果按键时间间隔小于0.5s而且键盘确认抬起,则表示发生一次按键,将键值保存在变量KeyCode中;否则,键值为0;开中断后,返回键值。 图4.5 键值获取程序流程图 图4.6所示为IRQ6中断服务程序的流程图。 图4.6 IRQ6中断服务程序 4.2.2 音频控制的实现 凌阳SPCE061具有强大的语音处理功能,其提供了许多S480音频播放控制的函数,通过调用这些函数,可方便我们实现对S480音频播放的控制,在该系统中,需要通过按键来控制音频播放,实现其上一曲、下一曲、播放和暂停的功能,由于设计的键盘是1×3的键盘,而现在需要实现4个功能,因此考虑将播放和暂停功能合并到一个按键,即在播放时按下该键则暂停播放,若某音频在被暂停以后按下该键则继续播放。 为了能够实现上一曲以及下一曲之间的切换,则需要将音频文件进行编号,SPCE061A IDE开发中,Resourse.asm文件中定义了音频文件的相关信息,T_SACM_S480_SpeechTable定义了资源文件的序号,默认从0开始,如下所示: .PUBLIC T_SACM_S480_SpeechTable T_SACM_S480_SpeechTable: .DW _RES_48_48K_SA .DW _RES_72_72K_SA .DW _RES_K72_72K_SA 由于程序中,调用SACM_S480_Play()来播放音频,因此在对音频文件进行编号以后,要实现上一曲及下一曲间的切换则转变为改变音频序号的问题,切换至上一曲时,应减小序号,切换至下一曲时应增加序号。在本设计中,以全局变量SnIndex代表音频的序号,以全局常量MaxIndex代表音频资源的总数。 在不考虑按键的情况下,要实现S480压缩格式音频文件的持续播放,需要利用如下的代码实现: while((SACM_S480_Status() 0x

文档评论(0)

peain + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档