/*************************************************************************************************
**** 调 试:周继承
**** Email: zhoujichengxi@163.com
*************************************************************************************************
**** 1. MCU:at89s51
**** 2. 晶振:12MH
**** 3. 2009.06. 完成
*************************************************************************************************
************************************************************************************************/
#include<reg51.h>
#define uchar unsigned char;
#define uint unsigned int;
void delay(void);
void delay1(void);
void right(void);
write(void);
uchar A[]={0,1,2,3,4,5};
uchar B1[]={0,0,0,0,0,0};
uchar B2[]={0,0,0,0,0,0};
uint key_data[]={0xe7,0xeb,0xed,0xee,0xd7,0xdb,0xdd,0xde,0xb7,0xbb,0xbd,0xbe};
char zhuan[12]={0,1,2,3,4,5,6,7,8,9,0x0a,0x0b};//键盘编号转化为对应的数字
uchar temp,temp1,i,y,c,c1;
c=0;
uint s,j;
main()
{
EX1=1;
PX1=1;
IT1=1;
c1=0;
begin: s=5000;
EA=1;
ET0=1;
TMOD=0x01; //定时器0为工作方式1
TH0=(65535-5000)/256;
TL0=(65535-5000)%256; //初植
TR0=1;//启动定时器
P1=0xfe;
while(1)
{if(s==0)
goto loop;
y=write();
if(y!=0x0c)
break;
}
B1[0]=y;
while(1)
{if(s==0)
goto loop;
y=write();
if(y!=0x0c)
break;
}
B1[1]=y;
while(1)
{if(s==0)
goto loop;
y=write();
if(y!=0x0c)
break;
}
B1[2]=y;
while(1)
{if(s==0)
goto loop;
y=write();
if(y!=0x0c)
break;
}
B1[3]=y;
while(1)
{if(s==0)
goto loop;
y=write();
if(y!=0x0c)
break;
}
B1[4]=y;
while(1)
{if(s==0)
goto loop;
y=write();
if(y!=0x0c)
break;
}
B1[5]=y;
TR0=0;
P1=0xff;
if(B1[0]==A[0])
{if(B1[1]==A[1])
{if(B1[2]==A[2])
{if(B1[3]==A[3])
{if(B1[4]==A[4])
{if(B1[5]==A[5])
P1=0x00;
delay1();
right();
loop: TR0=0;
P1=0xff;
PCON=0x01;
goto begin;}}}}}
{P1=0xf0;
delay1();
c1++;
if(c1<3)
goto begin;
c1=0;//还原C1的值
for(i=0;i<100;i++)
{
P1=0xf0;
delay();
P1=0xff;
delay();
}
P1=0xff;
PCON=0x01;// 进入休眠
goto begin;
}
}
/*********************************************************************
**** 子 程 序:读取键值服务程序
**** 入口参数:
**** 出口参数:
**** 功能描述:
**** 其他说明:
**** 创 建 人:周继承
**** 日 期:2009.06.17
**** 版 本:
**** 公司名称:
**********************************************************************/
write()//键值输入子函数
{
P0=0xf0;//送测试数据
if(P0!=0xf0)//回读看是否有变化,如有则有键下
{void delay();//有按键按下时延时去抖
if(P0!=0xf0)//再读是否有键按下
{P0=0xf0; // 再送测试数据
temp=P0;//保存行或列值
P0=0x0f;//数据反转
temp=P0|temp;
P1=0xbe;
for(i=0;i<16;i++)
{if(temp==key_data)
temp=zhuan;
}
P0=0xf0;//送测试数据
delay();
if(P0==0xf0)
{
P1=0xfe;
return(temp);}//如果有键按下返回键值
}
}
return(0x0c);//如果没有键按下返回无效值
}/*********************************************************************
**** 子 程 序:延时去抖
**** 入口参数:
**** 出口参数:
**** 功能描述:
**** 其他说明:
**** 创 建 人:周继承
**** 日 期:2009.06.17
**** 版 本:v1.0
**** 公司名称:
**********************************************************************/
void delay(void)//延时去抖
{
for(j=0;j<3000;j++);
}
/*********************************************************************
**** 子 程 序:定时中断0
**** 入口参数:
**** 出口参数:
**** 功能描述:
**** 其他说明:
**** 创 建 人:周继承
**** 日 期:2009.06.17
**** 版 本:v1.0
**** 公司名称:
**********************************************************************/
void timer0() interrupt 1//延时用于控制密码输入时间
{TMOD=0x01; //定时器0为工作方式1
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;//初植
TR0=1;//启动定时器
s--;
}
/*********************************************************************
**** 子 程 序:读取密码正确状态服务程序
**** 入口参数:
**** 出口参数:
**** 功能描述:
**** 其他说明:
**** 创 建 人:周继承
**** 日 期:2009.06.17
**** 版 本:
**** 公司名称:
**********************************************************************/
void right()//正确情况下子函数
{
c=0;
c1=0;
TR0=0;
P1=0xff;
loop5: s=5000;
EA=1;
ET0=1;
TMOD=0x01; //定时器0为工作方式1
TH0=(65535-5000)/256;
TL0=(65535-5000)%256; //初植
TR0=1;//启动定时器
P1=0xfe;
while(1)
{
y=write();
if(y==0x0a)
goto loop2;
if(y==0x0b)
goto loop3;
if(s==0)
break;
}
P1=0xff;
goto loop4;
loop2: P1=0xfc; //kai mem
delay1();
P1=0xff;
goto loop4;
loop3: P1=0x00;
delay1();
s=5000;
EA=1;
ET0=1;
TMOD=0x01; //定时器0为工作方式1
TH0=(65535-5000)/256;
TL0=(65535-5000)%256; //初植
TR0=1;//启动定时器
P1=0xfe;
while(1)
{if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B1[0]=y;
while(1)
{if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B1[1]=y;
while(1)
{if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B1[2]=y;
while(1)
{if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B1[3]=y;
while(1)
{if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B1[4]=y;
while(1)
{if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B1[5]=y;
P1=0x00;
delay1();
P1=0xff;
/********************************/
s=5000;
EA=1;
ET0=1;
TMOD=0x01; //定时器0为工作方式1
TH0=(65535-5000)/256;
TL0=(65535-5000)%256; //初植
TR0=1;//启动定时器
P1=0xfe;
while(1)
{if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B2[0]=y;
while(1)
{if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B2[1]=y;
while(1)
{if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B2[2]=y;
while(1)
{if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B2[3]=y;
while(1)
{if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B2[4]=y;
while(1)
{if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B2[5]=y;
/* for(i=0;i<6;i++)
{
while(1)
{
if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B2=y;
}*/
P1=0x00;
delay1();
P1=0xff;
for(i=0;i<6;i++)
{if(B1==B2)
c++;
}
if(c<5)
{P1=0xf0;
delay1();
c1++;
if(c1<3)
goto loop5;
for(i=0;i<100;i++)
{
P1=0xf0;
delay();
P1=0xff;
delay();
}
goto loop4;
}
for(i=0;i<6;i++)
A=B1;
P1=0x55;
delay1();
loop4: TR0=0;
P1=0xff;
}
/*********************************************************************
**** 子 程 序:
**** 入口参数:
**** 出口参数:
**** 功能描述:
**** 其他说明:
**** 创 建 人:周继承
**** 日 期:2009.06.17
**** 版 本:
**** 公司名称:
**********************************************************************/
void EXT1() interrupt 2
{PCON=0x00;
}
/*问题有两个不能理解:
*1,为什么读取键值的时候不能用循环,循环
for(i=0;i<6;i++)
{
while(1)
{
if(s==0)
goto loop4;
y=write();
if(y!=0x0c)
break;
}
B2=y;
}
使用时跳出break后不再循环for(i=0;i<6;i++)
2,为什么把原始密码更改为有6的后就不能识别密码了,希望大家给点意见,共同进步!周继承在此感谢!QQ:551684929*/
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |