单片机用的是stc15f104w,在主程序的时候中断可以起作用,能够控制led的亮灭,但是在延时的时候中断就不起作用,无法跳出延时,只能等延时结束才可以关闭led,但是不知道哪里错了,难道是在延时的时候不能执行中断吗,有没有大佬帮忙看看
#include <STC15.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit s1 = P3^3;
sbit k1 = P3^2;
sbit k2 = P3^1;
sbit k3 = P3^0;
sbit led = P3^5;
bit seyFlag=0;
void DELAY_s (unsigned int t)
{
unsigned int a,b,c,d;
while ( --t != 0&&seyFlag == 0 )
{
for (a=0;a<=60000;a++);
for (b=0;b<=60000;b++);
for (c=0;c<=60000;c++);
for (d=0;d<=60000;d++);
}
}
void DELAY_MS (unsigned int t)
{
unsigned int a;
while ( --t != 0 )
{
for (a=0;a<=600;a++);
}
}
void Int1_Routine(void) interrupt 2
{
seyFlag=1; //s1按下执行中断
}
void main()
{
IT1 = 1;
EX1 = 1;
EA = 1;
while(1)
{
if(seyFlag == 1)
{
DELAY_MS(10);
led= !led;
seyFlag = 0;
if (k1==0)
{
if (k2==1)
{
if (k3==1)
{
DELAY_s(5);
led=!led; //k1键拨下的时候
}
else if(k3==0)
{
DELAY_s(10);
led=!led;//k1、k3键拨下的时候
}
}
}
}
}
}
后面给我们总工看了说是延时函数里的标志位没有置0,延时之后会重新进主函数里又取反一次,后面加了置0就可以了,但是用这个时间不太准确
void DELAY_5s(int t)
{
unsigned long int a,b,c,d;
a=60000*t;
b=60000*t;
c=60000*t;
d=60000*t;
while(1)
{
a--;
b--;
c--;
d--;
if(d==0)
{
led = !led;
return;
}
if(seyFlag==1)
{
led = !led;
seyFlag = 0;
return;
}
}
}
|