按键第一次按下正在执行循环,第二次按下如何打断第一次执行,请高手解决
#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++;
}
}
漂亮,帅,问题已解决,谢谢抱拳