




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4.2.1 键盘的实现凌阳SPCE061A单片机精简开发板自身带有4个按键,分别为S1、S2、S3、S4,其中S4用于对单片机进行复位,因此还有S1、S2、S3三个按键可用。在SPCE061A中,S1、S2、S3都在内部与IOA0IOA2相连接,因此可以通过控制IOA口低八位控制这几个键,在程序中,S1、S2、S3相当于一个13的键盘,通过读写IOA口低八位,得到端口数据,通过移位运算等,即可得到键值,并将键值存放于变量KeyCode中。为实现通过IOA口控制13的键盘,需要将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音频播放的控制,在该系统中,需要通过按键来控制音频播放,实现其上一曲、下一曲、播放和暂停的功能,由于设计的键盘是13的键盘,而现在需要实现4个功能,因此考虑将播放和暂停功能合并到一个按键,即在播放时按下该键则暂停播放,若某音频在被暂停以后按下该键则继续播放。为了能够实现上一曲以及下一曲之间的切换,则需要将音频文件进行编号,SPCE061A IDE开发中,Resourse.asm文件中定义了音频文件的相关信息,T_SACM_S480_SpeechTable定义了资源文件的序号,默认从0开始,如下所示:.PUBLIC T_SACM_S480_SpeechTableT_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() & 0x0001)!=0)SACM_S480_ServiceLoop();*P_Watchdog_Clear=0x0001;即循环检测S480语音是否播放结束,没有结束的利用SACM_S480_ServiceLoop();实现其持续播放,为了能够通过按键控制音频的播放,需要对该代码进行改动,在其中增加对键值的判断,修改后的代码如下:while( ( ( SACM_S480_Status() & 0x0001 ) != 0 ) & ( iKey != KEY_1) & ( iKey != KEY_2) & ( iKey != KEY_3) )SACM_S480_ServiceLoop();iKey = Key_Get () ;*P_Watchdog_Clear=0x0001;修改后,循环在有键值的情况下结束,然后对循环结束条件进行判断,根据判断结果执行相应的动作,代码如下:if( ( ( SACM_S480_Status () & 0x0001 ) =0 ) | ( iKey = KEY_2 ) ) /播放结束或键值等于KEY_2则播放下一曲SnIndex+;/增加音频序号,增加后若达最大值则回0if( SnIndex = MaxIndex ) SnIndex=0;play();/播放音频*P_Watchdog_Clear=0x0001;if( iKey = KEY_3 )/键值等于KEY_3则实现播放、暂停if( ( SACM_S480_Status() & 0x0001 ) != 0 ) /音频没有播放结束SACM_S480_Pause();/则暂停播放 *P_Watchdog_Clear = 0x0001;if( iKey = KEY_1 ) /键值等于KEY_1if( SnIndex = 0) SnIndex = MaxIndex;/减小音频序号,若当前值为0,SnIndex-;/则为最大值,即音频数量减1play();/播放音频*P_Watchdog_Clear=0x0001;通过这种方法实现对音频播放的控制,当播放结束或键值等于Key1导致循环结束时,这表示系统应该继续播放下一首音频,因此音频的序号加1,当加1以后达到音频数目时,则序号回0,调用play()当前序号的歌曲;当键值等于key2导致的循环结束时,表明系统应该播放当前音频序号前的音频,当序号等于0时,将序号赋值为音频数目后减1,然后调用play()播放当前序号音频;当键值为Key3导致的的结束时,由于此时音频可能在播放也可能不在播放,因此需进行判断,当音频在播放时,调用SACM_S480_Pause()暂停当前音频的播放,若音频不在播放则不执行动作。将该方法通过函数进行实现,即controll()函数,其函数流程图如图4.7所示。图4.7 Control()函数流程图上述的程序只能实现对正在播放音频的控制,要完成音频模式的完整功能,还需要音频模式的主程序以及play()函数的实现。音频模式的主程序流程图如图4.8所示,在系统启动,选择进入音频模式以后,系统调用该程序,首先对键盘及S480放音进行初始化,然后反复读取键值,当有用的键值产生时,判断该键值,当键值为Key1或Key2时,改变音频序号,调用play()播放上一曲或下一曲,当键值为key3时,则直接调用SACM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论