單片機用的是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;
}
}
}
|