您好,我只解析部分,剩下就舉一反三囉
P3=0xff;
P3_4=0;
temp=P3;
temp=temp & 0x0f; //第一次輸入
if (temp!=0x0f)
{
for(i=10;i>0;i--)
for(j=248;j>0;j--); //按鍵延遲
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f) //按鍵去抖動
{
temp=P3;
temp=temp & 0x0f;
switch(temp) //鍵值改變
{
case 0x0e:
key=7;
break;
case 0x0d:
key=8;
break;
case 0x0b:
key=9;
break;
case 0x07:
key=10;
break;
}
temp=P3;
P1_1=~P1_1; //LED閃滅
if((key>=0) && (key<10)) //判斷Key值範圍
{
if(keycount<6) //判斷Key位數
{
getps[keycount]=key; //存入Key的buffer
dispbuf[keycount+2]=19; //存入顯示buffer
}
keycount++;
if(keycount==6) //Key等於6位數
{
keycount=6;
}
else if(keycount>6) //Key超過6位數
{
keycount=6;
keyoverflag=1;//key overflow Key超過6位數識別變數
}
}
else if(key==12)//delete key
{
if(keycount>0) //大於0位數時才可刪除
{
keycount--;
getps[keycount]=0;
dispbuf[keycount+2]=16;
}
else
{
keyoverflag=1; //key overflow Key小於等於0位時的識別變數
}
}
else if(key==15)//enter key
{
if(keycount!=pslen) //Key與密碼不同等位數
{
errorflag=1; //錯誤比對識別變數
rightflag=0;
second3=0;
}
else
{
for(i=0;i<keycount;i++) //等位數就逐一位數比對
{
if(getps[i]!=ps[i])
{
i=keycount;
errorflag=1;
rightflag=0;
second3=0;
goto a; //這裡使用不是很恰當
}
}
errorflag=0;
rightflag=1; //比對成功的識別變數
a: i=keycount;
}
}
temp=temp & 0x0f;
while(temp!=0x0f) //等待使用者輸入
{
temp=P3;
temp=temp & 0x0f;
}
keyoverflag=0;//????????? 初始化超過或未滿位數識別變數
}
}
後面三次輸入就知道意思了,再來看中斷函數void t0(void) interrupt 1 using 0
{
TH0=(65536-500)/256; //12M晶振,12T定時,這裡為500us定時
TL0=(65536-500)%256;
flashcount++;
if(flashcount==8) //刷新數碼管顯示用
{
flashcount=0;
P0=dispcode[dispbuf[dispcount]];
P2=dispbit[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
if((errorflag==1) && (rightflag==0)) //錯誤比對時
{
bb++;
if(bb==800) //每500x800=0.4s,Beeper間隔鳴叫
{
bb=0;
alarmflag=~alarmflag;
}
if(alarmflag==1)//sound alarm signal
{
P1_7=~P1_7;
}
aa++;
if(aa==800)//light alarm signal 每500x800=0.4s,LED間隔閃滅
{
aa=0;
P1_0=~P1_0;
}
second3++;
if(second3==6400) //3.2s後結束所有警告動作,並初始化所有變數
{
second3=0;
errorflag=0;
rightflag=0;
alarmflag=0;
bb=0;
aa=0;
}
}
else if((errorflag==0) && (rightflag==1)) //比對成功時
{
P1_0=0; //LED滅
cc++;
if(cc<1000) //以下都是Beeper鳴叫的延遲
{
okflag=1;
}
else if(cc<2000)
{
okflag=0;
}
else //超過500*2000= 1s後,初始化所有變數
{
errorflag=0;
rightflag=0;
P1_7=1;
cc=0;
oka=0;
okb=0;
okflag=0;
P1_0=1;
}
if(okflag==1) //Beeper鳴叫間隔 500x2=1ms
{
oka++;
if(oka==2)
{
oka=0;
P1_7=~P1_7;
}
}
else //Beeper鳴叫間隔 500x3=1.5ms
{
okb++;
if(okb==3)
{
okb=0;
P1_7=~P1_7;
}
}
}
if(keyoverflag==1) //Beeper鳴叫間隔 500us
{
P1_7=~P1_7;
}
}
以上解析完畢,剩餘的還需要您自己好好理解囉,祝好運