标题: 关于Proteus8软件的仿真 [打印本页]
作者: 86873421 时间: 2025-2-28 19:31
标题: 关于Proteus8软件的仿真
出现这种情况一般是什么问题,各位大神,程序如下:
#include <reg52.h>
#include <intrins.h>
#include"24C0x.h"
#include"LCD12864.h"
#define uchar unsigned char
#define uint unsigned int
#define buffer1ID 0x01
#define buffer2ID 0x02
#define queren 0x88
#define tuichu 0x18
#define shanchu 0x82
#define User 1
void fan();
sbit B0=B^0;
sbit B7=B^7;
sbit k2=P3^7;
sbit jidianqi=P3^6;
sbit BUZZ=P2^0;
bit succeed_mm=0;
bit count_down=0;
bit alarm=0;
uchar dz[4];
uchar time[4];
uchar mima[6];
uchar mima_kai[6];
uchar mimag[6];
uchar mimaID[6]={1,2,3,4,5,6};
uchar out_time=0;
uchar Address1=20,tempx=20;
uchar Address2=20;
uchar data K;
uchar data Key;
uint PageID;
uchar data querenma=11;
uchar sum[2];
int summaf,summas;
Uchar
xdata UserPassword[2][7]={0};//密码0是管理员密码,1是开锁密码
uchar xdata DSY_BUFFER[16] ={0};//缓存
void Red_Init(void);
unsigned char check(void);
unsigned char redchange(unsigned char rednum);
void delayms(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar Chack(uchar User_Number)
{
uchar flag, i,temp[6],Address;
Address=User_Number*6;
for(i=0;i<6;i++)
{
temp=x24c02_read(Address);
delayms(10);
Address++;
}
for(i=0;i<6;i++)
{
if(temp==UserPassword[User_Number])
flag=1;
else
{
flag=0;
break;
}
}
return flag;
}
void delay(uint tt)
{ uchar i;
while(tt--)
{
for(i=0;i<125;i++);
}
}
{
SCON= 0x50;//串口方式1//REN=1,允许接受
PCON=0x00;//SMOD=0
TMOD= 0x21;//定时器1定时方式2
TH1= 0xFD;//11.0592MHz模块默认波特率为9600bps
TL1= 0xFD;
TR1= 1;//启动定时器
TH0=0x4b;
TL0=0xff;
ET0=1;
TR0=1;
EA=1;
}
unsigned char Keycan(void)//按键扫描程序
{
unsigned char rcode, ccode;
P1 = 0xF0;//发送0行扫描码,列线输入
if((P1&0xF0) != 0xF0)//若有键按下
{
delay(1);//延时去抖动
if((P1&0xF0) != 0xF0)
{ rcode = 0xFE;//逐行扫描初值
while((rcode&0x10) != 0)
{
P1 = rcode;//输出行扫描码
if((P1&0xF0) != 0xF0)//本行有键按下
{
ccode = (P1&0xF0)|0x0F;
BUZZ=0;
delayms(20);
BUZZ=1;
//do{;}
while((P1&0xF0) != 0xF0); //等待键释放
return ((~rcode) + (~ccode)); //返回键编码
}
else
rcode = (rcode<<1)|0x01; //行扫描码左移一位
}
}
}
return 0; //无键按下,返回值为零
}
void KeyDeal(unsigned char Key)
{ //unsigned char n;
if(Key!=0)
{
switch(Key)
{
case 0x11: K=1; break;
case 0x21: K=2; break;
case 0x41: K=3; break;
case 0x81: break;
case 0x12: K=4; break;
case 0x22: K=5; break;
case 0x42: K=6; break;
case 0x82: K=34;break;删除
case 0x14: K=7; break;
case 0x24: K=8; break;
case 0x44: K=9; break;
case 0x84: break;输入开锁密码
case 0x18: K=35; break;退出
case 0x28: K=0; break;
case 0x48: K=11; break;
case 0x88: break;
default: break;
}
}
}
void SFG_GetEcho()//握手
{
uchar i;
SBUF=0xef;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
SBUF=0X03;
while(TI==0);
TI=0;
SBUF=0X53;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
summaf=0x57;
SBUF=summaf;
while(TI==0);
TI=0;
for(i=0;i<9;i++)
{
while(RI==0);
RI=0;}
while(RI==0);
RI=0;
querenma=SBUF;
while(RI==0);
RI=0;
sum[1]=SBUF;
while(RI==0);
RI=0;
sum[0]=SBUF;
summas=(sum[1]<<8)+sum[0];
}
void SFG_getimage()//录入指纹图像
{
uchar i;
SBUF=0xef;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
SBUF=0X03;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
summaf=0x05;
SBUF=summaf;
while(TI==0);
TI=0;
for(i=0;i<9;i++)
{
while(RI==0);
RI=0;}
while(RI==0);
RI=0;
querenma=SBUF;
while(RI==0);
RI=0;
sum[1]=SBUF;
while(RI==0);
RI=0;
sum[0]=SBUF;
summas=(sum[1]<<8)+sum[0];
}
void SFG_genchar(uchar bufferID) //生成特征并存于charbufferl//调用后单片机波特率发生变化
{
uchar i;
SBUF=0xef;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
SBUF=0X04;
while(TI==0);
TI=0;
SBUF=0X02;
while(TI==0);
TI=0;
SBUF=bufferID;
while(TI==0);
TI=0;
summaf=0x07+bufferID;
sum[0]=summaf;
sum[1]=summaf>>8;
SBUF=sum[1];
while(TI==0)
TI=0;
SBUF=sum[0];
while(TI==0)
TI=0;
for(i=0;i<9;i++)
{
while(RI==0);
RI=0;}
while(RI==0);
RI=0;
querenma=SBUF;
while(RI==0);
RI=0;
sum[1]=SBUF;
while(RI==0);
RI=0;
sum[0]=SBUF;
summas=(sum[1]<<8)+sum[0];
}
void SFG_fastsearch(uchar bufferID)//搜索指纹返回指纹ID
{
uchar i,ID1,ID2;
SBUF=0xef;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
SBUF=0X08;
while(TI==0);
TI=0;
SBUF=0X1b;
while(TI==0);
TI=0;
SBUF=bufferID;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
SBUF=0;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
SBUF=180;
while(TI==0);
TI=0;
summaf=9+0x1b+bufferID+180;
sum[0]=summaf;
sum[1]=summaf>>8;
SBUF=sum[1];
while(TI==0);
TI=0;
SBUF=sum[0];
while(TI==0);
TI=0;
for(i=0;i<9;i++)
{
while(RI==0);
RI=0;}
while(RI==0);
RI=0;
querenma=SBUF;
while(RI==0);
RI=0;
ID1=SBUF;
while(RI==0);
RI=0;
ID2=SBUF; //接收到的ID号
while(RI==0);
RI=0;
while(RI==0);
RI=0;
while(RI==0);
RI=0;
sum[1]=SBUF;
while(RI==0);
RI=0;
sum[0]=SBUF;
summas=(sum[1]<<8)+sum[0];
//PageID=ID1;
PageID=(ID1<<8)+ID2;
}
Void SFG_enroll()//自动注册模板返回存储ID=录图像+合并生成模板+储存模板
{
uchar i,ID1,ID2;
SBUF=0xef;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
SBUF=0X03;
while(TI==0);
TI=0;
SBUF=0X10;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
summaf=0x14;
SBUF=summaf; //校验和
while(TI==0);
TI=0;
for(i=0;i<9;i++)
{
while(RI==0);
RI=0;}
while(RI==0);
RI=0;
querenma=SBUF;
while(RI==0);
RI=0;
ID1=SBUF;
while(RI==0);
RI=0;
ID2=SBUF;
while(RI==0);
RI=0;
sum[1]=SBUF;
while(RI==0);
RI=0;
sum[0]=SBUF;
summas=(sum[1]<<8)+sum[0];
//PageID=ID1;
PageID=(ID1<<8)+ID2;
}
void SFG_deletchar(uint pageID) //删除指纹 校验和在2字节的页码处应分高低字节相加
{
uchar i,ID1,ID2;
SBUF=0xef;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
SBUF=0X07;
while(TI==0);
TI=0;
SBUF=0X0c;
while(TI==0);
TI=0;
ID1=pageID;ID2=pageID>>8;
SBUF=ID2;
while(TI==0);
TI=0;
SBUF=ID1;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
SBUF=1;
while(TI==0);
TI=0;
summaf=0x15+ID1+ID2;
sum[0]=summaf;
sum[1]=summaf>>8;
SBUF=sum[1];
while(TI==0);
TI=0;
SBUF=sum[0];
while(TI==0);
TI=0;
for(i=0;i<9;i++)
{
while(RI==0);
RI=0;}
while(RI==0);
RI=0;
querenma=SBUF;
while(RI==0);
RI=0;
sum[1]=SBUF;
while(RI==0);
RI=0;
sum[0]=SBUF;
summas=(sum[1]<<8)+sum[0];
}
void SFG_identify() //自动验证指纹 录图像+生成特征+搜索
{
uchar i,ID1,ID2;
SBUF=0xef;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0XFF;
while(TI==0);
TI=0;
SBUF=0X01;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
SBUF=0X03;
while(TI==0);
TI=0;
SBUF=0X11;
while(TI==0);
TI=0;
SBUF=0X00;
while(TI==0);
TI=0;
summaf=0x15;
SBUF=summaf; //校验和
while(TI==0);
TI=0;
for(i=0;i<9;i++)
{
while(RI==0);
RI=0;}
while(RI==0);
RI=0;
querenma=SBUF;
while(RI==0);
RI=0;
ID1=SBUF;
while(RI==0);
RI=0;
ID2=SBUF;
while(RI==0);
RI=0;
while(RI==0);
RI=0; //得分
while(RI==0);
RI=0;
sum[1]=SBUF;
while(RI==0);
RI=0;
sum[0]=SBUF;
summas=(sum[1]<<8)+sum[0];
//PageID=ID1;
PageID=(ID1<<8)+ID2;
}
void shuazhiwen()
{
uchar IDs1,IDs2,IDs3;
LcmClearTXT();
PutStr(1,1,"请按手指开锁");
SFG_identify();
count_down=1;
while(querenma==2)
{
SFG_identify();
if(out_time>=10)
{
out_time=0;
count_down=0;
succeed_mm=0;
goto out_fingerprint;
}
}
if(querenma==0)
{
out_time=0;
count_down=0;
ERROR_TIME=0;
BUZZ=1;
alarm=0;
LcmClearTXT();
PutStr(1,2,"门已打开");
IDs1=PageID/100;
IDs2=PageID/10%10;
IDs3=PageID%10;
PutStr(2,1,"编号为:");
WriteCommand(0x8D);//指定第三行显示位置
WriteData(0x30+IDs1);
WriteData(0x30+IDs2);
WriteData(0x30+IDs3);
jidianqi=0;
delay(5000);
jidianqi=1;
succeed_mm=0;
}
else if(querenma==9)
{
LcmClearTXT();
ERROR_TIME++;
if(ERROR_TIME>=3)
{
alarm=1;
}
PutStr(1,1,"没搜索到指纹");
PutStr(2,1,"请重新按手指");
out_time=0;
count_down=0;
}
else
{
LcmClearTXT();
PutStr(1,1,"接受包出错");
out_time=0;
count_down=0;
}
delay(2000);
out_fingerprint:
LcmClearTXT();
void addfinger()
{
uchar IDa1,IDa2,IDa3;
LcmClearTXT();
PutStr(1,2,"请按手指");
SFG_getimage();
while(querenma!=0)
SFG_getimage();
SFG_genchar(buffer1ID);
UART_Init();
SFG_fastsearch(buffer1ID);
while(querenma==1)
SFG_fastsearch(buffer1ID);
if(querenma==0)
{
LcmClearTXT();
PutStr(1,1,"指纹已存在");
PutStr(3,0,"按任意键继续");
while(Keycan()==0);
}
else if(querenma==9)
{
LcmClearTXT();
PutStr(1,1,"请再次按手指");
SFG_enroll();
while(querenma==2)
SFG_enroll();
LcmClearTXT();
if(querenma==0)
{
IDa1=PageID/100;IDa2=PageID/10%10;IDa3=PageID%10;
PutStr(1,1,"指纹采集成功");
PutStr(2,1,"编号为:");
WriteCommand(0x8D);
WriteData(0x30+IDa1);WriteData(0x30+IDa2);WriteData(0x30+IDa3);
}
else if(querenma!=0)
{
PutStr(1,1,"指纹采集失败");
PutStr(2,1,"请重新操作");
}
PutStr(3,0,"按任意键继续");
while(Keycan()==0);
}
LcmClearTXT();
}
Void deletfinger()
{
uchar i,j=0;
LcmClearTXT();
PutStr(1,0,"输入删去的指纹号");
PutStr(3,0,"B退格 D确认");
for(i=0;i<5;i++)dz=0;
Key=Keycan();
while(Key!=queren)
{
Key=Keycan();
KeyDeal(Key);
if(K==35) goto out2;
delay(30); //按键有抖动
if(Key==0)K=10;
if((K>=0)&&(K<=9))
{
dz[j]=K;
if(j<3)
{
WriteCommand(0x88+j); //指定第三行显示位置
WriteData(0x30+dz[j]);
}
++j;
if(j==4)
j=3;
} //显示LCD12864并行显示
if(K==34) //按了删除键
{
if(j==0)
{
WriteCommand(0x88);//指定第三行显示位置
WriteData(0x20);
}
else
{
--j;
WriteCommand(0x88+j); //指定第三行显示位置
WriteData(0x20);
}
}
}
if(j>=2)
PageID=dz[2]+dz[1]*10+dz[0]*100;
if(j==1)
PageID=dz[1]+dz[0]*10;
if(j==0)
PageID=dz[0];
SFG_deletchar(PageID);
if(querenma==0)
{
LcmClearTXT();
PutStr(1,1,"删去指纹号成功");
}
else
{
LcmClearTXT();
PutStr(1,2,"删去指纹号失败");
}
PutStr(2,0,"按任意键继续");
while(Keycan()==0);
out2:
LcmClearTXT();
K=0;
}
void gaimima()
{
uchar i,j=0,mima1[6],mima2[6];
uchar k,temp;
resum_modification:
LcmClearTXT();
PutStr(1,1,"请输入新密码");
PutStr(3,0,"B退格 D确认");
for(i=0;i<6;i++)mima1=0;
Key=Keycan();
while(Key!=queren)
{
Key=Keycan();
KeyDeal(Key);
if(K==35) goto out3;
delay(30);
if(Key==0)K=10;
if((K>=0)&&(K<=9))
{
mima1[j]=K;
if(j<6)
{
WriteCommand(0x89+j); //指定第三行显示
WriteData(0x0f);
}
++j;
if(j==7)
j=6;
}//显示LCD12864并行显示
if(K==34) //按了删除键
{
if(j==0)
{
WriteCommand(0x89); //指定第三行显示
WriteData(0x20);
}
else
{
--j;
WriteCommand(0x89+j); //指定第三行显示
WriteData(0x20);
}
}
}
LcmClearTXT();
LcmClearTXT();
j=0;
PutStr(1,0,"请再次输入新密码");
PutStr(3,0,"B退格 D确认");
for(i=0;i<6;i++)mima2=0;
Key=Keycan();
while(Key!=queren)
{
Key=Keycan();
KeyDeal(Key);
delay(30);
if(Key==0)K=10;
if((K>=0)&&(K<=9))
{
mima2[j]=K;
if(j<6)
{
WriteCommand(0x89+j);//指定第三行显示
WriteData(0x0f);
}
++j;
if(j==7)
j=6;
}//显示LCD12864并行显示
if(K==34) //按了删除键
{
if(j==0)
{
WriteCommand(0x89);//指定第三行显示
WriteData(0x20);
}
else
{
--j;
WriteCommand(0x89+j);//指定第三行显示
WriteData(0x20);
}
}
}
LcmClearTXT();
if((mima1[0]==mima2[0])&&(mima1[1]==mima2[1])&&(mima1[2]==mima2[2])&&(mima1[3]==mima2[3])&&(mima1[4]==mima2[4])&&(mima1[5]==mima2[5]))
{
for(i=0;i<6;i++)
mimaID=mima1;
for(i=0;i<6;i++)//密码限制在六位以内
{
UserPassword[0]=mima1;
}
temp=(Member-1)*6;
delayms(5);
for(k=0;k<6;k++)
{
x24c02_write(temp,UserPassword[0][k]);
delayms(10);
temp++;
}
PutStr(0,1,"密码修改成功");
PutStr(3,0,"按任意键继续");
while(Keycan()==0);
}
else
{
j=0;
PutStr(0,0,"密码修改失败");
PutStr(1,0,"两次输入的密码不");
PutStr(2,0,"一致,请重新操作");
PutStr(3,0,"按任意键继续");
while(Keycan()==0);
goto resum_modification;
}
out3:
LcmClearTXT();
K=0;
}
void gaimima_kaisuo()
{
uchar i,j=0,mima1[6],mima2[6];
uchar k,temp;
resum_modification1:
LcmClearTXT();
PutStr(1,1,"请输入新密码");
PutStr(3,0,"B退格 D确认");
for(i=0;i<6;i++)mima1=0;
Key=Keycan();
while(Key!=queren)
{
Key=Keycan();
KeyDeal(Key);
if(K==35) goto out4;
delay(30);
if(Key==0)K=10;
if((K>=0)&&(K<=9))
{
mima1[j]=K;
if(j<6)
{
WriteCommand(0x89+j); //指定第三行显示
WriteData(0x0f);
}
++j;
if(j==7)
j=6;
}//显示LCD12864并行显示
if(K==34)//按了删除键
{
if(j==0)
{
WriteCommand(0x89); //指定第三行显示
WriteData(0x20);
}
else
{
--j;
WriteCommand(0x89+j); //指定第三行显示
WriteData(0x20);
}
}
}
LcmClearTXT();
LcmClearTXT();
j=0;
PutStr(1,0,"请再次输入新密码");
PutStr(3,0,"B退格 D确认");
for(i=0;i<6;i++)mima2=0;
Key=Keycan();
while(Key!=queren)
{
Key=Keycan();
KeyDeal(Key);
delay(30);
if(Key==0)K=10;
if((K>=0)&&(K<=9))
{
mima2[j]=K;
if(j<6)
{
WriteCommand(0x89+j);//指定第三行显示
WriteData(0x0f);
}
++j;
if(j==7)
j=6;
} //显示LCD并行显示
if(K==34) //按了删除键
{
if(j==0)
{
WriteCommand(0x89);//指定第三行显示
WriteData(0x20);
}
else
{
--j;
WriteCommand(0x89+j); //指定第三行显示
WriteData(0x20);
}
}
}
LcmClearTXT();
if((mima1[0]==mima2[0])&&(mima1[1]==mima2[1])&&(mima1[2]==mima2[2])&&(mima1[3]==mima2[3])&&(mima1[4]==mima2[4])&&(mima1[5]==mima2[5]))
{
for(i=0;i<6;i++)
mimaID=mima1;
for(i=0;i<6;i++)/密码限制在6位以内
{
UserPassword[1]=mima1;
}
temp=(Member-1)*6;
delayms(5);
for(k=0;k<6;k++)
{
x24c02_write(temp,UserPassword[1][k]);
delayms(10);
temp++;
}
PutStr(0,1,"密码修改成功");
PutStr(3,0,"按任意键继续");
while(Keycan()==0);
}
else
{
j=0;
PutStr(0,0,"密码修改失败");
PutStr(1,0,"两次输入的密码不");
PutStr(2,0,"一致,请重新操作");
PutStr(3,0,"按任意键继续");
while(Keycan()==0);
goto resum_modification1;
}
out4:
LcmClearTXT();
K=0;
}
void zhu()
{
LcmClearTXT();
PutStr(1,2,"门已打开");
jidianqi=0;
delay(5000);
jidianqi=1;
//PutStr(3,0,"按任意键继续");
//while(Keycan()==0);
K=35;
}
void xiugaimima()
{
LcmClearTXT();
while(Keycan()!=tuichu)
{
PutStr(0,0,"按1:修改开锁密码");
PutStr(1,0,"按2:修改管理密码");
KeyDeal(Keycan());
if(K==35) goto out5;
switch(K)
{
case 1: Member=2;gaimima_kaisuo();break;
case 2: Member=1;gaimima();break;
default: break;
}
}
out5:
LcmClearTXT();
K=0;
}
void guanliyuan()
{ uchar i,j=0,x=1;
uchar Right_flag;
resum_guanliyuan:
LcmClearTXT();
PutStr(1,0,"请输入管理密码");
PutStr(3,0,"B退格 D确认");
for(i=0;i<6;i++)mima=0;
Key=Keycan();
while(Key!=queren)
{
Key=Keycan();
if(Key==tuichu) goto out1;
KeyDeal(Key);
delay(30);
if(Key==0)K=10;
if((K>=0)&&(K<=9))
{
mima[j]=K;
if(j<6)
{
WriteCommand(0x89+j);//指定第三行显示
WriteData(0x0f);
}
++j;
if(j==7)
j=6;
} //显示LCD12864并行显示
if(K==34)//按了删除键
{
if(j==0)
{
WriteCommand(0x89);//指定第三行显示
WriteData(0x20);
}
else
{
--j;
WriteCommand(0x89+j); //指定第三行显示
WriteData(0x20);
}
}
}
LcmClearTXT();
for(i=0;i<6;i++)
{
UserPassword[0]=mima;
}
if(j==6){Right_flag=Chack(0); }
if (Right_flag==1)
{
Right_flag=0;
ERROR_TIME=0;
alarm=0;
BUZZ=1;
while(Keycan()!=tuichu)
{
PutStr(0,0,"按1:增加指纹");
PutStr(1,0,"按2:删除指纹");
PutStr(2,0,"按3:修改密码");
PutStr(3,0,"按4:手动开锁");
KeyDeal(Keycan());
if(K==35) goto out1;
switch(K)
{
case 1: addfinger();K=6;break;
case 2:deletfinger();break;
case 3: xiugaimima();break;
case 4:zhu();break;
default: break;
}
}
}
else
{
j=0;
ERROR_TIME++;
if(ERROR_TIME>=3)
{
alarm=1;
}
PutStr(1,2,密码错误");
PutStr(2,0,"请重新操作");
PutStr(3,0,"按任意键继续");
while(Keycan()==0);
goto resum_guanliyuan;
}
Key=0;
out1:
LcmClearTXT();
}
void kaisuomm()
{ uchar i,j=0,x=1;
uchar Right_flag;
resume: PutStr(1,0,"请输入开锁面膜");
PutStr(3,0,"B退格 D确认");
for(i=0;i<6;i++)mima_kai=0;
Key=Keycan();
while(Key!=queren)
{
Key=Keycan();
if(Key==tuichu) goto out;
KeyDeal(Key);
delay(30);
if(Key==0)K=10;
if((K>=0)&&(K<=9))
{
mima_kai[j]=K;
if(j<6)
{
WriteCommand(0x89+j);//指定第三行显示
WriteData(0x0f);
}
++j;
if(j==7)
j=6;
} //显示LCD12864并行显示
if(K==34)//按了删除键
{
if(j==0)
{
WriteCommand(0x89);//指定第三行显示
WriteData(0x20);
}
else
{
--j;
WriteCommand(0x89+j);//指定第三行显示
WriteData(0x20);
}
}
}
for(i=0;i<6;i++)
{
UserPassword[1]=mima_kai;
}
if(j==6){Right_flag=Chack(1); }
if (Right_flag==1)
{
Right_flag=0;
succeed_mm=1;
ERROR_TIME=0;
BUZZ=1;
alarm=0;
//while(Keycan()!=tuichu)
{
PutStr(1,0,"请刷手指开锁");
PutStr(3,0);
}
}
else
{
j=0;
ERROR_TIME++;
if(ERROR_TIME>=3)
{
alarm=1;
}
//PutStr(1,0);
PutStr(1,0,"密码错误");
PutStr(2,0,"请重新输入");
PutStr(3,0,"按任意键继续");
while(Keycan()==0);
LcmClearTXT();
goto resume;
}
Key=0;
out:
LcmClearTXT();
}
void fan()
{
if(succeed_mm==0)
{
PutStr(0,2,"欢迎使用");
PutStr(1,1,"指纹识别系统");
PutStr(2,0," ");
PutStr(3,0,"A管理 C开锁");
}
Key=Keycan();
if(Key==0x84)
{
LcmClearTXT();
kaisuomm();
LcmClearTXT();
// K=0;
}
if(/*k2==1&&*/succeed_mm==1)//指纹刷机
{
LcmClearTXT();
shuazhiwen();
LcmClearTXT();
}
if(Key==0x81)//管理员操作
{
LcmClearTXT();
guanliyuan();
LcmClearTXT();
}
}
void main()
{
//PSB=0;
UART_Init();//串口初始化
x24c02_init();//24C02初始化
LcmInit();//LCD12864初始化
LcmClearTXT();//LCD12864清屏
while(1)
{
fan();
delay(100);
}
}
void T0_time() interrupt 1
{
uchar jishi;
TH0=0x4b;
TL0=0xff;
jishi++;
if(jishi%2==0&&alarm==1)
{
BUZZ=!BUZZ;
}
if(jishi>=20)
{
jishi=0;
if(count_down==1)
out_time++;
}
}
作者: songxia8013 时间: 2025-3-1 08:51
这个没碰到过。不过WP引脚一般是接地,只用SCL和SDA这俩脚传输数据。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |