我自己做的是一个DIY的mp3播放器。(相对简单一点,见笑) 大概算是完成了,但是在最后添加上一曲下一曲功能的时候遇到了瓶颈。 我在上网查看了相关材料,但大多答非所问。 我的问题是: 使用的是按键实现上一曲下一曲,所以涉及到按键扫描的频率问题。 设想的是使用中断程序,每10ms扫描一次按键,或者更短。因为播放的mp3文件的16位数据是一个时间十分短暂、次数十分多的过程。 这个10ms一次的扫描频率是否过高了?或者是否有其他方法可以实现持续整个音乐播放过程的按键扫描? (原本是在中断程序中扫描按键情况对MusicNum进行加或减,紧接着调用MusicPlay。 我在主循环中用了这个函数之后,又在中断中调用同一个函数,涉及到子函数重入的问题,会有warning。所以我将中断中的MusicPlay删除了。) 我在程序中设置一个变量MusicNum作为文件播放程序MusicPlay的参数。 MusicPlay是一个switch函数,MusicNum作为switch中case的判断参数。 在中断程序中根据按键情况对MusicNum进行加或减 中断改变MusicNum的值,在中断结束后返回MusicPlay程序后,是会根据新的MusicNum重新进入switch选择还是在继续运行上一个MusicNum对应的case? 还有几种可能的错误是: 我将按键对应引脚拉低的方式是接地,拉低的方式是否会有一些不规范的问题?(但是我自己用电压表测过了,初始电压在5V左右,按键按下后跳转至0V) 按键对应引脚的特殊性,是否会有些I/O口特别而不能将其拉低?(我选的是单片机不少I/O口都有复用的功能,但是我认为我选用的I/O只是普通的,也不是VCC和GND引脚) 我按照自己的想法做完之后,上一曲下一曲的按键并没有作用,而且长按按键的话会使音乐停止播放,松开后继续播放当前音乐,说明并没有MusicNum值的改变。 我原本认为是没有进入中断,长按通知播放是引脚的问题(例如拉低某个引脚会进入掉电模式等等),所以在将中断程序去除再长按,以证明。但是去除后,按键却理想化的没有任何作用。下为按键扫描的部分 if(key2==0) //音乐下一首 { delayms(10); if(key2==0); { MusicNum++; while(!key2); } } 所以是可以进入中断的,长按停止播放应该是 while(!key2); /等待按键释放 这一句的作用。 那么为什么进入了中断中的扫描按键,并且可以到等待按键释放这一句却无法使得上一句中的MusicNum产生数值变化? 我不知道问题可能出在哪,麻烦大佬可以提供些意见或者看法,十分感谢!
|