#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(); //执行函数
}
}
/********************************************************************
结束
*********************************************************************/
|