📄 mimashuo2.c
字号:
/****************************************************************
* ***广东省东莞市厚街镇沙塘村顺程鞋业有限公司维护课 ***
* ********************************************
*设计:李小义
*联系电话:0769-81645660
*邮址:523953
*办公地点:成型课
*
*
*
*公司:广东省东莞市厚街镇沙塘村顺程鞋业有限公司保全课
*****************************************************************/
/****************************************************************
*描述: 此程序可以存储,修改密码的密码锁
*
*************************读文件头****************************************/
#include <reg51.h>
#include <intrins.h>
//**********************定义控制脚*********************************************
bdata unsigned char temp,temp1;
bdata char com_date;
//-------------------
sbit SCL=P3^7;
sbit WP=P3^6;
sbit SDA=P2^7;
sbit led=P3^5;
sbit P2_4=P2^4;
sbit P2_3=P2^3;
sbit com_date0=com_date^0;
sbit com_date7=com_date^7;
sbit temp1_7=temp1^7;
sbit P2_6=P2^6;
sbit P3_2=P3^2;
sbit P2_0=P2^0;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
//-------------------------
bit YES1;
bit lck=0;
bit YES=0;
bit ok,getpass;
//-----------------------
data unsigned char pass,i,j,k,m,r,t,w,y,u,v,s,f,command,js,xs,jn;
unsigned char A,AA,C,D;
/********************定义变量*****************************************/
unsigned char key_date; //按键内容变量
unsigned char one ,two; //显示数码管第一位,二位内容变量
unsigned char p,q;
/********************定义数组******************************************/
unsigned char code SEG_7[] = {0x00,0x060,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x28,0xfc,0x31};
// 写入到AT24C01的LED显示用0--9数据
data unsigned char setmima[6]; //设定密码数组变量
data unsigned char inmima[6]; //输入密码数组变量
/*******************声明函数***************************************/
void delay(unsigned int z);
void Reset (void);
void T0_init (void);
void display (void);
unsigned char scan_key(void);
void setpass (void);
void inpass (void);
extern void start (void);
extern void stop (void);
extern void ack (void);
extern void shift8 ( unsigned char A);
extern unsigned char rd_24c01(unsigned char AA);
extern void wr_24c01( unsigned char C,unsigned char D);
void X0ZD (void) ;
/******************* 初始化******************************************/
void Reset (void)
{
P0=0xff;
P2=0x00;
delay(1000);
P0=0x00;
P2=0xff; //关闭显示器
P1=0xff; //关闭键盘
P3=0xe7;
for (i=0;i<6;i++)
{
setmima[i]=rd_24c01(i); //设定密码变量中装入24C01存储器内容
P0=SEG_7[setmima[i]];
P2=0xe7;
delay(1);
P2=0xff;
for (js=0;js<6;js++)
{
inmima[jn]=0; } //输入数组清零
}
T0_init();
//T0按键扫描中断初始化
EX0=1;
}
/****** //10ms按键检测子函数初始化*********************/
void T0_init (void)
{
TMOD=0x11;
TH0=0xd8;
TL0=0xf0;
EA=1;
ET0=1;
TR0=1;
PX0=1;
}
/**********************************/
void X0ZD (void) interrupt 0 using 3
{
for (jn=0;jn<6;jn++)
{
inmima[jn]=0; }
ok=0;
}
/*****************T0中断服务子函数用于检测按键子函数*******************/
void T0_ZD (void) interrupt 1 using 2
{
TH0=0xd8;
TL0=0xf0;
if (q==1)
{
p++;}
if (p >=30)
{
p=0;
q=0;}
P1=0xf0;
if (P1 !=0xf0)
{
if (p==0) q=1;
if (p==1)
{
scan_key();
if (key_date >=0x0d)
{ key_date=0;}
if (key_date==0x0a)
{getpass=1;}
else
{getpass=0;}
if (getpass)
{
pass = ! pass; }
if (pass)
{ one =0x61;} //第一位显示S
else
{one =0x6e; } //第一位显示J
delay(1);
if (key_date==0x0c)
{
ok=1;
one=0x28;
}
else
{ok=0;
}
if ((ok || getpass)==0)
{
inmima[0]=inmima[1];
inmima[1]=inmima[2];
inmima[2]=inmima[3];
inmima[3]=inmima[4];
inmima[4]=inmima[5];
inmima[5]=key_date; }
two=SEG_7[key_date];
display();
}}
}
/***************子函数用于显示一.二位LED内容****************/
void display(void)
{
for (m=0;m<60;m++)
{
P0=one;
P2_4=0;
delay(2);
P2_4=1;
P0=two;
P2_3=0;
delay(2);
P2_3=1;
}
}
/*************************************************************************/
unsigned char scan_key (void)
{
temp=0xf7;
w=1; //赋N变量初值
for (r=0;r<4;r++) //行循环4次
{
P1=temp; //变量中的值装入给P1上
temp1=P1; //读取P1口中的值装入TEMP1变量中
for (t=0;t<3;t++) //列循环3次
{
if (temp1_7==0) //读取P1.7中的值若为1
{
key_date=w; //键值为N中的数
TR1=1; //启动显示LED中断显示按键内容
led=0; } //发光二极管同步显示
temp1 =_crol_(temp1,1); //列循环变量左移一位
w++;
} //按键计数值加1
temp =_cror_(temp,1); } //行循环变量左移一位
return (key_date); //返回按键内容
}
/*******SETPASS子函数***************************************/
void setpass(void)
{
if (ok)
{
one=0x6e; //显示HD表示存入存储器中
two=0x7a;
display();
if (YES==0)
{
if (inmima[0]==setmima[0])
{
if (inmima[1]==setmima[1])
{
if (inmima[2]==setmima[2])
{
if (inmima[3]==setmima[3])
{
if (inmima[4]==setmima[4])
{
if (inmima[5]==setmima[5])
{
YES=1;
for (js=0;js<6;js++)
{
inmima[jn]=0; } //输入数组清零
P2=0xdf;
P0=0xfc;
P3_4=1; //指示灯亮
delay(2000); //显示可以重新输入密码
ok=0;
}}}}}}}} //旧密码核对正确
if (YES)
{
if (ok)
{
for (y=0;y<6;y++)
{
one=0x1e; //显示TO表示把密码设定值装载到内存变量中
two=0xfc;
display();
wr_24c01 (y,inmima[y]);
}
P3_4=0; //指示灯灭
for (u=0;u<6;u++)
{
setmima[u]=rd_24c01(u);}
one=0xfc; //显示OK表示全部操作成功
two=0x4e;
display();
display();
display();
display();
for (u=0;u<6;u++) //显示修改密码
{
P0=SEG_7[setmima[i]];
P2=0;
delay(500);
P2=0xff; }
for (js=0;js<6;js++)
{
inmima[jn]=0; }
P2=0xff;
one=0x70; //显示J
pass=0;
YES=0;
}
ok=0;
two=0x00;
P2=0xff;
}}
/***********************************************************/
void inpass (void)
{
if (ok)
{
if (inmima[0]==setmima[0])
{
if (inmima[1]==setmima[1])
{
if (inmima[2]==setmima[2])
{
YES1=1;}
else
{ YES1=0;
}}}
if (YES1)
{
if (inmima[3]==setmima[3])
{
if (inmima[4]==setmima[4])
{
if (inmima[5]==setmima[5])
{
lck=1;
one=0xfc; //显示OP表示开锁
two=0xcf;
display();
P1=0xfc;
P2_6=0;
P2_0=0; //继电器吸合
P3_3=1; //指示灯亮
delay(4000);
lck=0;
P3_3=0; //指示灯灭
P2_6=1;
P2_0=1;
P1=0xff; //开锁10S钟以后关闭锁及显示器
ok=0; //确认标志复位
YES1=0;
for (js=0;js<6;js++)
{
inmima[jn]=0; }
one=0x70; //显示J
two=0x00;
}}}}
else
{
lck=0;
one=0x1c; //显示LK表示上锁
two=0x4e;
display();
for (js=0;js<6;js++)
{
inmima[jn]=0; }
}
one=0x1c; //显示LK表示上锁
two=0x4e;
display();
display();
display();
ok=0;
one=0x70; //显示J
two=0x00;
}}
/******************24c01存储器函数***************************************/
void start (void)
{
SDA=1; _nop_();_nop_();_nop_();_nop_();
SCL=1; _nop_();_nop_();_nop_();_nop_();
SDA=0; _nop_();_nop_();_nop_();_nop_();
SCL=0; _nop_();_nop_();_nop_();_nop_(); }
/*******************************/
void stop (void)
{
SDA=0; _nop_();_nop_();_nop_();_nop_();
SCL=1; _nop_();_nop_();_nop_();_nop_();
SDA=1; _nop_();_nop_();_nop_();_nop_();
}
/************************************/
void ack()
{
SCL=1; _nop_();_nop_();_nop_();_nop_();
SCL=0; _nop_();_nop_();_nop_();_nop_(); }
/************************/
void shift8(char A)
{
com_date=A;
for (f=0;f<8;f++)
{
SDA=com_date7;
SCL=1; _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();
SCL=0; _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();
com_date=com_date*2;
}}
/********************************************************/
unsigned char rd_24c01(char AA)
{
SDA=1; _nop_();_nop_();_nop_();_nop_();
SCL=0; _nop_();_nop_();_nop_();_nop_();
start();
command=160;
shift8(command);
ack();
shift8(AA);
ack();
start();
command=161;
shift8(command);
ack();
SDA=1; _nop_();_nop_();_nop_();_nop_();
for (s=0;s<8;s++)
{
com_date=com_date*2;
SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
com_date0=SDA;
SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
stop();
return(com_date);
}
/************************************************/
void wr_24c01(char C,char D)
{
WP=0;
_nop_(); _nop_();_nop_();_nop_();_nop_();
SDA=1; _nop_(); _nop_();_nop_();_nop_();
SCL=0; _nop_(); _nop_();_nop_();_nop_();
start();
command=160;
shift8(command);
ack();
shift8(C);
ack();
shift8(D);
ack();
stop();
_nop_(); _nop_();_nop_();_nop_();_nop_();
delay(10);
WP=1;
}
/***********************************/
//************延时K*1ms子函数*****************
void delay(unsigned int z)
{
unsigned int h,g;
for (h=0;h<z;h++)
{
for (g=0;g<120;g++)
{;}
}
}
/****************************主程序**************************************/
void main (void)
{
Reset(); //复位
ok=0;
one=0x70; //显示J
while (1)
{
two=0x00;
display();
switch (pass) //按PASS值散传
{
case 0:
inpass (); //输入密码函数
break;
case 1:
setpass (); //设定密码函数
break;
default: //其余退出
break;
}}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -