當前位置:首頁 » 編程語言 » 求c51電子密碼鎖c語言程序
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

求c51電子密碼鎖c語言程序

發布時間: 2022-11-01 15:22:54

1. 51單片機4*3矩陣鍵盤6位密碼鎖c語言程序

#include<stdio.h>
#include<reg51.h>
#define uchar unsigned char

uchar key;
int i=0;
char b[4]={'0','0','0','0'};//輸入的密碼放這里和初始的比較來判斷是否密碼正確
void keyscan() //掃描按鍵是否按下
{
uchar temp;
P3=0xfe; //掃描第一行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0) //判斷按鍵是否按下
{
delayms(10);//去抖動
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//確認按鍵按下
{
temp=P3;
switch(temp)
{
case 0xee:key='0';break;
case 0xde:key='1';break;
case 0xbe:key='2';break;
case 0x7e:key='3';break;
}
while(temp!=0xf0) //判斷按鍵是否松開
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
P3=0xfd; //掃描第二行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:key='4';break;
case 0xdd:key='5';break;
case 0xbd:key='6';break;
case 0x7d:key='7';break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
P3=0xfb; //掃描第三行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:key='8' ;break;
case 0xdb:key='9' ;break;
case 0xbb:key='A';break;
case 0x7b:key='B';break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
P3=0xf7; //掃描第四行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:key='C';break;
case 0xd7:key='D';break;
case 0xb7:key='E';break;
case 0x77:key='F';break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
}

main()
{
char a[4]={'3','5','A','C'}; //這個做初始密碼
while(1)//無限循環,保證了b 0-3 四個數有值
{
keyscan();
if(a[0]==b[0]&&a[1]==b[1]&&a[2]==b[2]&&a[3]==b[3])
{
//這里寫密碼正確程序要怎麼處理
}
}
}

2. 求基於51單片機的電子密碼鎖設計+源程序代碼

推薦你看《單片機c語言程序設計實訓100例——基於8051+proteus模擬》第
03

綜合設計
第34例
「用24c04與1602lcd設計電子密碼鎖」
我這里有這本書,但沒有電子的文檔。

3. 求C語言或C++的電子密碼鎖程序

#include <stdio.h>
#include <conio.h> /*conio庫,調用無回顯getch()就是輸入後不顯示*/
#include <iostream>
using namespace std;
int main ()
{
int j=0;
int i;
char code[10];
char s;
for (i=3;i!=0;--i)
{
j=0;
printf("你還有%d次機會,請輸入密碼:\n",i);
cout<<"888888";
cout<<"\b\b\b\b\b\b";
while ((s=getch())!='\r')
{
code[j]=s;
if( s == '\b' ) //遇到退格鍵可以刪除前一個輸入
{
printf("\b8\b");
code[--j]=code[--j];
}
else
{
//putchar('*'); /*輸入的信息將以*號輸出*/
cout<<"F";
}
code[++j]='\0';
}
if (code[0]=='1'&&code[1]=='2'&&code[2]=='3'&&code[3]=='4'&&code[4]=='5'&&code[5]=='6'&&code[6]=='\0')
{
printf("\n密碼正確\n");
break;
}
//system("cls");
}
return 0;
}

不好意思,樓主,最近沒怎麼上網路,這個程序應該符合你的條件的,有什麼不懂的可以找我呢,單片機我不知道呢,不過這個程序是符合你的條件的,HI我吧

4. 求單片機電子密碼鎖設置程序

#include<reg52.h>
#define uchar unsigned char

unsigned char num,flag,key,lt,j,k,q,m,flag1,count;
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
unsigned char tab1[]="*7410852#963";
unsigned char tab10[]="123";
unsigned char tab2[]="set your psw :";
unsigned char tab3[8];
unsigned char tab4[]="set ok !";
unsigned char tab5[]="input psw :";
unsigned char tab6[8];
unsigned char tab7[]="open";
unsigned char tab8[]="lost";
unsigned char tab9[]="lt";
void delay(uchar x)
{ uchar a,b;
for(a=10;a>0;a--)
for(b=x;b>0;b--);
}

void write_com(unsigned char com)
{P0=com;
rs=0;
rw=0;
delay(10);
e=1;
delay(10);
e=0;
}

void write_dat(unsigned char dat)
{P0=dat;
rs=1;
rw=0;
delay(10);
e=1;
delay(10);
e=0;
}

//初始化
void init()
{ uchar i;
TMOD=0x10;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;

write_com(0x38);
delay(20);
write_com(0x0e);
delay(20);
write_com(0x06);
delay(20);
write_com(0x01);
delay(20);
for(i=0;i<15;i++)
{write_com(0x80+i);
write_dat(tab2[i]);
}
}

void dis(void)
{
write_com(0xc0);
write_dat(tab1[key]);
delay(10);

}
//按鍵掃描
unsigned char keyscan(void)
{
P1=0x0f;
if((P1&0x0f)!=0x0f)
{
j++;
P1=0xef;
switch(P1&0x0f)
{
case 0x0e:while((P1&0x0f)!=0x0f);return 0;
case 0x0d:while((P1&0x0f)!=0x0f);return 1;
case 0x0b:while((P1&0x0f)!=0x0f);return 2;
case 0x07:while((P1&0x0f)!=0x0f);return 3;
default: break;
}
P1=0xdf;
switch(P1&0x0f)
{
case 0x0e:while((P1&0x0f)!=0x0f);return 4;
case 0x0d:while((P1&0x0f)!=0x0f);return 5;
case 0x0b:while((P1&0x0f)!=0x0f);return 6;
case 0x07:while((P1&0x0f)!=0x0f);return 7;
default: break;
}

P1=0xbf;
switch(P1&0x0f)
{
case 0x0e:while((P1&0x0f)!=0x0f);return 8;
case 0x0d:while((P1&0x0f)!=0x0f);return 9;
case 0x0b:while((P1&0x0f)!=0x0f);return 10;
case 0x07:while((P1&0x0f)!=0x0f);return 11;
default: break;
}
}
else return key;

}

void main()
{ init();

while(k==0)
{key=keyscan();
tab3[j]=key;
write_com(0xc0+j);
write_dat(tab1[key]);
if(key==8)
{j=0;
k=1;
key=0;
for(q=0;q<8;q++)
{write_com(0xc0+q);
write_dat(tab4[q]);
}
}

}

write_com(0x01);
write_com(0xc0+14);
write_dat(tab10[lt]);
for(q=0;q<11;q++)
{write_com(0x80+q);
write_dat(tab5[q]);

}
for(q=0;q<2;q++)
{write_com(0xc0+9+q);
write_dat(tab9[q]);
}
num=1;
while(num!=0)
{
key=keyscan();
tab6[j]=key;
write_com(0xc0+j);
write_dat(tab1[key]);

if(key==8)
{num=0;
j=0;
lt--;
}

}

for(q=0;q<8;q++)
{
if(tab3[q]!=tab6[q])
{flag1=1;
num=1;
break;
}
}
if(q==8)
{ flag=1;
lt=0;
}

while(flag1!=0)
{ write_com(0x01);
for(q=0;q<4;q++)
{write_com(0x80+12+q);
write_dat(tab8[q]);
}
count=0;
while(1)
{if(count==60)
{ flag1=0;
break;
}
}

}

while(flag!=0)
{ write_com(0x01);
for(q=0;q<4;q++)
{write_com(0x80+q);
write_dat(tab7[q]);
}
count=0;
while(1)
{if(count==60)
{flag=0;
break;
}
}

}

}

5. 求51單片機C語言編的密碼鎖程序

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define BIN(a,b,c,d,e,f,g,h) ((a<<7)+(b<<6)+(c<<5)+(d<<4)+(e<<3)+(f<<2)+(g<<1)+(h<<0))
//下面的code表示數組存放在ROM中,因為這個數組的值不需要改寫
uchar code KeyCode[16]={15,14,12,8,30,28,24,16,60,56,48,32,120,112,96,64};//值為m*(n+1)的乘積,用於Key()
uchar dis[6];
msdelay(uint x)//延時子函數
{uchar j;
while(x--)
{for(j=0;j<125;j++){;}
}
}
//鍵盤子程序一,鍵盤值與數組值對比得到
uchar Key(void)
{uchar temp,m,n,i,j,matrix,k;
P1=0xF0; /*行線電平為高,列線為低*/
temp=P1&0xf0;
if (temp==0xf0) return(16); /*行仍為高,無按健,退出*/
else msdelay(10);
for(i=1;i<16;i=i*2)
{m=i;
for(j=1;j<16;j=j*2)
{n=(~j)&0x0f;
P1=(m<<4)|n; /*m為P1的行值由i循環得到,n為列值,由j循環並取反得到*/
temp=P1&0xf0;
if (!temp)
{do{temp=P1&0xf0;}while(!temp);
matrix=m*(n+1);/*為避免乘積重復,n+1*/
for(k=0;k<16;k++){if (matrix==KeyCode[k]) return(k);} //KeyCode:見前
return(16);
} //if loop
}//j loop
}//i loop
}//Key end
//用Switch...case語句得到鍵盤值*/
uchar Key1(void)
{uchar temp,m,n,i,j,matrix;
P1=0xF0; /*行線電平為高,列線為低*/
temp=P1&0xf0;
if (temp==0xf0) return(16); /*行仍為高,無按健,退出*/
else msdelay(10);
for(i=1;i<16;i=i*2)
{m=i;
for(j=1;j<16;j=j*2)
{n=(~j)&0x0f;
P1=(m<<4)|n;/*m為P1的行值由i循環得到,n為列值,由j循環並取反得到*/
temp=P1&0xf0;
if (!temp)
{do{temp=P1&0xf0;}while(!temp);
matrix=m*(n+1);
switch(matrix) //此方法的基本思路:
{case 15:return(1); break; //由循環得到的m,n值賦於P1埠實現逐個鍵掃描
case 14:return(2); break; //同時由m,n+1的值相乘得到對應鍵點de的積
case 12:return(3); break; //m*(n+1)值掃描鍵點對應而得出鍵值
case 8:return(4); break; //
case 30:return(5); break; //
case 28:return(6); break; //
case 24:return(7); break; //
case 16:return(8); break;
case 60:return(9); break;
case 56:return(0); break;
case 48:return(10); break;
case 32:return(11); break;
case 120:return(12); break;
case 112:return(13); break;
case 96:return(14); break;
case 64:return(15); break;
default:return(16);
} //switch end
} //if loop
}//j loop
}//i loop
}//Key end
//依次掃描16個按鍵
uchar Key2(void)
{uchar temp;
P1=0xF0; /*使P1=1111 0000,行線電平為高,列線為低*/
temp=P1&0xf0;
if (temp==0xf0) return(16); /*讀P1=1111 xxxx,表示行仍為高,無按健,退出(x表示不關心)?/
else msdelay(10);
P1=0x1e; /*P1=0001 1110,行一為高,列一為低,掃描第一個按鍵*/
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(1);}
P1=0x1d; /*P1=0001 1101,行一為高,列二為低,掃描第二個按鍵,下面掃描其餘按鍵*/
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(2);}
P1=0x1b;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(3);}
P1=0x17;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(4);}
P1=0x2e;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(5);}
P1=0x2d;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(6);}
P1=0x2b;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(7);}
P1=0x27;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(8);}
P1=0x4e;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(9);}
P1=0x4d;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(0);}
P1=0x4b;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(10);}
P1=0x47;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(11);}
P1=0x8e;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(12);}
P1=0x8d;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(13);}
P1=0x8b;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(14);}
P1=0x87;
temp=P1&0xf0;
if (!temp) {do{temp=P1&0xf0;}while(!temp);
return(15);}

