#include
#include
#define uchar unsigned char
uchar key;
void ext0() interrupt 0
{
if(P1&0x01)key=1;
else if(P1&0x02)key=2;
else if(P1&0x04)key=3;
else if(P1&0x08)key=4;
else key=0;
}
void delay(uchar a)
{
uchar i;
while(a--)for(i=0;i<120;i++);
}
main()
{
uchar led,i,j;
while(1)
{
switch(key)
{
case 1:
led=0xfe;
for(i=0;i<10;i++)
for(j=0;j<8;j++)
{
P1=led;
led=_crol_(led,1);
delay(200);
}
break;
case 2:
led=0x7f;
for(i=0;i<10;i++)
for(j=0;j<8;j++)
{
P1=led;
led=_cror_(led,1);
delay(200);
}
break;
case 3:
led=0x0f;
for(i=0;i<10;i++)
{
P1=led;
delay(200);
led=~led;
P1=led;
delay(200);
led=~led;
}
break;
case 4:
for(i=0;i<10;i++)
{
P1=0x00;
delay(200);
P1=0xff;
delay(200);
}
break;
}
}
}
4个按键,共用一个中断,跟查询没什么区别呀。
主程序中:
EX0=1;EA=1; IT0=1;
while(1)
{
P1=0XF7;delayms(10);//扫描按键1
P1=0XFB;delayms(10);//扫描按键2
P1=0XFD;delayms(10);//扫描按键3
P1=0XFE;delayms(10);//扫描按键4
}
中断程序中:
EX0=0;//关中断
if(P1==0XF7){ 自上而下亮 }
if(P1==0XFB){ 自下而上亮 }
if(P1==0XFD){ 交替闪烁}
if(P1==0XFE){ 8只闪烁 }
EX0=1;//开中断
我觉得没人会专门为了回答问题而写个代码,除非刚好有现成。
交通灯仿真实例,可以参考一下,下载附件仿真试试。