找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自制mp3涉及到的按键实现上一曲下一曲的问题

[复制链接]
跳转到指定楼层
楼主
ID:689980 发表于 2020-3-29 19:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我自己做的是一个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产生数值变化?
我不知道问题可能出在哪,麻烦大佬可以提供些意见或者看法,十分感谢!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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