return(16); //掃描all按鍵都未按下,則輸出16
}//Key2 end.
////////時鍾中斷顯示子程序
void T0_int() interrupt 1
{static uchar i;
if (i==6){i=0;}
P0=5-i;
P0=P0|(dis[i]<<4);
i++;
TL0=0;
TH0=252;}

void distri(uint disnum)
{uint temp;
dis[0]=0;
dis[1]=disnum/10000;
temp=disnum%10000;
dis[2]=temp/1000;
temp=temp%1000;
dis[3]=temp/100;
temp=temp%100;
dis[4]=temp/10;
dis[5]=temp%10;
}
Main()
{uchar KeyVal,i=0;
TMOD=0x01;
IE=0x82;
TH0=252;
TL0=0;
TR0=1;
distri(0);
do{
KeyVal=Key();
if (KeyVal!=16) dis[1]=KeyVal; //注意:當有按鍵時才賦於顯示位dis[1],否則出錯,請分析!
}while(1);
}

6. 球C51電子密碼鎖C語言程序

/*看看我寫的這個合你的要求不?你的題目沒給明確我只寫了這個簡單的,你如果要限制密碼只能是4位把password加個判斷就好了
if(password>999&&password<10000)

else*/
#include<stdio.h>
#include<windows.h>
void main()
{
int password=0;
int temp=0;
printf("請設置密碼:\n");
scanf("%d",&password);
printf("密碼設置OK");
Sleep(1000);
system("cls");
printf("請輸入密碼:\n");
while(1)
{
scanf("%d",&temp);
if(temp==password)
{
printf("密碼正確\n");
break;
}
else
{
system("cls");
printf("密碼錯誤,請重新輸入:\n");
}
}
}

