微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 按键第一次按下正在执行循环,第二次按下如何打断第一次执行,请高手解决

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

时间:10-02 整理:3721RD 点击:
#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();
}}}

设置一个标记位,按一次 ++ 一次,然后判断自加了几次就好了,退出时可以修改标志位的值,或者清零或者改成其他的值

看标题和内容矛盾,不知道小编是要求按下按键立即响应并终止正在执行的程序,还是要求等待正在执行的程序结束再响应按键?

是按下后立即停止并执行再次按下的内容

因为你用了软件延时循环,在循环没有结束时按键信息无法建立,建议把按键扫描程序放在中断里,并且在for循环里设置循环约束条件,一旦条件不满足立即跳出for循环。

根据你的程序只修改了显示程序,增加了定时器中断,完全满足你的要求。
#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++;
        }
}

程序进一步完善如下:
#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=1;                //中断计数
               
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==13)
                {
                        flag=0;
                        tim1=0;
                        tim2=1;
                        TR0= 0;
                }
                else if((tim2%2)==1)
                        P2=0x00;
                else
                        P2=0xff;
        }
        if((ajcsh==2)&&(flag==1))
        {
                if(tim2==13)
                {
                        flag=0;
                        tim1=0;
                        tim2=1;
                        TR0= 0;
                }
                else if((tim2%2)==1)
                        P2=0xfe;
                else
                        P2=0xff;
        }
        if((ajcsh==0)&&(flag==1))
        {
                if(tim2==13)
                {
                        flag=0;
                        tim1=0;
                        tim2=1;
                        TR0= 0;
                }
                else if((tim2%2)==1)
                        P2=0xef;
                else
                        P2=0xff;
        }
}
void ajchuli()//按键处理
{
        if(ajzt==0)
        {
                ajcsh=(ajcsh+1)%3;
                flag=1;
                tim1=0;
                tim2=1;
                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;
                if(tim2<13)
                tim2++;
        }
}

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top