case (0x44): k='9';break; case (0x82): k='C';break; case (0x18): k='*';break; case (0x28): k='0';break; case (0x48): k='#';break; case (0x88): k='D';break; }
return(k); }
//=================按键检测并返回按键值================ uchar keynum(void) {
uchar row,col,i; P1=0xf0;
if((P1&0xf0)!=0xf0) { Delay5Ms(); Delay5Ms(); if((P1&0xf0)!=0xf0) {
row=P1^0xf0; //确定行线 i=0;
P1=a[i]; //精确定位 while(i<4) {
if((P1&0xf0)!=0xf0) { col=~(P1&0xff); //确定列线 break; //已定位后提前退出 } else { i++; P1=a[i]; } } }
else {
return 0; }
while((P1&0xf0)!=0xf0);
21
return (row|col); //行线与列线组合后返回 }
else return 0; //无键按下时返回0 }
//=========显示输入的N个数字,用*代替以便隐藏========== void DisplayOne(void) {
write_1602com(yi+5+N); write_1602dat('*'); }
//=======================显示提示输入========================= void DisplayChar(void) {
uchar i; if(pass==1) {
write_1602com(er); for(i=0;i<16;i++) {
write_1602dat(LockOpen[i]); } } else {
if(N==0) {
write_1602com(er); for(i=0;i<16;i++) {
write_1602dat(Error[i]); } } else {
write_1602com(er); for(i=0;i<16;i++) {
write_1602dat(start_line[i]); } } } }
void DisplayInput(void)
22
{
uchar i;
if(CorrectCont==1) {
write_1602com(er); for(i=0;i<16;i++) {
write_1602dat(Input[i]); } } }
//==================重置密码=============== void ResetPassword(void) {
uchar i; uchar j; if(pass==0) {
pass=0;
DisplayChar(); } else {
if(ReInputEn==1) {
if(N==6) {
ReInputCont++; if(ReInputCont==2) {
for(i=0;i<6;) {
if(TempPassword[i]==InputData[i]) //将两次输入的新密码作对比
i++; else {
write_1602com(er); for(j=0;j<16;j++) {
write_1602dat(Error[j]); } pass=0;
ReInputEn=0; //关闭重置功能,
23
ReInputCont=0; DisplayChar(); break; } }
if(i==6) {
write_1602com(er); for(j=0;j<16;j++) {
write_1602dat(ResetOK[j]); }
WrToROM(TempPassword,0,6); /将新密码写入24C02存储
ReInputEn=0; }
ReInputCont=0; CorrectCont=0; } else {
write_1602com(er); for(j=0;j<16;j++) {
write_1602dat(again[j]); } for(i=0;i<6;i++) {
TempPassword[i]=InputData[i]; //将第一次输入的数据暂存起来 } }
N=0; //输入数据位数计数器清零 } } } }
//================取消所有操作================= void Cancel(void) {
uchar i;
24
uchar j;
write_1602com(er); for(j=0;j<16;j++) {
write_1602dat(start_line[j]); }
for(i=0;i<6;i++) {
InputData[i]=0; }
lock_led=0; //锁
operation=0; //操作标志位清零 pass=0; //密码正确标志清零 ReInputEn=0; //重置输入充许标志清零 CorrectCont=0; //密码正确输入次数清零 ReInputCont=0; //重置密码输入次数清零 open_led=1; s3_keydown=0;
N=0; //输入位数计数器清零 }
//===确认键,并通过相应标志位执行相应功======= void Ensure(void) {
uchar i,j;
RdFromROM(CurrentPassword,0,6); //从24C02里读出存储密码 if(N==6) {
if(ReInputEn==0) //重置密码功能未开启 {
for(i=0;i<6;) {
if(CurrentPassword[i]==InputData[i]) {
i++; } else
{
TR0=1; //开启定时 pass=0; break; } }
25