7. 求AT89C51單片機控制電子密碼鎖的程序 最好是C語言

;完成功能說明:
; 基本功能以及OK,可以在線修改密碼Ok,開機默認密碼:123456,在線可修改
;功能改進說明:
; 將代碼繼續優化,將其中的清楚按鍵設置成具有連按功能的按鍵,對於SET和SET_OUT利用一個按鍵來做(利用按鍵的3S長按進入重新設置密碼模式,利用相同按鍵的短擊退出密碼設置模式),設置報警模式以及退出報警設置,利用剩餘的按鍵來做。;===============================================
;==============MCU:AT89C52=====================
;============名稱:電子密碼鎖===================
;===========程序編寫人:DAIVD===================
;=========程序編寫時間:2010年8月3日============
;=功能描述:六位數碼管顯示,4*4矩陣鍵盤作為外設=
;=====通過矩陣鍵盤可以輸入密碼以及修改密碼======
;=====通過數碼管以及LED顯示當前密碼鎖狀態=======
;===============版本:V1.0======================
;=====項目完成時間: ==========
;===============================================
BT0 EQU 20H.0 ;節拍法標志位每個節拍為20MS
CHANGE_PW_FLAG EQU 20H.1 ;重新設置密碼標志位
OK_FLAG EQU 20H.2 ;確認密碼輸入標志位
CLR_FLAG EQU 20H.3 ;清楚輸入密碼標志位
KEY_REG EQU 20H.4 ;按鍵按下標志位
FLASHING_FLAG EQU 20H.5 ;閃爍標志位
ONCE_TIME EQU 20H.6 ;第一次進入標志位
MEMORY_FLAG EQU 20H.7 ;修改密碼是兩次輸入第一次需要記憶
DIGITAL_FLAG EQU 21H.0 ;是否需要鍵入數字標志位
NUM_FLAG EQU 21H.1 ;數字鍵標志位
;FUNCTION_FLAG EQU 21H.2 ;功能鍵標志位
D_DONG_FLAG EQU 21H.3 ;消抖標志位
KEY_HAVE_REG EQU 21H.4 ;一次按鍵多次響應標志位
SET_OUT EQU 21H.5 ;設置密碼狀態退出標志位
OTI EQU 21H.6 ;第一次進入重置密碼模式標志位
COMPARE_EN EQU 21H.7
OTII EQU 22H.0
ALARM EQU 22H.1 ;報警標志位
ALARM_OUT EQU 22H.2 ;報警退出標志位
ORIGINAL_PW_1 EQU 30H ;原始密碼存儲寄存器
ORIGINAL_PW_2 EQU 31H
ORIGINAL_PW_3 EQU 32H
ORIGINAL_PW_4 EQU 33H
ORIGINAL_PW_5 EQU 34H
ORIGINAL_PW_6 EQU 35H

CURRENT_PW_1 EQU 40H ;當前密碼存儲器
CURRENT_PW_2 EQU 41H
CURRENT_PW_3 EQU 42H
CURRENT_PW_4 EQU 43H
CURRENT_PW_5 EQU 44H
CURRENT_PW_6 EQU 45H

CURRENT_PW_1_REG EQU 46H ;當前密碼暫存器
CURRENT_PW_2_REG EQU 47H ;用於密碼修改時比較兩次輸入是否相同
CURRENT_PW_3_REG EQU 48H
CURRENT_PW_4_REG EQU 49H
CURRENT_PW_5_REG EQU 4AH
CURRENT_PW_6_REG EQU 4BH

DISPLAY_REG_0 EQU 36H ;顯示寄存器
DISPLAY_REG_1 EQU 37H
DISPLAY_REG_2 EQU 38H
DISPLAY_REG_3 EQU 39H
DISPLAY_REG_4 EQU 3AH
DISPLAY_REG_5 EQU 3BH

