标题:
独立按键密码锁程序+流程图
[打印本页]
作者:
daniu
时间:
2014-12-27 16:53
标题:
独立按键密码锁程序+流程图
本帖最后由 daniu 于 2014-12-27 16:55 编辑
这是流程图
//===============================================================
//程序编写人:兰建文
//编写地点
//时间7月9日晚上 星期四
//功能:本程序实现任意四个按键长按3S,连按3次(两次按键间隔不得等
//于1S),再按一下密码确认键,正确显示“GOOD”,不正确显示“BAD”,
//实现独立按键密码锁功能。利用定时器实现按键消抖。数码管为共阳极,
//低电平点亮.
//===============================================================
#include <reg51.h> //定义8051单片机所有I/O口
#define uchar unsigned char
#define Key P1 //定义按键输入口
#define OutPut P2 //定义输出口
#define PianXuan P3 //定义片选口
bit Bt0; //节拍标志位
bit AnJian1; //按键标志位
bit AnJian2; //有按键按下标志位
bit ChangAn; //长按标志位
bit LianAn; //连按标志位
uchar TimeCount1; //长按计时1S变量
uchar TimeCount2; //连按间隔计时1S变量
uchar LianAnCount; //连按次数变量
uchar code tempt1[]={0x0c0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90};//共阳数据代码
uchar code tempt2[]={0x90,0xc0,0xc0,0xa1}; //“GOOD”代码
uchar code tempt3[]={0x83,0x88,0xa1}; //“BAD”代码
void DeLayMS(uchar N); //声明延时函数
main() //主函数
{
TMOD=0x01; //开定时器及开定时器中断
TH0=0xb1;
TL0=0xe0;
TR0=1;
EA=1;
ET0=1;
LianAn=0; //标志位复位
ChangAn=0;
Bt0=0;
TimeCount1=150;
TimeCount2=50;
AnJian1=0;
AnJian2=0;
LianAnCount=0;
while(1) //死循环
{
if((Key&0x10)==0x10) //判断确认密码按键是否按下
{
OutPut=0xbf; //没按下就显示“------”
PianXuan=0xff;
}
else
{
if(ChangAn&&LianAn) //按下了,判断是否有长按和连按
{
while(1) //有长按和连按,则显示“GOOD”
{
uchar i,b=0x02;
for(i=0;i<4;i++)
{
OutPut=tempt2;
PianXuan=b;
DeLayMS(1);
PianXuan=0x00;
b=b<<1;
}
}
}
else //没长按和连按,则显示“BAD”
{
while(1)
{
uchar i,b=0x02;
for(i=0;i<3;i++)
{
OutPut=tempt3;
PianXuan=b;
DeLayMS(1);
PianXuan=0x00;
b=b<<1;
}
}
}
}
if(Bt0==1) //等待节拍
{
Bt0=0; //节拍标志位清零
if(AnJian2==1) //判断是否有键按下
{
if(TimeCount2--==0) //判断下一次按键间隔是否为1S
{
LianAnCount=0; //为1S,复位
TimeCount2=50;
AnJian2=0;
}
else
{
if(LianAnCount==3) //不为1S,则判断是否连续按键3次
{
LianAn=1; //有3次则连按标志位置1
TimeCount2=50;
AnJian2=0;
LianAnCount=0;
}
}
}
if((Key&0x0f)!=0x0f) //判断是否有键按下
{
if(AnJian1==0) //有键按下,判断按键标志位是否为0,20MS消抖作用
{
AnJian1=1; //为1,则按键标志位置1
AnJian2=1; //有键按下标志位置1
TimeCount2=50; //连按计时复位
LianAnCount++; //按键次数加1
}
else
{
if(TimeCount1--==0) //为1判断按键是否一直按了3S
ChangAn=1; //按了3S,则长按标志位置1
if((Key&0x0f)==0x0f) //判断按键是否还按着
{
TimeCount1=150; //抬起了,则长按计时复位
AnJian1=0; //按键标志位清0
}
}
}
else
{
if((Key&0x0f)==0x0f)
{
TimeCount1=150;
AnJian1=0;
}
}
}
}
}
void T0Ser(void) interrupt 1 using 0 //定时器服务函数
{
TH0=0xb1;
TL0=0xe0;
Bt0=1;
}
void DeLayMS(uchar N) //延时函数
{
uchar i,j;
for(i=N;i>0;i--)
for(j=50;j>0;j--);
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1