找回密码
 立即注册

QQ登录

只需一步,快速开始

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

新人求助关于单片机暂停键的问题

  [复制链接]
跳转到指定楼层
楼主
ID:326331 发表于 2018-5-29 20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xiaomanong 于 2018-5-30 21:37 编辑

     我想请教一下大家,我的代码具体要怎样修改才能实现下图的“暂停键”的暂停(第一次按下)和继续播放(第二次按下)功能?我已经尝试网上的好多种方法了,但是都不行。要不就是按下停止播放但是手一放开就继续播放了;要不就是能暂停但是退不出来,再按其他键也没反应;要不就是直接又初始化了,都没能达到暂停/播放的功能。
     表达能力不太好, 文字也比较多,大家辛苦了。谢谢大家
   电子板如下

代码
   
     if(K2==0){//K2为暂停键
     mydelay(50);
    m++;
    if(m==2)
    m=0;}
     if(m%2==0){
    BeepIO=1;
     }
      else
           BeepIO=0;
    // return;
      while(m%2){
      if(K2==0){
      mydelay(50);
      m++;
      BeepIO=1;}
      else
      BeepIO=0;
      }

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

使用道具 举报

沙发
ID:111634 发表于 2018-5-30 06:49 | 只看该作者
本帖最后由 zl2168 于 2018-5-30 06:53 编辑

我有一个案例,一键三用,可用于你参考。不要把冗长程序贴上来,别人吃饱饭不会看的,要紧的是自己下功夫。
实例93  99.9秒秒表

Proteus仿真一下,确认有效。 实例95 99.9秒秒表.rar (38.86 KB, 下载次数: 33)
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,书中电路和程序设计有详细说明,电路与程序真实可靠可信可行,程序语句条条有注解。
回复

使用道具 举报

板凳
ID:61765 发表于 2018-5-30 08:40 | 只看该作者
做硬件抖动处理没
回复

使用道具 举报

地板
ID:164602 发表于 2018-5-30 09:12 | 只看该作者
程序太长,没有时间看,但你的问题我明白了:播放音乐时,怎么按键暂停和继续播放。
我做过这事儿,方法是:
第一:搞懂音乐播放函数的每条语句,重点是读懂哪些语句在读取音乐数据,数据指针是哪些变量——这是最关键的一环,没有这一步,其它的都不谈了。
第二:不能用一般的按键操作,要用外部中断。这样才能适时打断原来程序,控制音乐的播放。
第三:在中断服务函数中,设置状态变量——判断按键的奇偶,奇次暂停,偶次播放;保存环境——音乐数据读取到哪里了;设置播放函数的执行条件——如:为1才播放,为0则不播放。
第四:在音乐播放函数中,使用中断中的设置,控制音乐播放函数的执行或暂停。
回复

使用道具 举报

5#
ID:341113 发表于 2018-5-30 09:44 | 只看该作者
你看一下我的

秒计数器原理图.rar

40.91 KB, 下载次数: 45

回复

使用道具 举报

6#
ID:241128 发表于 2018-5-30 09:47 | 只看该作者
你把这段代码注释掉:
if(K2==0){//K2为暂停键
     mydelay(50);
    m++;
    if(m==2)
    m=0;}
     if(m%2==0){
    BeepIO=1;
     }
      else
           BeepIO=0;
然后换成下面这个试试:
if(K2==0){ BeepIO^=BeepIO}
回复

使用道具 举报

7#
ID:326331 发表于 2018-5-30 10:18 来自手机 | 只看该作者
zl2168 发表于 2018-5-30 06:49
我有一个案例,一键三用,可用于你参考。不要把冗长程序贴上来,别人吃饱饭不会看的,要紧的是自己下功夫。 ...

好的,谢谢你。
回复

使用道具 举报