COUNT_0 EQU 3CH ;用於閃爍標志位的計數200MS
TH0_BUFFER EQU 3DH ;定時器賦初值寄存器
TL0_BUFFER EQU 3EH
MAZHI_REG EQU 3DH ;4*4矩陣鍵盤掃描得到的碼值
COUNT_1 EQU 3FH ;用於設置密碼標志位的計數超過3S則置一
COUNT_2 EQU 51H ;用於輸入密碼次數是否超過3次
R2_REG EQU 50H
CHIP_SELECT EQU P1 ;P1作為片選口
OUTPUT EQU P0 ;P0口作為輸出口
GREEN_LED EQU P3.4 ;綠燈代表輸入密碼正確
YELLOW_LED EQU P3.3 ;黃燈代表正在輸入密碼過程中
RED_LED EQU P3.2 ;紅燈代表輸入密碼錯誤
SPK EQU P3.1 ;蜂鳴器代表輸入密碼超過3次報警
ORG 0000H
LJMP START
ORG 0003H ;中斷入口地址寫RETI防止出現誤判對程序影響
RETI
ORG 000BH
LJMP T0_SER
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 002BH
RETI
ORG 0030H
START: MOV ORIGINAL_PW_1,#01 ;設置初始密碼
MOV ORIGINAL_PW_2,#02
MOV ORIGINAL_PW_3,#03
MOV ORIGINAL_PW_4,#04
MOV ORIGINAL_PW_5,#05
MOV ORIGINAL_PW_6,#06
MOV TMOD,#01H ;設置定時器0工作方式1採用中斷方式
SETB EA
SETB ET0
MOV DPTR,#65536-20000
MOV TH0,DPH
MOV TL0,DPL
MOV TH0_BUFFER,DPH
MOV TL0_BUFFER,DPL
SETB TR0
MOV R0,#CURRENT_PW_1 ;對當前密碼以及當前密碼暫存器賦初值
REFRESH_PW: MOV @R0,#0B9H ;其中當前密碼暫存器用於修改密碼時
INC R0 ;比較兩次重新輸入的密碼是否相等用
CJNE R0,#04CH,REFRESH_PW
MOV 20H,#00H
MOV 21H,#00H
MOV 22H,#00H
MOV COUNT_0,#00H
MOV COUNT_1,#00H
MOV COUNT_2,#00H
;=========================================
MAIN: JNB BT0,MAIN
CLR BT0

JNB CHANGE_PW_FLAG,LOOP ;判斷是否需要修改密碼
;===============修改原始密碼模式========== ;當CHANGE_PW_FLAG=1表明進入修改密碼模式
JB OTII,LP0
SETB OTII
MOV R2,#0
LP0: JNB SET_OUT,LP
MOV R2,#0
LJMP LP4
LP: JNB OK_FLAG,LOOP1 ;判斷是否輸入密碼完成
CLR OK_FLAG
JNB OTI,LP1 ;判斷是不是第一次進入要在輸入密碼正確的前提下
JNB COMPARE_EN,SAVE_MODE ;記錄兩次輸入的密碼是否一致才確定是否需要重置
CALL COMPARE_CODE
LJMP LOOP1
SAVE_MODE: CALL SAVE_CODE
LJMP LOOP1

LP1: CALL ENTER_PW_MODE
CJNE R2,#0,LP2
LJMP LOOP1
LP2: CJNE R2,#7,LP3 ;等於7代表原始密碼輸入正確,下一步記憶新密碼
SETB OTI
MOV R2,#0
LJMP LOOP1
LP3: MOV R2,#8
LP4: CLR ALARM_OUT
CLR SET_OUT
CLR OTI ;清零所有內容恢復等待密碼輸入狀態
CLR OTII
CLR COMPARE_EN
CLR CHANGE_PW_FLAG
LJMP LOOP1
;===============常規輸入密碼模式==========
LOOP: CLR SET_OUT ;非設置密碼格式下也會掃描到SET_OUT
;防止程序進入設置密碼狀態下直接退出
JNB ALARM,L1
JB ALARM_OUT,L2
CLR SPK
LJMP LOOP3
L2: SETB SPK
CLR ALARM_OUT
CLR ALARM
LJMP LOOP1
L1: JNB OK_FLAG,LOOP1 ;判斷是否輸入密碼完成
CLR OK_FLAG
CALL ENTER_PW_MODE

;==========================================
LOOP1: JNB CLR_FLAG,LOOP2 ;判斷是否需要清除所輸入密碼
CLR CLR_FLAG
LCALL CLR_INPUT_PW

LOOP2: JNB DIGITAL_FLAG,LOOP3 ;判斷是否需要輸入密碼
CLR DIGITAL_FLAG
LCALL INPUT_PW
LJMP LOOP3
;=========================================
LOOP3: LCALL DISPLAY
LCALL KEY_SCAN
INC COUNT_0
MOV A,COUNT_0
CJNE A,#5,LOOP4
MOV COUNT_0,#0
CPL FLASHING_FLAG
LOOP4:
LJMP MAIN
;=============下面是具體的子程序===========

;================檢測密碼是否正確==========
ENTER_PW_MODE:
CLR OK_FLAG ;比較是否為零,為零的時候
CJNE R2,#0,ENTER_PW_MODE_0 ;代表還沒密碼輸入,直接跳出
LJMP ENTER_PW_MODE_OUT
ENTER_PW_MODE_0:
CJNE R2,#7,$+3 ;用來比較R2是否為7或者8
JC ENTER_PW_MODE_2
MOV R2,#00 ;如果8在BAD的模式下切換到輸入密碼狀態
LJMP ENTER_PW_MODE_OUT ;如果7在GOOD的模式下切換到輸入密碼狀態

ENTER_PW_MODE_2:
CJNE R2,#6,ENTER_PW_MODE_3 ;如果R2里的數字不為6代表密碼位數不夠,肯定錯
MOV R0,#ORIGINAL_PW_1 ;如果R2里的數字等於6那麼在比較是否相同
MOV R1,#CURRENT_PW_1
ENTER_PW_MODE_4:
MOV A,@R0
XRL A,@R1 ;相異或內容相同為0
CJNE A,#00H,ENTER_PW_MODE_3
INC R0
INC R1
CJNE R0,#36H,ENTER_PW_MODE_4
MOV R2,#7 ;如果相同代表密碼輸入正確GOOD
MOV COUNT_2,#0
LJMP ENTER_PW_MODE_OUT

