找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3581|回复: 2
收起左侧

单片机歌曲上一曲下一曲切换问题求助

[复制链接]
ID:129083 发表于 2017-4-10 16:22 | 显示全部楼层 |阅读模式
30黑币
各位 我想请教个问题,要实现单片机歌曲的切换如何做,不用外部中断实现能用IF语句实现吗 ?
我直接在主函数下while(1)循环内写IF(!KEY)(相应的歌曲自加或自减)不起作用是为什么

回复

使用道具 举报

ID:671080 发表于 2019-12-23 11:05 | 显示全部楼层
我也在研究这个,应该是没法实现的,因为蜂鸣器响,一定是在一个循环里。
回复

使用道具 举报

ID:327029 发表于 2019-12-24 11:15 | 显示全部楼层
void PlayMusic(uchar arr[],uint num)
{
        uint i=0;
        TR1=1;
        while(i<num)                       
        {  
                display();                                                // 显示当前在播放歌曲
                if(gPlayStatus==1)                                          // 判断播放状态是否为播放还是暂停
                {   
                        gTone=arr[i];                                        // 给全局变量gTone赋值,方便中断函数使用
                        PlayTone(arr[i],arr[i+1]);                   // 开始演奏一个节拍
                         i+=2;                                                        // 进入下一个节拍,因为每2个数为1组,所以每次要加2
                        if(i==num)                                                // 判断歌曲是否播放完了
                        {
                                gPlayStatus=0;                                // 播放完了的话,则把播放状态改为暂停,否则会循环播放
                                TR1=0;
                                T1_num=0;
                                fen=0;
                                miao=0;

                                gSong++;                                                // 把当前播放到第几首歌的变量gSong加1,即切到下一曲
                                if(gSong>SONG)                                        // 如果gSong为SONG,说明到后面的尽头了,则转为第一首
                                        gSong=1;
                        }
                }

                if(Key1_P==0)                                                // 判断播放过程中是否按下了“开始/暂停”键
                {                                                                       
                        DelayMs(10);                                        // 消除按键按下的抖动
                        while(!Key1_P);                                        // 等待按键释放
                        DelayMs(10);                                        // 消除按键松开的抖动
                        if(gPlayStatus==1)                                // 如果是播放状态,则改为暂停状态
                        {
                                gPlayStatus=0;                                //切换成 暂停
                                TR1=0;                                                //关闭定时器计时
                                Beep_P=1;                   //关闭喇叭
                        }
                        else                                                        // 如果是暂停状态,则改为播放状态
                        {                                                               
                                gPlayStatus=1;                                //切换成 播放
                                TR1=1;                                                //重新打开定时器计时
                        }
                }

                if(Key2_P==0)                                                // 判断播放过程中是否按下了“上一曲”键
                {
                        DelayMs(10);                                         // 消除按键按下的抖动
                        while(!Key2_P);                                        // 等待按键释放
                        DelayMs(10);                                        // 消除按键松开的抖动
                        gSong--;                                                   // 把当前播放到第几首歌的变量gSong减1,即切到上一曲
                        if(gSong==0)                                        // 如果gSong为0,说明到前面的尽头了,则转为最后一首
                                gSong=SONG;
                        T1_num=0;
                        fen=0;
                        miao=0;

                        break;       
                }
                if(Key3_P==0)                                                // 判断播放过程中是否按下了“下一曲”键
                {
                        DelayMs(10);                                        // 消除按键按下的抖动
                        while(!Key3_P);                                    // 等待按键释放
                        DelayMs(10);                                        // 消除按键松开的抖动
                        gSong++;                                                // 把当前播放到第几首歌的变量gSong加1,即切到下一曲
                        if(gSong>SONG)                                        // 如果gSong为SONG,说明到后面的尽头了,则转为第一首
                                gSong=1;
                        T1_num=0;
                        fen=0;
                        miao=0;
                        break;       
                }                                                       
        }
        gPlayStatus=1;
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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