8#
ID:326331 发表于 2018-5-30 15:14 | 只看该作者
fzhlpp 发表于 2018-5-30 09:47
你把这段代码注释掉:
if(K2==0){//K2为暂停键
     mydelay(50);

还是不行呢。
回复

使用道具 举报

9#
ID:326331 发表于 2018-5-30 15:17 | 只看该作者
亣靥 发表于 2018-5-30 08:40
做硬件抖动处理没

做了的。
回复

使用道具 举报

10#
ID:326331 发表于 2018-5-30 15:18 | 只看该作者
HC6800-ES-V2.0 发表于 2018-5-30 09:12
程序太长,没有时间看,但你的问题我明白了:播放音乐时,怎么按键暂停和继续播放。
我做过这事儿,方法是 ...

好的,超级感谢。
回复

使用道具 举报

11#
ID:241128 发表于 2018-5-30 16:28 | 只看该作者
同时也要把下面的那段去掉:
while(m%2){
      if(K2==0){
      mydelay(50);
      m++;
      BeepIO=1;}
      else
      BeepIO=0;
      }
这段跟上段是一样的,不知道你弄个m变量做什么用。你实际操作的时候是不是有时能暂停有时暂停不了....
回复

使用道具 举报

12#
ID:241128 发表于 2018-5-31 09:11 | 只看该作者
本帖最后由 fzhlpp 于 2018-5-31 10:18 编辑

if(K2==0)                         //1.按键确定按下后执行下面延时
         {
             mydelay(50);         //2.延时结束后执行下面m+1
             m++;                         //3.这条语句执行完后m的值应该为1(一般初始化变量为0,这个值要看楼主初始化的值)
             if(m==2)                 //4.执行到这里时因为m=1,所以不会执行他下面的那条语句
             m=0;                         //5.这里不会被执行
         }
if(m%2==0)                           //6.然后程序执行到这里,因为现在的m=1,1除以2的余数不为0,那么这条语句的条件不成立它里面的语句不被执行
         {
             BeepIO=1;                 //7.这里不会被执行
     }
     else                                   //8.上面的不成立那么就执行这条语句下面的BeepIO=0;
        BeepIO=0;                    //9.程序运行到这里执行这条语句,应该就是楼主的暂停吧
     while(m%2)                         //10.然后程序往下走到这里,因为m%2不为0,所以执行循环里面的语句
         {
              if(K2==0)                // 11.再次判断按键是不是还是按下的
          {
              mydelay(50);         //12.如果按键还是按下的那么这条延时就执行了
              m++;                     //13.如果按键按下的那么这条语句也执行了,执行完这条语句后m=2
              BeepIO=1;             //14.如果按键按下的那么这条语句也执行了,执行完这条语句,播放又启动了
          }
              else                     //15.上面的按键判断成立下面的就不会执行了
             BeepIO=0;
     }


如果我上面的分析正确的话,不难发现实际操作的时候按下按键始终都在播放没有暂停,当然程序是有暂停执行过,看我第9条注释 。
         只不过暂停后马上又播放了,楼主可以把延时函数的时间加长看看就能证实这点。按键按住的时间不同暂停和播放的出现概率不同。
         欢迎拍砖...

回复

使用道具 举报

13#
ID:241128 发表于 2018-5-31 09:20 | 只看该作者
本帖最后由 fzhlpp 于 2018-5-31 10:20 编辑

把你上面的全部删掉用下面的代换,你可能是在按键释放这块没做处理,所以出现随机执行功能问题。


static char key_state = 0;//这个放在你按键扫描函数里开始的地方
if(K2==0)
{
key_state = 1;
BeepIO^=BeepIO;
}
else  key_state = 0;//按键释放
回复

使用道具 举报

14#
ID:341944 发表于 2018-5-31 09:31 来自手机 | 只看该作者
第一:搞懂音乐播放函数的每条语句,重点是读懂哪些语句在读取音乐数据,数据指针是哪些变量——这是最关键的一环,没有这一步,其它的都不谈了。 第二:不能用一般的按键操作,要用外部中断。这样才能适时打断原来程序,控制音乐的播放。 第三:在中断服务函数中,设置状态变量——判断按键的奇偶,奇次暂停,偶次播放;保存环境——音乐数据读取到哪里了;设置播放函数的执行条件——如:为1才播放,为0则不播放。 第四:在音乐播放函数中,使用中断中的设置,控制音乐播放函数的执行或暂停。
回复

使用道具 举报

15#
ID:320754 发表于 2018-5-31 09:33 | 只看该作者
这个感觉还是用中断处理按键比较好,设成上升或下降沿触发
回复

使用道具 举报

16#
ID:191910 发表于 2018-5-31 09:35 | 只看该作者
你可以做一个中间变量,当状态反转后,再去处理控制管脚
static unsigned char key_state = 0;
if(K2==0)
{
   while(K2==0);
   key_state =!key_state ;
}
if(key_state == 1)
BeepIO = 1;
else
BeepIO = 0;
回复

使用道具 举报

17#
ID:326331 发表于 2018-6-1 11:13 | 只看该作者
dengyifenzhong 发表于 2018-5-31 09:35
你可以做一个中间变量,当状态反转后,再去处理控制管脚
static unsigned char key_state = 0;
if(K2==0) ...

已经解决了,谢谢你。
回复

使用道具 举报

18#
ID:326331 发表于 2018-6-1 11:14 | 只看该作者
lvyou223 发表于 2018-5-31 09:33
这个感觉还是用中断处理按键比较好,设成上升或下降沿触发

嗯嗯,已经解决了,谢谢你
回复

使用道具 举报

19#
ID:326331 发表于 2018-6-1 11:17 | 只看该作者
fzhlpp 发表于 2018-5-31 09:11
if(K2==0)                         //1.按键确定按下后执行下面延时
         {
             mydelay(50);         //2.延时结束后执行下面m+1

哇哇,感动,你的讲解和分析太细致全面了,谢谢你哦,我已经解决了。嘻嘻嘻,开心。
回复

使用道具 举报

20#
ID:326331 发表于 2018-6-1 11:20 | 只看该作者
问题已经解决了,开心,超级感谢大家的帮助,感动笔芯
回复

使用道具 举报

21#
ID:326331 发表于 2018-6-1 11:25 | 只看该作者
fzhlpp 发表于 2018-5-31 09:20
把你上面的全部删掉用下面的代换,你可能是在按键释放这块没做处理,所以出现随机执行功能问题。

坛友互动那里我还没有权限回复你的消息,问题已经解决了,超级感谢
回复

使用道具 举报

22#
ID:269211 发表于 2018-6-3 16:19 | 只看该作者
用定时器就可以了,按1次TR=0,再按1次 TR=1
回复

使用道具 举报

23#
ID:344079 发表于 2018-6-3 16:51 | 只看该作者
这里有好多大神 相信你的问题能得到解决
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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