ENTER_PW_MODE_3:MOV R2,#8 ;如果不相同則代表密碼不正確BAD
INC COUNT_2
MOV A,COUNT_2
CJNE A,#3,$+3
JC KK
FUZHI: MOV COUNT_2,#00H
SETB ALARM
KK: MOV R0,#CURRENT_PW_1 ;對當前密碼以及當前密碼暫存器賦初值
REF_PW: MOV @R0,#0B9H ;其中當前密碼暫存器用於修改密碼時
INC R0 ;比較兩次重新輸入的密碼是否相等用
CJNE R0,#04CH,REF_PW
ENTER_PW_MODE_OUT:
RET
;==========================================

;=============清除所輸入的密碼=============
CLR_INPUT_PW:
CLR CLR_FLAG
CJNE R2,#0,CLR_INPUT_PW_0 ;如果為零則不操作
LJMP CLR_INPUT_PW_OUT
CLR_INPUT_PW_0:
CJNE R2,#7,$+3 ;用來比較R2是否為7或者8
JC CLR_INPUT_PW_1
MOV R2,#00 ;如果8在BAD的模式下切換到輸入密碼狀態
LJMP CLR_INPUT_PW_OUT ;如果7在GOOD的模式下切換到輸入密碼狀態
CLR_INPUT_PW_1:
DEC R2 ;正常模式下將R2減一
CLR_INPUT_PW_OUT:
RET
;==========================================

;============輸入單位密碼子程序============
INPUT_PW: JB NUM_FLAG,INPUT_PW_0
LJMP INPUT_PW_OUT
INPUT_PW_0: CLR NUM_FLAG
CJNE R2,#7,$+3 ;比較R2是否大於7,大於C=0
JC INPUT_PW_2
MOV R2,#01 ;數字鍵按下輸入密碼
LJMP INPUT_PW_3_3
INPUT_PW_2: CJNE R2,#6,INPUT_PW_3 ;如果當前R2等於則6位密碼已經輸滿則不操作
LJMP INPUT_PW_OUT
INPUT_PW_3: INC R2

INPUT_PW_3_3: MOV R1,#01
MOV R2_REG,R2 ;根據R2的給相應的位送密碼
MOV R0,#CURRENT_PW_1
JMP I_LOOP
I_LOOP1: INC R0
INC R1
I_LOOP: MOV A,R1
CJNE A,R2_REG,I_LOOP1
MOV A,R3
MOV @R0,A
INPUT_PW_OUT: RET
;==========================================
;===============SAVE_CODE==================
SAVE_CODE: CJNE R2,#6,SAVE_CLR ;如果R2不等於6代表密碼輸入錯誤直接退出
SAVE_IN: MOV R0,#CURRENT_PW_1_REG ;將輸入的新密碼先保存在密碼暫存區
MOV R1,#CURRENT_PW_1 ;46H
SAVE_IN_LOOP: MOV A,@R1
MOV @R0,A
INC R0
INC R1
MOV A,R1
CJNE A,#46H,SAVE_IN_LOOP
SETB COMPARE_EN
MOV R2,#0 ;密碼輸入正確則程序處於等待輸入狀態
LJMP SAVE_OUT
SAVE_CLR: MOV R2,#8
CLR SET_OUT
CLR OTI ;清零所有內容恢復等待密碼輸入狀態
CLR OTII
CLR COMPARE_EN
CLR CHANGE_PW_FLAG
SAVE_OUT: RET
;===========================================
;=================COMPARE_CODE==============
COMPARE_CODE: CJNE R2,#6,COMPARE_FAIL ;如果R2不等於6代表上次輸入密碼數不足6位
COMPARE_IN: MOV R0,#CURRENT_PW_1_REG
MOV R1,#CURRENT_PW_1 ;46H
COMPARE_IN_LOOP:
MOV A,@R1
XRL A,@R0
CJNE A,#00H,COMPARE_FAIL
INC R0
INC R1
MOV A,R1
CJNE A,#46H,COMPARE_IN_LOOP
MOV R0,#ORIGINAL_PW_1
MOV R1,#CURRENT_PW_1 ;46H
TIHUAN_LOOP: MOV A,@R1
MOV @R0,A
INC R0
INC R1
MOV A,R1
CJNE A,#46H,TIHUAN_LOOP
MOV R2,#7
CLR SET_OUT
CLR OTI ;清零所有內容恢復等待密碼輸入狀態
CLR OTII
CLR COMPARE_EN
CLR CHANGE_PW_FLAG
LJMP COMPARE_OUT
COMPARE_FAIL: MOV R2,#8
CLR SET_OUT
CLR OTI ;清零所有內容恢復等待密碼輸入狀態
CLR OTII
CLR COMPARE_EN
CLR CHANGE_PW_FLAG
COMPARE_OUT: RET

;===========================================

;==================顯示子程序==============
DISPLAY: MOV R4,#0
MOV DPTR,#TAB_0
MOV A,R2
RL A
JMP @A+DPTR
TAB_0: AJMP DISPLAY_0
AJMP DISPLAY_1
AJMP DISPLAY_2
AJMP DISPLAY_3
AJMP DISPLAY_4
AJMP DISPLAY_5
AJMP DISPLAY_6
AJMP DISPLAY_7
AJMP DISPLAY_8
DISPLAY_0: MOV DPTR,#TAB_1
LJMP REFRESH_DISPLAY
DISPLAY_1: MOV DPTR,#TAB_2
LJMP REFRESH_DISPLAY
DISPLAY_2: MOV DPTR,#TAB_3
LJMP REFRESH_DISPLAY
DISPLAY_3: MOV DPTR,#TAB_4
LJMP REFRESH_DISPLAY
DISPLAY_4: MOV DPTR,#TAB_5
LJMP REFRESH_DISPLAY
DISPLAY_5: MOV DPTR,#TAB_6
LJMP REFRESH_DISPLAY
DISPLAY_6: MOV DPTR,#TAB_7
LJMP REFRESH_DISPLAY
DISPLAY_7: MOV DPTR,#TAB_8
LJMP REFRESH_DISPLAY
DISPLAY_8: MOV DPTR,#TAB_9

