可以用switch語句解決這一問題嗎詳細的說就是 怎么解決用數碼管做密碼鎖并且在切換界面時輸入位置不會改變
單片機源程序如下:
#include <REGX52.H>
#include "NixieTube.h"//數碼管
#include "Delay.h"//延時函數
#include "MatrixKey.h"//矩陣鍵盤
sbit Beep=P2^5;
unsigned int y=1,b,n,h,i,j,k,l,m,w2,w,f,a;//h i j k l m為密碼n y b f a為參數
unsigned int Timer0Count=0;
unsigned char KeyNum,x=100,Password1=172,Password2=213;
void Timer0_Init(void) //10毫秒@11.0592MHz
{
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x01; //設置定時器模式
TL0 = 0x00; //設置定時初值
TH0 = 0xDC; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0=1; //中斷初始化
EA=1; //中斷初始化
PT0=0; //中斷初始化
}
void main()
{
Timer0_Init();
while(1)
{
KeyNum=MatrixKey();
if(KeyNum==10)//按鍵1按下切換界面
{
y++;
if(y>=3) y=1;//防止界面溢出
}
if(y==1)//界面1
{
NixieTube(6,x/100);
NixieTube(7,x/10);
NixieTube(8,x%10);
}
if(y==2)//界面2
{
NixieTube(1,h);
NixieTube(2,i);
NixieTube(3,j);
NixieTube(4,k);
NixieTube(5,l);
NixieTube(6,m);
if(KeyNum)//密碼輸入位置轉換
{
if(w==1) h=KeyNum;
if(w==2) i=KeyNum;
if(w==3) j=KeyNum;
if(w==4) k=KeyNum;
if(w==5) l=KeyNum;
if(w==6) m=KeyNum;
w++;
if(w>=7&&(h*100+i*10+j!=Password1&&k*100+l*10+m!=Password2))
{h=0;i=0;j=0;k=0;l=0;m=0;w=0;b++;}//密碼錯誤計數和清零
if(w==7) w=0;//防止密碼位置溢出
}
}
if(h*100+i*10+j==Password1&&k*100+l*10+m==Password2)//密碼正確進入流水燈
{
P2=0xFE;
Delay(500);
P2=0xFD;
Delay(500);
P2=0xFB;
Delay(500);
P2=0xF7;
Delay(500);
P2=0xEF;
Delay(500);
P2=0xDF;
Delay(500);
P2=0xBF;
Delay(500);
P2=0x7F;
Delay(500);
h=0;i=0;j=0;k=0;l=0;m=0;
}
if(b==5)//達到錯誤次數閃爍
{
for(f=0;f<=3;f++)
{
P2=0x00;
Delay(500);
P2=0xFF;
Delay(500);
}
b=0;
}
}
}
void Timer0_Routine() interrupt 1 //中斷
{
TL0 = 0x00; //設置定時初值,讓定時器重新開始計時
TH0 = 0xDC; //設置定時初值
Timer0Count++; //每10ms打斷一次,計數器加1
if(Timer0Count>=10)
{
Timer0Count=0;
x--;
if(x==0)
{
for(a=0;a<=3;a++)
{
for(n=0;n<110;n++)
{
Beep=!Beep;
Delay(2);
}
}
x=100;
}
}
}
|