【STC15】按键中断

来源:互联网 发布:淘宝网店推广费用 编辑:程序博客网 时间:2024/05/21 22:32

实现功能:
通电时亮一个灯,输出高电平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 3sfr P3M0        =   0xB2;   //0000,0000 端口3模式寄存器0sfr P3M1        =   0xB1;   //0000,0000 端口3模式寄存器1sbit 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;}
原创粉丝点击