REFRESH_DISPLAY:
MOV R0,#DISPLAY_REG_0
DISPLAY_LOOP:
MOV A,R4
MOVC A,@A+DPTR
MOV @R0,A
INC R4
INC R0
MOV A,R0
CJNE A,#3CH,DISPLAY_LOOP ;此時表明數碼管顯示的數值已送完
DISPLAY_SHOW:

MOV R0,#DISPLAY_REG_0 ;數碼管動態顯示
MOV R5,#0FEH
NEXT_0: MOV CHIP_SELECT,R5
MOV A,@R0
MOV OUTPUT,A
LCALL DELAY
MOV OUTPUT,#0FFH
INC R0
MOV A,R5
RL A
MOV R5,A ;片選
CJNE R0,#3CH,NEXT_0
CJNE R2,#0,NEXT_6
MOV P3,#0FFH
LJMP DISPLAY_OUT
NEXT_6: CJNE R2,#7,NEXT_1
CLR GREEN_LED
SETB YELLOW_LED
SETB RED_LED
LJMP DISPLAY_OUT

NEXT_1: CJNE R2,#8,NEXT_2
SETB YELLOW_LED
SETB GREEN_LED
CLR RED_LED
LJMP DISPLAY_OUT

NEXT_2: JNB CHANGE_PW_FLAG,NEXT_3
JNB FLASHING_FLAG,NEXT_4
MOV P3,#0FFH
LJMP DISPLAY_OUT

NEXT_4: MOV P3,#00H
LJMP DISPLAY_OUT

NEXT_3: JNB FLASHING_FLAG,NEXT_5
MOV P3,#0F7H
LJMP DISPLAY_OUT
NEXT_5: MOV P3,#0FFH
DISPLAY_OUT: RET
;=======================================

;============按鍵掃描程序===============
KEY_SCAN: MOV R3,#00H ;對碼表掃描進行初始化可以訪問到第一位
JNB D_DONG_FLAG,PANDUAN ;判斷是否進行過消抖
LCALL FANZHUAN_SCAN ;反轉掃描確定碼值
CJNE A,#0FFH,L4 ;如果碼值等於0FFH可能是抖動或者按鍵抬起
L3: CLR D_DONG_FLAG ;表明是按鍵抬起,此時要對D_DONG_FLAG/
CLR KEY_HAVE_REG ;KEY_HAVE_REG進行清零;;;;;;;;;;
CLR COUNT_1
LJMP KEY_SCAN_OUT
L4: JNB ALARM,KEY_SCAN_1
CJNE A,#0B7H,L3
SETB ALARM_OUT
CLR D_DONG_FLAG
LJMP KEY_SCAN_OUT
PANDUAN: LCALL FANZHUAN_SCAN ;第一次進入沒有經過消抖判斷是否有按鍵按下
CJNE A,#0FFH,KEY_SCAN_0 ;對所掃描的碼值進行比較如果為0FFH沒按鍵按下
LJMP KEY_SCAN_OUT

KEY_SCAN_0: SETB D_DONG_FLAG ;所掃到的碼值不等於0FFH可能是按鍵按下
LJMP KEY_SCAN_OUT
KEY_SCAN_1:
JNB KEY_HAVE_REG,KEY_SCAN_1_1;一次按鍵多次響應標志位
CJNE A,#0E7H,KEY_SCAN_1_1_1
INC COUNT_1 ;長按處理
MOV A,COUNT_1
CJNE A,#150,KEY_SCAN_1_1_1
MOV COUNT_1,#00H
SETB CHANGE_PW_FLAG
CLR D_DONG_FLAG
CLR KEY_HAVE_REG
KEY_SCAN_1_1_1:
LJMP KEY_SCAN_OUT
KEY_SCAN_1_1: MOV MAZHI_REG,A
KEY_SCAN_LOOP:
MOV DPTR,#TAB_10
MOV A,R3
MOVC A,@A+DPTR
CJNE A,#0FFH,KEY_SCAN_2 ;如果查出的碼表值為0FFH代表已經查完了
MOV R3,#0 ;但是沒有符合的就代表是亂碼不處理
CLR D_DONG_FLAG
CLR KEY_HAVE_REG
LJMP KEY_SCAN_OUT
KEY_SCAN_2: CJNE A,MAZHI_REG,KEY_SCAN_3 ;比較是哪個鍵按下
CJNE R3,#10,$+3 ;通過比較後形成小於等於9或者大於9兩種情況
JNC COMPARE
SHUZI_MODE: SETB KEY_HAVE_REG
SETB NUM_FLAG
SETB DIGITAL_FLAG
LJMP KEY_SCAN_OUT
COMPARE: SETB KEY_HAVE_REG
CJNE R3,#10,COMPARE_0 ;此時R3內的數值大於9則CY=1
SETB OK_FLAG ;等於10為OK鍵按下
LJMP KEY_SCAN_OUT
COMPARE_0: CJNE R3,#11,COMPARE_1 ;等於11為清除按鍵按下
SETB CLR_FLAG
LJMP KEY_SCAN_OUT ;等於12為設置密碼按鍵在長按裡面加處理
COMPARE_1: CJNE R3,#13,COMPARE_2 ;等於13為設置密碼跳出標志
SETB SET_OUT
LJMP KEY_SCAN_OUT
;COMPARE_2: CJNE R3,#14,COMPARE_3
; SETB ALARM
; LJMP KEY_SCAN_OUT
COMPARE_2: CJNE R3,#14,COMPARE_4
SETB ALARM_OUT
LJMP KEY_SCAN_OUT
COMPARE_4: LJMP KEY_SCAN_OUT ;按鍵加功能
KEY_SCAN_3: INC R3
LJMP KEY_SCAN_LOOP
KEY_SCAN_OUT:
RET
;=======================================

