可以用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;
}
}
}
|