STC89C52单片机音乐盒程序问题

我想在音乐播放的时候按key1键暂停,再按key1键继续播放。我前面写了sbitkey1=P3^3;sbitkey2=P1^1;ucharp=0;然后一些void等等vo... 我想在音乐播放的时候按key1键暂停,再按key1键继续播放。
我前面写了

sbit key1=P3^3;
sbit key2=P1^1;

uchar p=0;
然后一些void 等等
void keyscan()
{
if(key2==0)
{
delayms(10);
if(key2==0)
p=0;
}
}
void INT1_time()interrupt 2
{
p++;
while(p==1)
{
keyscan();
}
}
仿真时,我按key1键就暂停了,再按key2键就继续播放了
但是我原本是想按key1暂停,再按key1就继续播放的,但是我把keyscan()中的key2改为key1后再仿真,按了key1暂停了,再按就没反应了。求解为什么会这样,这个地方程序该怎么改
小弟最后一点分了。。。
key1是接着P3^3口的,再按下会放弃当前的while扫描键盘再次外部中断么?如果会,那么p++也会让p值不符合条件不循环直接跳出么???如果不会,那为什么再按key1时不会继续播放啊。。。
展开
 我来答
wewewe309
2012-11-04 · TA获得超过184个赞
知道小有建树答主
回答量:235
采纳率:0%
帮助的人:116万
展开全部
一个键做两个事情时假如播放为《播放控制=0》,那么暂停就是《播放控制=1》在按键检测那里执行按键key1时,检查有按下就进行取反就行了。播放控制为一个寄存器或标志位,程序不全,不知道你的p是干嘛的
追问
改了下,加了个定时器T0,TR0=1,ET0=0
void T0_time()interrupt 1
{
while(1);
}

void INT0_time()interrupt 0
{
keyscan();
}

void keyscan()
{
if(key1==0)
{
delayms(10);
if(key1==0)
{
ET0=~ET0;
while(!key1);
}
}
}
按键KEY1是最高中断,第一次按KEY1让ET0=1,松开KEY1后进入while(1)循环。一直到这里都是仿真成功的。但是,我再按KEY1时又没反应了,貌似没有进入INT0的中断,
追答
你就在程序按键检测那里加一个标志位来控制暂停和播放就行了啊,什么中断级什么都不用的啊 ,假如每100ms扫描一次键盘,就可以了,在播放的时候判断暂停标志,你按键是外部中断做 的吗,是你的意思是只能进入一次中断第二次就进不去了,貌似你的中断没有返回,还有你检查总中断打开了吗,你把断点设置在中断处看进不进,有新情况继续讨论
Terry051838
2012-11-04
知道答主
回答量:2
采纳率:0%
帮助的人:3055
展开全部
那个中断里的while循环很恐怖,让程序死的陷阱之一啦
追问
while循环就是不停扫描键盘,然后我keyscan()如果写(key2==0)的话仿真时按下key1就暂停,按下key2就继续播放了,按下key2就执行p=0了,不符合循环的条件然后就跳出了。
但是,我把里面的key2改为key1的话,按下key1可以暂停,再按下就没反应了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式