欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
獨(dú)立按鍵密碼鎖程序+流程圖
[打印本頁]
作者:
daniu
時(shí)間:
2014-12-27 16:53
標(biāo)題:
獨(dú)立按鍵密碼鎖程序+流程圖
本帖最后由 daniu 于 2014-12-27 16:55 編輯
這是流程圖
//===============================================================
//程序編寫人:蘭建文
//編寫地點(diǎn)
//時(shí)間7月9日晚上 星期四
//功能:本程序?qū)崿F(xiàn)任意四個(gè)按鍵長按3S,連按3次(兩次按鍵間隔不得等
//于1S),再按一下密碼確認(rèn)鍵,正確顯示“GOOD”,不正確顯示“BAD”,
//實(shí)現(xiàn)獨(dú)立按鍵密碼鎖功能。利用定時(shí)器實(shí)現(xiàn)按鍵消抖。數(shù)碼管為共陽極,
//低電平點(diǎn)亮.
//===============================================================
#include <reg51.h> //定義8051單片機(jī)所有I/O口
#define uchar unsigned char
#define Key P1 //定義按鍵輸入口
#define OutPut P2 //定義輸出口
#define PianXuan P3 //定義片選口
bit Bt0; //節(jié)拍標(biāo)志位
bit AnJian1; //按鍵標(biāo)志位
bit AnJian2; //有按鍵按下標(biāo)志位
bit ChangAn; //長按標(biāo)志位
bit LianAn; //連按標(biāo)志位
uchar TimeCount1; //長按計(jì)時(shí)1S變量
uchar TimeCount2; //連按間隔計(jì)時(shí)1S變量
uchar LianAnCount; //連按次數(shù)變量
uchar code tempt1[]={0x0c0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90};//共陽數(shù)據(jù)代碼
uchar code tempt2[]={0x90,0xc0,0xc0,0xa1}; //“GOOD”代碼
uchar code tempt3[]={0x83,0x88,0xa1}; //“BAD”代碼
void DeLayMS(uchar N); //聲明延時(shí)函數(shù)
main() //主函數(shù)
{
TMOD=0x01; //開定時(shí)器及開定時(shí)器中斷
TH0=0xb1;
TL0=0xe0;
TR0=1;
EA=1;
ET0=1;
LianAn=0; //標(biāo)志位復(fù)位
ChangAn=0;
Bt0=0;
TimeCount1=150;
TimeCount2=50;
AnJian1=0;
AnJian2=0;
LianAnCount=0;
while(1) //死循環(huán)
{
if((Key&0x10)==0x10) //判斷確認(rèn)密碼按鍵是否按下
{
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) //等待節(jié)拍
{
Bt0=0; //節(jié)拍標(biāo)志位清零
if(AnJian2==1) //判斷是否有鍵按下
{
if(TimeCount2--==0) //判斷下一次按鍵間隔是否為1S
{
LianAnCount=0; //為1S,復(fù)位
TimeCount2=50;
AnJian2=0;
}
else
{
if(LianAnCount==3) //不為1S,則判斷是否連續(xù)按鍵3次
{
LianAn=1; //有3次則連按標(biāo)志位置1
TimeCount2=50;
AnJian2=0;
LianAnCount=0;
}
}
}
if((Key&0x0f)!=0x0f) //判斷是否有鍵按下
{
if(AnJian1==0) //有鍵按下,判斷按鍵標(biāo)志位是否為0,20MS消抖作用
{
AnJian1=1; //為1,則按鍵標(biāo)志位置1
AnJian2=1; //有鍵按下標(biāo)志位置1
TimeCount2=50; //連按計(jì)時(shí)復(fù)位
LianAnCount++; //按鍵次數(shù)加1
}
else
{
if(TimeCount1--==0) //為1判斷按鍵是否一直按了3S
ChangAn=1; //按了3S,則長按標(biāo)志位置1
if((Key&0x0f)==0x0f) //判斷按鍵是否還按著
{
TimeCount1=150; //抬起了,則長按計(jì)時(shí)復(fù)位
AnJian1=0; //按鍵標(biāo)志位清0
}
}
}
else
{
if((Key&0x0f)==0x0f)
{
TimeCount1=150;
AnJian1=0;
}
}
}
}
}
void T0Ser(void) interrupt 1 using 0 //定時(shí)器服務(wù)函數(shù)
{
TH0=0xb1;
TL0=0xe0;
Bt0=1;
}
void DeLayMS(uchar N) //延時(shí)函數(shù)
{
uchar i,j;
for(i=N;i>0;i--)
for(j=50;j>0;j--);
}
復(fù)制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1