【STC15】按键中断

实现功能:
通电时亮一个灯,输出高电平X分钟,低电平X分钟
按一下变成两个灯,高电平X分钟,低电平X分钟
再按一下变成三个灯,高电平X分钟,低电平X分钟
再按一下回到一个灯

核心是通过按键改变flag的值,然后在延时中判断flag值是否和原先的值相同

#include"reg51.h"

#define ON 1
#define OFF 2

//三种状态
#define LOW 1
#define MID 2
#define HIGH 3

sfr P3M0        =   0xB2;   //0000,0000 端口3模式寄存器0
sfr P3M1        =   0xB1;   //0000,0000 端口3模式寄存器1

sbit ledLan=P3^1;
sbit ledHuang=P3^2;
sbit ledHong=P3^3;

sbit key=P3^5;
//sbit shuchu=P3^4;
sbit kongzhi=P3^0;

volatile int flag=1;//按键改变flag值

void delay(int ms){
    int ys;
    for(;ms>0;ms--)for(ys=800;ys>0;ys--);
}

void ledOn(int status){
    switch (status){
        case LOW:
            ledLan=1;ledHuang=0;ledHong=0;
            break;

        case MID:
            ledLan=1;ledHuang=1;ledHong=0;
            break;

        case HIGH:
            ledLan=1;ledHuang=1;ledHong=1;
            break;

    }
}
void ledOff(){
    ledLan=0;ledHuang=0;ledHong=0;
}

void delay2(int time,int status){
    int ms;

    //判断flag和status是否一致,否则直接跳出
    for(;(time>0)&& (flag==status);time--){

        for(ms=0;(ms<1000) && (flag==status);ms++){
            delay(1);

        }

    }
}

void ioON(int time,int status){
    kongzhi=1;//开    
    delay2(time,status);

}

void ioOFF(int time,int status){

    kongzhi=0;//关
    delay2(time,status);

}

//按键中断初始化
void InitInterr(){
    IT0=1;//跳变沿出发方式(下降沿)
    EX0=1;//INT0的中断允许位
    IT1=1;
    EX1=1;
    EA=1;
}

//设置P3.4,P3.0推挽输出
void setTuiWan(){
    P3M0|=0X11;//0001 0001
    P3M1&=~0X11;//0001 0001
}

main(){

    setTuiWan();
    InitInterr();

    while(1){

        //一个灯亮
        for(;flag==LOW;){
            ledOn(LOW);
            ioON(31,LOW);
            ioOFF(23,LOW);

        }
        //两个灯亮
        for(;flag==MID;){
            ledOn(MID);
            ioON(31,MID);
            ioOFF(12,MID);
        }
        //三个灯亮
        for(;flag==HIGH;){
            ledOn(HIGH);
            ioON(31,HIGH);
            ioOFF(7,HIGH);
        }

    }

}

void Key() interrupt 0
{
    delay(10);
    if(key==0){
        delay(100);
        while(!key);
        flag++;
    }
    if(flag==4)flag=1;
}

你可能感兴趣的:(【STC15】按键中断)