欢迎来到天天文库
浏览记录
ID:51127788
大小:225.44 KB
页数:8页
时间:2020-03-09
《音乐播放器按键控制模块.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、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口低八位设置
2、为输入模式,只有这样才能确保能够读取IOA口的状态;同时,将IRQ6中断作为键盘的中断,每当IRQ6中断到来,系统自动调用键扫描程序Key_Scan(),扫描键盘,通过检测按键的抬起状态和抬起时间,判断是否有键按下。程序中,IRQ6中断由按键扫描初始化程序启动,在初始化程序中,首先完成对IO口的输入以及变量的初始化,然后开启IRQ6中断。之后,没每当有键按下,便会产生一个IRQ6中断,并进入中断服务子程序,在进入该程序以后,调用键扫描程序扫描键盘,读取键值并存储。在键盘实现中,定义3个全局变量Key
3、Code、ScanCnt、KeyUp分别用来保存得到的键值、按键持续时间、按键抬起标志,当本次扫描有键按下时,KeyUp置0,若本次得到的键值与上次键值相等时,则ScanCnt加1,否则保存新键值并将ScanCnt置1;当本次扫描无键按下,则KeyUp置1。当按键持续时间ScanCnt小于4时,则认为没有发生按键;当按键持续时间ScanCnt等于64则认为有发生一次按键;若ScanCnt介于4于64之间且按键抬起标志KeyUp为1时,则认为发生一次按键。键盘的实现,主要是完成四个函数,即键盘初始化程
4、序Key_Init()、键扫描程序Key_Scan()、取键值程序Key_Get()以及中断服务程序。由于这些程序面向硬件进行操作,因此使用汇编语言进行编写。键盘初始化程序的流程图如图4.3所示,初始化操作主要包含寄存器数据的保存、变量的初始化、IOA口读写方式的设置以及IRQ6(128HZ)中断的开启等。图4.3键盘初始化程序流程图键扫描程序的流程图如图4.4所示,键盘扫描程序事实上是一个去抖程序,先判断是否有键按下,如果有的话,判断键值和上次扫描到的键值是否相同,如果相同,按键持续时间加1,也就
5、是延时;如果不同,按键持续时间赋1,保存键值以便和下次扫描键值比较;如果没有键按下,认为键盘已经抬起。图4.4键扫描程序流程图取键值程序如图4.5所示,由于扫描键盘是在中断中进行的,所以取键值时要先关中断,是否延时到设定时间,即是否扫描了四次键值都相等,如果是,比较按键的时间间隔是否小于0.5s(ScanCnt<64),比较时间间隔主要是为了设定按键时间间隔,如果按键时间间隔小于0.5s而且键盘确认抬起,则表示发生一次按键,将键值保存在变量KeyCode中;否则,键值为0;开中断后,返回键值。图4.
6、5键值获取程序流程图图4.6所示为IRQ6中断服务程序的流程图。图4.6IRQ6中断服务程序4.2.2音频控制的实现凌阳SPCE061具有强大的语音处理功能,其提供了许多S480音频播放控制的函数,通过调用这些函数,可方便我们实现对S480音频播放的控制,在该系统中,需要通过按键来控制音频播放,实现其上一曲、下一曲、播放和暂停的功能,由于设计的键盘是1×3的键盘,而现在需要实现4个功能,因此考虑将播放和暂停功能合并到一个按键,即在播放时按下该键则暂停播放,若某音频在被暂停以后按下该键则继续播放。为了
7、能够实现上一曲以及下一曲之间的切换,则需要将音频文件进行编号,SPCE061AIDE开发中,Resourse.asm文件中定义了音频文件的相关信息,T_SACM_S480_SpeechTable定义了资源文件的序号,默认从0开始,如下所示:.PUBLICT_SACM_S480_SpeechTableT_SACM_S480_SpeechTable:.DW_RES_48_48K_SA.DW_RES_72_72K_SA.DW_RES_K72_72K_SA由于程序中,调用SACM_S480_Play()来播
8、放音频,因此在对音频文件进行编号以后,要实现上一曲及下一曲间的切换则转变为改变音频序号的问题,切换至上一曲时,应减小序号,切换至下一曲时应增加序号。在本设计中,以全局变量SnIndex代表音频的序号,以全局常量MaxIndex代表音频资源的总数。在不考虑按键的情况下,要实现S480压缩格式音频文件的持续播放,需要利用如下的代码实现:while((SACM_S480_Status()&0x0001)!=0){SACM_S480_ServiceLoop();*P_Watc
此文档下载收益归作者所有