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时不会继续播放啊。。。 展开
我前面写了
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时不会继续播放啊。。。 展开
2个回答
展开全部
一个键做两个事情时假如播放为《播放控制=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扫描一次键盘,就可以了,在播放的时候判断暂停标志,你按键是外部中断做 的吗,是你的意思是只能进入一次中断第二次就进不去了,貌似你的中断没有返回,还有你检查总中断打开了吗,你把断点设置在中断处看进不进,有新情况继续讨论
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询