单片机独立式按键的外部中断扫描

2025-03-30 17:17:46
推荐回答(4个)
回答(1):

#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;
        }
    }
}

回答(2):

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;//开中断

回答(3):

我觉得没人会专门为了回答问题而写个代码,除非刚好有现成。

回答(4):

交通灯仿真实例,可以参考一下,下载附件仿真试试。