FANZHUAN_SCAN: MOV P2,#0F0H ;反轉掃描確定碼值
MOV A,P2
ANL A,#0F0H
MOV B,A
MOV P2,#0FH
MOV A,P2
ANL A,#0FH
ORL A,B
RET

;===============顯示的碼表==============
TAB_1: DB 0BFH,0BFH,0BFH,0BFH,0BFH,0BFH ;------
TAB_2: DB 0B9H,0BFH,0BFH,0BFH,0BFH,0BFH ;+-----
TAB_3: DB 0B9H,0B9H,0BFH,0BFH,0BFH,0BFH ;++----
TAB_4: DB 0B9H,0B9H,0B9H,0BFH,0BFH,0BFH ;+++---
TAB_5: DB 0B9H,0B9H,0B9H,0B9H,0BFH,0BFH ;++++--
TAB_6: DB 0B9H,0B9H,0B9H,0B9H,0B9H,0BFH ;+++++-
TAB_7: DB 0B9H,0B9H,0B9H,0B9H,0B9H,0B9H ;++++++
TAB_8: DB 090H,0A3H,0A3H,0A1H,0FFH,0FFH ;good
TAB_9: DB 083H,0A0H,0A1H,0FFH,0FFH,0FFH ;bad
TAB_10: DB 0EEH,0DEH,0BEH,07EH,0EDH,0DDH,0BDH,07DH ;4*4矩陣鍵盤的碼表
DB 0EBH,0DBH,0BBH,07BH,0E7H,0D7H,0B7H,77H,0FFH
;=======================================

;==============延時子程序===============
;輸入:無
;輸出:無
;功能:延時一段時間穩定數碼管的顯示2.4MS
DELAY:
MOV R7,#30
DL: MOV R6,#40
DJNZ R6,$
DJNZ R7,DL
RET
;=======================================

;============定時器中斷服務程序=========
T0_SER:
MOV TMOD,#01H
SETB BT0
MOV TH0,TH0_BUFFER
MOV TL0,TL0_BUFFER
RETI
;=======================================
END

8. 關於51單片機C語言 數碼管 4*4按鍵 簡單的密碼鎖 請您幫助一下

密碼鎖(掉電保護功能)
功能鍵
S6---S15 數字鍵0-9
S16---更改密碼 S17---更改密碼完畢後確認
S18---重試密碼、重新設定 S19---關閉密碼鎖
初始密碼:000000 密碼位數:6位
注意:掉電後,所設密碼會丟失,重新上點時,密碼恢復為原始的000000
與P1相連的8位發光LED點亮代表鎖被打開;熄滅代表鎖被鎖上

程序功能: 本程序結合了24C02存儲器的存儲功能,可以掉電保存密碼。
第一次運行時,若輸入000000原始密碼後無反應,可以試驗著將主程序中前面的
一小段被注釋線屏蔽的程序前的注釋線刪掉,然後重新編譯下載(可以將密碼還原為000000)。
此後,再將這小段程序屏蔽掉,再編譯下載。方可正常使用。
1、開鎖:
下載程序後,直接按六次S7(即代表數字1),8位LED亮,鎖被打開,輸入密碼時,
六位數碼管依次顯示小橫杠。
2、更改密碼:
只有當開鎖(LED亮)後,該功能方可使用。
首先按下更改密碼鍵S16,然後設置相應密碼,此時六位數碼管會顯示設置密碼對應
的數字。最後設置完六位後,按下S17確認密碼更改,此後新密碼即生效。
3、重試密碼:
當輸入密碼時,密碼輸錯後按下鍵S18,可重新輸入六位密碼。
當設置密碼時,設置中途想更改密碼,也可按下此鍵重新設置。
4、關閉密碼鎖:
按下S19即可將打開的密碼鎖關閉。
推薦初級演示步驟:輸入原始密碼000000---按下更改密碼按鍵S16---按0到9設置密碼---按S17
確認密碼更改---按S18關閉密碼鎖---輸入新的密碼打開密碼鎖
*******************************************************************************/
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

uchar old1,old2,old3,old4,old5,old6; //原始密碼000000
uchar new1,new2,new3,new4,new5,new6; //每次MCU採集到的密碼輸入
uchar a=16,b=16,c=16,d=16,e=16,f=16; //送入數碼管顯示的變數
uchar wei,key,temp;

bit allow,genggai,ok,wanbi,retry,close; //各個狀態位

sbit la=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
sbit sda=P2^0; //IO口定義
sbit scl=P2^1;

unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

/*****************IIC晶元24C02存儲器驅動程序************************************/

void nop()
{
_nop_();
_nop_();
}
/////////24C02讀寫驅動程序////////////////////
void delay1(unsigned int m)
{ unsigned int n;
for(n=0;n<m;n++);
}

void init() //24c02初始化子程序
{
scl=1;
nop();
sda=1;
nop();
}

void start() //啟動I2C匯流排
{
sda=1;
nop();
scl=1;
nop();
sda=0;
nop();
scl=0;
nop();
}

void stop() //停止I2C匯流排
{
sda=0;
nop();
scl=1;
nop();
sda=1;
nop();
}

void writebyte(unsigned char j) //寫一個位元組
{
unsigned char i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
nop();
sda=CY; //temp左移時,移出的值放入了CY中
nop();
scl=1; //待sda線上的數據穩定後,將scl拉高
nop();
}
scl=0;
nop();
sda=1;
nop();
}

unsigned char readbyte() //讀一個位元組
{
unsigned char i,j,k=0;
scl=0; nop(); sda=1;
for (i=0;i<8;i++)
{
nop(); scl=1; nop();
if(sda==1)
j=1;
else
j=0;
k=(k<<1)|j;
scl=0;
}
nop();
return(k);
}

