查看: 1336|回复: 0
打印 上一主题 下一主题

按键点动与自锁

[复制链接]
跳转到指定楼层
沙发
发表于 2015-4-20 16:04:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入因仑

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表