#include<reg52.h>    
/***************************************************************** 
                 宏定义字符型和整型 
*****************************************************************/ 
#define uchar unsigned char  
#define uint  unsigned int  
/***************************************************************** 
                键值定义 
*****************************************************************/ 
sbit IN0=P2^0;         //         按键输入0 
sbit OUT0=P1^0;         //         按键输出0 
 
sbit IN1=P2^1;         //         按键输入1 
sbit OUT1=P1^1;         //         按键输出1 
 
uchar sec; //定义计数值,每过1/10 秒,sec 加一 
uchar keycnt=2;//按下次数值 
uint tcnt; //键值判断 
uchar t=0; 
//uchar s=0; 
//uchar s1=0; 
/******************************************************************** 
                            延时消抖函数 
*********************************************************************/ 
void delay(uchar t) 
{ 
  uchar i,j; 
   for(i=0;i<t;i++) 
   { 
            for(j=13;j>0;j--); 
         { ; 
         } 
   } 
} 
/******************************************************************** 
                            按键扫描函数 
*********************************************************************/ 
void KEY() //按键扫描程序 
{ 
 
if(IN0==0)           //当按键按下执行 
        { 
        delay(20); //消抖 
        keycnt=0;  //解锁 
        if(IN0==0) //确定按键按下 
                { 
                TR0=1; //开始定时 
                OUT0=0;//指示灯亮 
                while(!IN0);//等待输入0置位 
                OUT0=1;//指示灯灭 
                if(t==1) //如果定时时间到 
                { 
                keycnt=1; 
            t=0; 
                TR0=0; //定时结束 
                tcnt=0; 
                sec=0; 
                } 
                TR0=0; //定时结束 
                tcnt=0; 
                sec=0; 
                } 
        } 
if(IN1==0) 
        { 
        delay(20); 
        keycnt=2;  //解锁 
        if(IN1==0) 
                { 
                TR0=1; //开始定时 
                OUT1=0; 
                while(!IN1); 
                OUT1=1; 
                if(t==1) 
                { 
                keycnt=3; 
            t=0; 
                TR0=0; //定时结束 
                tcnt=0; 
                sec=0; 
                } 
                TR0=0; //开始定时 
                tcnt=0; 
                sec=0; 
                } 
        } 
 
}         
/******************************************************************** 
                            按下次数判断函数 
*********************************************************************/ 
void jianzhi() 
{ 
switch(keycnt) //按下次数判断 
                        { 
                        case 0: OUT0=1;break; //输出解锁 
                        case 1: OUT0=0;break; //输出自锁 
                        case 2: OUT1=1;break; //输出解锁 
                        case 3: OUT1=0;break; //输出自锁 
                        } 
} 
/******************************************************************** 
                            定时中断服务函数 
*********************************************************************/ 
void t0(void) interrupt 1 using 0 //定时中断服务函数 
{ 
        TH0=0x06; //对TH0 TL0 赋值 
        TL0=0x06; 
        tcnt++; //每过250ust tcnt 加一 
        if(tcnt==400) //计满400 次(1/10 秒)时 
        { 
                tcnt=0; //重新再计 
                sec++; 
                if(sec==20) //定时2 秒,在从零开始计时 
                { 
                t=1; 
                //sec=0;           
                //t++; 
            //keycnt=t%2; 
            //if(t==100)t=0; 
                } 
        } 
} 
/********************************************************************** 
                                           初始化I/O                                    
**********************************************************************/ 
void Init_IO(void)             //初始化I/O口 
{ 
 
        OUT0=1;//输出灯熄灭 
        OUT1=1;//输出灯熄灭 
 
} 
/******************************************************************** 
                            主函数 
*********************************************************************/ 
void main() 
 
{ 
        TMOD=0x02; //定时器工作在方式2 
        ET0=1; 
        EA=1; 
        TH0=0x06; //对TH0 TL0 赋值 
        TL0=0x06; 
        //TR0=1; //开始定时 
        Init_IO(); 
 
        while(1)/*永远为真,一直执行下去*/ 
        { 
        KEY();           //取键函数 
        jianzhi(); //执行函数 
        } 
} 
/******************************************************************** 
                              结束 
*********************************************************************/ 
 
 |