void clock() //I2C匯流排時鍾
{
unsigned char i=0;
scl=1;
nop();
while((sda==1)&&(i<255))
i++;
scl=0;
nop();
}

////////從24c02的地址address中讀取一個位元組數據/////
unsigned char read24c02(unsigned char address)
{
unsigned char i;
start();
writebyte(0xa0);
clock();
writebyte(address);
clock();
start();
writebyte(0xa1);
clock();
i=readbyte();
stop();
delay1(100);
return(i);
}

//////向24c02的address地址中寫入一位元組數據info/////
void write24c02(unsigned char address,unsigned char info)
{
start();
writebyte(0xa0);
clock();
writebyte(address);
clock();
writebyte(info);
clock();
stop();
delay1(5000); //這個延時一定要足夠長,否則會出錯。因為24c02在從sda上取得數據後,還需要一定時間的燒錄過程。
}
/****************************密碼鎖程序模塊********************************************************/

void delay(unsigned char i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}

void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
{
la=0;
P0=table[a];
la=1;
la=0;

wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);

P0=table[b];
la=1;
la=0;

P0=0xfd;
wela=1;
wela=0;
delay(5);

P0=table[c];
la=1;
la=0;

P0=0xfb;
wela=1;
wela=0;
delay(5);

P0=table[d];
la=1;
la=0;

P0=0xf7;
wela=1;
wela=0;
delay(5);

P0=table[e];
la=1;
la=0;

P0=0xef;
wela=1;
wela=0;
delay(5);

P0=table[f];
la=1;
la=0;

P0=0xdf;
wela=1;
wela=0;
delay(5);
}

void keyscan()
{
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
wei++;
break;

case 0xde:
key=1;
wei++;
break;

case 0xbe:
key=2;
wei++;
break;

case 0x7e:
key=3;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
wei++;
break;

case 0xdd:
key=5;
wei++;
break;

case 0xbd:
key=6;
wei++;
break;

case 0x7d:
key=7;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
wei++;
break;

case 0xdb:
key=9;
wei++;
break;

case 0xbb:
genggai=1;
wei=0;
break;

case 0x7b:
if(allow)
ok=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
retry=1;
break;

case 0xd7:
close=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
}

void shumima() //對按鍵採集來的數據進行分配
{
if(!wanbi)
{
switch(wei)
{
case 1:new1=key;
if(!allow) a=17;
else a=key; break;
case 2:new2=key;
if(a==17) b=17;
else b=key; break;
case 3:new3=key;
if(a==17) c=17;
else c=key; break;
case 4:new4=key;
if(a==17) d=17;
else d=key; break;
case 5:new5=key;
if(a==17) e=17;
else e=key; break;
case 6:new6=key;
if(a==17) f=17;
else f=key;
wanbi=1; break;
}
}
}

void yanzheng() //驗證密碼是否正確
{
if(wanbi) //只有當六位密碼均輸入完畢後方進行驗證
{
if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6))
allow=1; //當輸入的密碼正確,會得到allowe置一
}
}

void main()
{

init(); //初始化24C02
/*********下面的一小段程序的功能為格式化密碼存儲區。************
******當24c02中這些存儲區由於其他程序的運行而導致***************
*******所存數據發生了變化,或者密碼遺忘時, ********************
******可以刪掉其前面的注釋線,然後重新編譯下載。****************
******而將密碼還原為000000後,請將下面的程序用******************
******注釋屏蔽掉,重新編譯、下載,方可正常使用****************/
// write24c02(110,0x00);
// write24c02(111,0x00);//24c02的第110到115地址單元作為密碼存儲區
// write24c02(112,0x00);
// write24c02(113,0x00);
// write24c02(114,0x00);
// write24c02(115,0x00);
/*******************************************************************/

old1=read24c02(110);
old2=read24c02(111);
old3=read24c02(112);
old4=read24c02(113);
old5=read24c02(114);
old6=read24c02(115);

while(1)
{
keyscan();
shumima();
yanzheng();
if(allow) //驗證完後,若allow為1,則開鎖
{
P1=0x00;
if(!genggai)
wanbi=0;
}
if(genggai) //當S16更改密碼鍵被按下,genggai會被置一
{
if(allow) //若已經把鎖打開,才有更改密碼的許可權
{
while(!wanbi) //當新的六位密碼沒有設定完,則一直在這里循環
{
keyscan();
shumima();
if(retry|close) //而當探測到重試鍵S18或者關閉密碼鎖鍵S19被按下時,則跳出
{ wanbi=1;
break;
}
display(a,b,c,d,e,f);
}
}
}
if(ok) //更改密碼時,當所有六位新密碼均被按下時,可以按下此鍵,結束密碼更改
{ //其他時間按下此鍵無效
ok=0; wei=0;
genggai=0;
old1=new1;old2=new2;old3=new3; //此時,舊的密碼將被代替
old4=new4;old5=new5;old6=new6;
//新密碼寫入存儲區。
write24c02(110,old1);
write24c02(111,old2);
write24c02(112,old3);
write24c02(113,old4);
write24c02(114,old5);
write24c02(115,old6);
a=16;b=16;c=16;d=16;e=16;f=16;
}
if(retry) //當重試按鍵S18被按下,retry會被置位
{
retry=0; wei=0;wanbi=0;
a=16;b=16;c=16;d=16;e=16;f=16;
new1=0;new2=0;new3=0;new4=0;new5=0;new6=0;
}
if(close) //當關閉密碼鎖按鍵被按下,close會被置位
{
close=0;genggai=0;//所有變數均被清零。
wei=0; wanbi=0;
allow=0;
P1=0xff;
a=16;b=16;c=16;d=16;e=16;f=16;
new1=0;new2=0;new3=0;new4=0;new5=0;new6=0;
}
display(a,b,c,d,e,f); //實時顯示
}
}