📄 c_password.c
字号:
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar keyvalue,keytemp[7],keyflag,password[6];
uchar romflag,doorflag,adr9346,order,coder,readtemp,codetemp[3],code_case;
const uchar keyin[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};
const uchar value[]={0x03,0x07,0x0b,0x0f,0x02,0x06,0x0a,0x0e,0x01,0x05,0x09,0x0d,0x00,0x04,0x08,0x0c};
sbit door=P1^0;
sbit next=P1^1;
sbit cs=P3^7;
sbit clk=P3^6;
sbit di=P3^5;
sbit doi=P3^4;
//变量说明:
//keyvalue:键值(1次的)
//keytemp[7]:输入的键值存放处(第7为按下ENTER键设计)
//keyflag:按键标志位,当此位为1时有键按下,否则无
//romflag:93C46的密码标志位,当此位为1时有存有密码,否则无
//doorflag:门标志位,即密码是否正确,当此位为1时开门(或密码正确),否则不开(或不正确)
//adr9346:要写入或要读出93C46的地址
//order:要送入93C46的信息
//code:读出的密码(1次的)
//readtemp:读取数据的临时存放处
//codetemp[3]:读取的密码的临时存放处
//code_case:选择密码存放地址情况(1表示从0x01开始的密码,2表示从0x04开始的备用密码,3表示从0x07开始的身份密码)
void delay(uint j) //延时
{
uchar i;
for(;j>0;j--)
{
for(i=0;i<125;i++)
{;}
}
}
//延时32us
void delay1()
{
uchar i;
for(i=0;i<4;i++)
{;}
}
//键盘扫描
void scan()
{
uchar i,j,m,first,key,temp;
first=0xef;
m=0;
keyflag=0;
for(i=0;i<4;i++)
{
P2=first;
key=P2;
if(key!=first)
{
delay(10);
temp=P2;
if(key=temp)
{
for(j=0;j<16;j++)
{
if(key=keyin[m])
{
keyvalue=value[m];
break;
}
else m++;
}
keyflag=1;
}
}
if(keyflag==1) break;
else first=_crol_(first,1);
}
}
//密码打包存入codetemp[3]
void pack()
{
uchar codepack,packtemp,i;
char n=-1;
for(i=0;i<3;i++)
{
keytemp[n++]=codepack;
keytemp[n++]=packtemp;
codepack=codepack<<4;
codepack=codepack+packtemp;
codetemp[i]=codepack;
}
}
//密码解包存入password[6]
void undo()
{
uchar codeundo,undotemp,dotemp,i,m;
char n=-1;
for(i=0;i<3;i++)
{
codetemp[i]=codeundo;
for(m=0;m<4;m++)
{
codeundo=codeundo>>1;
dotemp=CY;
undotemp=undotemp+dotemp;
undotemp=_crol_(undotemp,1);
}
password[n++]=codeundo;
password[n++]=undotemp;
}
}
//确认比较处理
void enter()
{
uchar i;
for(i=0;i<6;i++)
{
if(keytemp[i]!=password[i]) break;
}
if(i==5) doorflag=1;
}
//发出指令到93C46
void send9346()
{
uchar i;
for(i=0;i<8;i++)
{
order=order>>1;
di=CY;
clk=~clk;
delay1();
clk=~clk;
delay1();
}
}
//读出93C46的数据
void read9346()
{
uchar i;
coder=0;
for(i=0;i<8;i++)
{
clk=~clk;
delay1();
clk=~clk;
delay1();
readtemp=doi;
coder=coder+readtemp;
coder=_cror_(coder,1);
}
}
//从93C46读出密码
void readpassword(uchar adr_case)
{
uchar i,n;
P3=0xf0;
delay1();
clk=0;
delay1();
if(adr_case==0) {adr9346=0x00;n=1;}
else if(adr_case==1) {adr9346=0x01;n=3;}
else if(adr_case==2) {adr9346=0x04;n=3;}
else if(adr_case==3) {adr9346=0x07;n=3;}
order=adr9346+0x80; //加入读指令
for(i=0;i<n;i++)
{
send9346();
read9346();
codetemp[i]=coder;
}
cs=0;
}
//把密码写入93C46
void writepassword(uchar adr_case)
{
uchar i,n;
P3=0xf0; //写使能
delay1();
clk=0;
delay1();
order=0x80;
send9346();
cs=0;
P3=0xf0; //写入数据
delay1();
clk=0;
delay1();
if(adr_case==0) {adr9346=0x00;n=1;}
else if(adr_case==1) {adr9346=0x01;n=3;}
else if(adr_case==2) {adr9346=0x04;n=3;}
else if(adr_case==3) {adr9346=0x07;n=3;}
for(i=0;i<n;i++)
{
order=adr9346+0x40; //加入写指令
send9346();
order=codetemp[i];
send9346();
adr9346++;
}
cs=0;
order=0x00; //写禁止
send9346();
cs=0;
}
//输入处理2
void keytwo()
{
uchar i=0,led=0xfb;
for(;i<7;i++)
{
while(1)
{
scan();
if(keyflag==0x01) break;
}
P1=led;
if(keyvalue==0x02) enter(); //判断是否按下确认键
else if(keyvalue==0x00) i=i-1; //判断是否按下清除键
else keytemp[i]=keyvalue;
if(doorflag==1) break;
led=_crol_(led,1);
}
}
//修改现有密码
void repassword()
{
uchar i=0,led=0xfb;
readpassword(3);
undo();
keytwo();
enter();
if(doorflag==1)
{
next=0;
keytwo();
pack();
writepassword(code_case);
}
}
//输入处理
void key()
{
uchar i=0,led=0xfb;
for(;i<7;i++)
{
while(1)
{
scan();
if(keyflag==0x01) break;
}
P1=led;
if(keyvalue==0x0b) repassword(); //判断是否按下修改密码键
else if(keyvalue==0x02) enter(); //判断是否按下确认键
else if(keyvalue==0x00) i=i-1; //判断是否按下清除键
else keytemp[i]=keyvalue;
if(doorflag==1) break;
led=_crol_(led,1);
}
}
//93C46有无密码判断处理
void sign()
{
readpassword(0);
romflag=coder;
if(romflag==0x00)
{
codetemp[0]=0x00;
codetemp[1]=0x00;
codetemp[2]=0x00;
writepassword(1);
writepassword(2);
writepassword(3);
writepassword(0);
}
}
//主函数
void main()
{
//sign();
doorflag=0;
while(1)
{
P1=0xff;
scan();
if(keyflag==0x01)
{
if(keyvalue==0x03) //按下了输入密码键
{
code_case=1;
readpassword(code_case);
key();
if(doorflag==1) door=0;
delay(1000); //开门动作时间1S
}
else if(keyvalue==0x07) //按下了输入备用密码键
{
code_case=2;
readpassword(code_case);
key();
if(doorflag==1) door=0;
delay(1000); //开门动作时间1S
}
else if(keyvalue==0x0f) //按下了修改身份验证密码键
{
code_case=3;
readpassword(code_case);
undo();
key();
enter();
if(doorflag==1)
{
next=0;
key();
pack();
writepassword(code_case);
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -