|
單片機主程序一加入中斷,就無法執(zhí)行死循環(huán)里面的命令。
程序如下:10、設(shè)計一控制系統(tǒng)并仿真:包括3個按鍵(A、B、C鍵)、8個LED和2位7段數(shù)碼管。
按A鍵后開始1個LED燈左循環(huán),第二輪2LED個燈左循環(huán),第三輪3LED個燈左循環(huán),第四輪回到一個燈左循環(huán);
同時7段數(shù)碼管循環(huán)顯示0-9。按B、C鍵分別用于增加和減少跑馬燈及數(shù)碼管的顯示速度。
添加中斷后,數(shù)碼管會亮,但是跑馬燈就不會再顯示了。注釋掉中斷,跑馬燈就又可以了。
單片機源程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dsy_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰
sbit ka=P3^4;
sbit kb=P3^5;
sbit kc=P3^6;
sbit LE2=P2^6;
sbit LE3=P2^7;
int a=0; //控制是否開始跑馬燈
int n=5; //控制閃爍的頻率
void delay(uint x)
{
uchar t;
while(x--)
for(t=0;t<120;t++);
}
void key()
{
if(ka==0)
{
delay(20);
if(ka==0)
{
a=1;
}
while(!ka);
}
}
void key2()
{
if(kb==0)
{
delay(20);
if(kb==0)
{
n--;
}
while(!kb);
}
if(kc==0)
{
delay(20);
if(kc==0)
{
n++;
}
while(!kc);
}
}
void init()
{
TMOD=0x10;
TH1=0xd8;
TL1=0xf0;
EA=1;
ET1=1;
TR1=1;
TF1=0;
}
void main()
{
int i;
int b;
int led;
init();
P3=0xff;
while(1)
{
key();
if(a==1)
{
while(1)
{
led=0xfe; //一個燈循環(huán)左移
for(i=0;i<8;i++)
{
P1=led;
led=_crol_(led,1);
key2();
for(b=0;b<n;b++)
{
delay(40);
}
}
led=0xfc; //兩個燈循環(huán)左移
for(i=0;i<8;i++)
{
P1=led;
led=_crol_(led,1);
key2();
for(b=0;b<n;b++)
{
delay(40);
}
}
led=0xf8; //三個燈循環(huán)左移
for(i=0;i<8;i++)
{
P1=led;
led=_crol_(led,1);
key2();
for(b=0;b<n;b++)
{
delay(40);
}
}
}
}
}
}
void timer() interrupt 3
{
int c;
LE2=0;
LE3=0;
TH1=0xd8;
TL1=0xf0;
TF1=0;
for(c=0;c<9;c++)
{
LE3=1;
P0=0xdf;
LE3=0;
LE2=1;
P0=dsy_code[c];
delay(100);
LE2=0;
LE3=1;
P0=0xef;
LE3=0;
LE2=1;
P0=dsy_code[0];
delay(20);
LE2=0;
}
}
|
|