按键第一次按下正在执行循环,第二次按下如何打断第一次执行,请高手解决

2019-07-15 10:33发布

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit K11=P3^7;
uchar ajcsh,flag;//按键次数、标志位
bit ajzt;//按键状态
uint i;
void yanshi(uint ms)
{
uchar t;
while(ms--)
for(t=0;t<120;t++);
}
xianshi1()
{
for(i=6;i>0;i--)
{
P2=0x00;
yanshi(500);
P2=0xff;
yanshi(500);
}
}
xianshi2()
{
for(i=6;i>0;i--)
{
P2=0xfe;
yanshi(500);
P2=0xff;
yanshi(500);
}
}
xianshi3()
{
for(i=6;i>0;i--)
{
P2=0xef;
yanshi(500);
P2=0xff;
yanshi(500);
}
}
void ajchuli()//按键处理,必须要等第一次按下执行完了才能执行后面按下执行的内容,这个应该怎么解决
{

if(ajzt==0)
{
ajcsh=(ajcsh+1)%3;
if(flag==0)
{switch(ajcsh)
{
case 1:xianshi1();flag=0;break;
case 2:xianshi2();flag=0;break;
case 0:xianshi3();flag=0;break;
}
}
}}
main()
{
ajcsh=0;
ajzt=1;
while(1)
{
if(ajzt!=K11)
{
yanshi(10);
ajzt=K11;
ajchuli();

}}}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
大兵0518
1楼-- · 2019-07-15 18:31
本帖最后由 大兵0518 于 2017-6-6 15:35 编辑
wulinwl 发表于 2017-6-6 14:01
看标题和内容矛盾,不知道楼主是要求按下按键立即响应并终止正在执行的程序,还是要求等待正在执行的程序结束再响应按键?

是按下后立即停止并执行再次按下的内容
wulinwl
2楼-- · 2019-07-15 19:00
大兵0518 发表于 2017-6-6 15:34
是按下后立即停止并执行再次按下的内容

因为你用了软件延时循环,在循环没有结束时按键信息无法建立,建议把按键扫描程序放在中断里,并且在for循环里设置循环约束条件,一旦条件不满足立即跳出for循环。
wulinwl
3楼-- · 2019-07-15 21:07
根据你的程序只修改了显示程序,增加了定时器中断,完全满足你的要求。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit K11=P3^7;
uchar ajcsh,flag;//按键次数、标志位
bit ajzt;//按键状态
uint tim1=0;                //中断计数
uchar tim2=0;                //中断计数
               
void Timer0Init()                //250微秒@11.0592MHz
{
        TMOD = 0x02;                //设置定时器自动重载模式
        TL0 = 0x1A;                        //设置定时初值
        TH0 = 0x1A;                        //设置定时重载值
        TF0 = 0;                        //清除TF0标志
//        TR0 = 1;                        //定时器0开始计时
        EA=1;                                        //开总中断
        ET0=1;                                        //开定时器0中断       
}
void yanshi(uint ms)
{
        uchar t;
        while(ms--)
        for(t=0;t<120;t++);
}
void xianshi()                        //显示程序
{
        if((ajcsh==1)&&(flag==1))
        {
                if((tim2==0)||(tim2==2)||(tim2==4)||(tim2==6)||(tim2==8)||(tim2==10))
                        P2=0x00;
                if((tim2==1)||(tim2==3)||(tim2==5)||(tim2==7)||(tim2==9)||(tim2==11))
                        P2=0xff;
                if(tim2>=12)
                {
                        flag=0;
                        tim1=0;
                        tim2=0;
                        TR0= 0;
                }
        }
        if((ajcsh==2)&&(flag==1))
        {
                if((tim2==0)||(tim2==2)||(tim2==4)||(tim2==6)||(tim2==8)||(tim2==10))
                        P2=0xfe;
                if((tim2==1)||(tim2==3)||(tim2==5)||(tim2==7)||(tim2==9)||(tim2==11))
                        P2=0xff;
                if(tim2>=12)
                {
                        flag=0;
                        tim1=0;
                        tim2=0;
                        TR0= 0;
                }
        }
        if((ajcsh==0)&&(flag==1))
        {
                if((tim2==0)||(tim2==2)||(tim2==4)||(tim2==6)||(tim2==8)||(tim2==10))
                        P2=0xef;
                if((tim2==1)||(tim2==3)||(tim2==5)||(tim2==7)||(tim2==9)||(tim2==11))
                        P2=0xff;
                if(tim2>=12)
                {
                        flag=0;
                        tim1=0;
                        tim2=0;
                        TR0= 0;
                }
        }
}

void ajchuli()//按键处理,必须要等第一次按下执行完了才能执行后面按下执行的内容,这个应该怎么解决
{

        if(ajzt==0)
        {
                ajcsh=(ajcsh+1)%3;
                flag=1;
                tim1=0;
                tim2=0;
                TR0= 1;                //定时器0开始计时
        }
}

void main()
{
        ajcsh=0;
        ajzt=1;
        Timer0Init();
        while(1)
        {
                if(ajzt!=K11)
                {
                        yanshi(10);
                        ajzt=K11;
                        ajchuli();
                }
                xianshi();
        }
}
/********中断服务程序**********/
void timer0() interrupt 1
{
        tim1++;
        if(tim1>=2000)                                //0.5秒计时
        {
                tim1=0;
                tim2++;
        }
}
wulinwl
4楼-- · 2019-07-16 00:32
 精彩回答 2  元偷偷看……
大兵0518
5楼-- · 2019-07-16 05:52
wulinwl 发表于 2017-6-7 10:22
程序进一步完善如下:
#include
#define uchar unsigned char

漂亮,帅,问题已解决,谢谢抱拳

一周热门 更多>