📄 mima.c
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//////////////////////////////////////////////////////////
//LED显示段码显示
#define a 0x80
#define b 0x40
#define c 0x20
#define d 0x10
#define e 0x08
#define f 0x04
#define g 0x02
#define dp 0x01
////////////////////////////////////////////////
//LED显示位数
uint weishu;
///////////////////////////////////////////////////////
//延时程序
/*void delay1ms(uint count)
{
uint i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++)
;
}*/
void delay10ms(uint count)
{
uint i,j,k;
for(i=0;i<count;i++)
for(j=0;j<10;j++)
for(k=0;k<120;k++)
;
}
/*void delay100ms(uint count)
{
uint i,j,k;
for(i=0;i<count;i++)
for(j=0;j<100;j++)
for(k=0;k<120;k++)
;
}*/
/////////////////////////////////////////////////
//数据显示字模(共阴)
uchar const disp_code[16]={a+b+c+d+e+f,
b+c,
a+b+d+e+g,
a+b+c+d+g,
b+c+f+g,
a+c+d+f+g,
a+c+d+e+f+g,
a+b+c,
a+b+c+d+e+f+g,
a+b+c+d+f+g,
a+b+c+e+f+g,
c+d+e+f+g,
a+d+e+f,
b+c+d+e+g,
a+d+e+f+g,
a+e+f+g};
///////////////////////////////////////////////////
//16进制转换为10进制的子程序
uchar disp_busf[4];
/*void hex_bcd(uint i)
{
uchar j;
for(j=0;j<4;j++)
{
disp_busf[j]=i%10;
i=i/10;
}
}*/
/////////////////////////////////////////////////////
//动态显示子程序
void display(void)
{
switch(weishu) //利用switch控制LED四个的显示位数,如果我们只用了2位,则只显示2位
{
case 4:
P0&=~0x08;
P2=~disp_code[disp_busf[0]];
delay10ms(3);
P0|=0x0f;
case 3:
P0&=~0x04;
P2=~disp_code[disp_busf[1]];
delay10ms(3);
P0|=0x0f;
case 2:
P0&=~0x02;
P2=~disp_code[disp_busf[2]];
delay10ms(3);
P0|=0x0f;
case 1:
P0&=~0x01;
P2=~disp_code[disp_busf[3]];
delay10ms(3);
P0|=0x0f;
default:
P0&=~0x00;
delay10ms(3);
}
}
///////////////////////////////////////////////////////////
//键盘扫描子程序(反转法)
uchar key_scan(void)
{
uchar i,j;
P1=0x0f;
i=P1;
i&=0x0f;
if(i==0x0f)
return(0xff);
delay10ms(1);
P1|=0x0f;
i=P1;
i&=0x0f;
if(i==0x0f)
return(0xff);
P1=0xf0;
j=P1;
j&=0xf0;
return(i+j);
}
//////////////////////////////////////////////////////////
//键盘键值
uchar const key_code[16]={0x77,0x7b,0x7d,0x7e,0xb7,0xbb,0xbd,0xbe,
/*k1 k2 k3 k4 k5 k6 k7 k8*/
0xd7,0xdb,0xdd,0xde,0xe7,0xeb,0xed,0xee};
/*k9 k10 k11 k12 k13 k14 k15 k16*/
////////////////////////////////////////////////////////////
//键盘扫描与键值译码子程序
uchar key(void)
{
uchar i,j;
i=key_scan();
if(i==0xff)
return(0xff);
loop:
j=key_scan();
if(j!=0xff) goto loop;
for(j=0;j<16;j++)
{
if(i==key_code[j])
break;
}
return(j);
}
//////////////////////////////////////////////////
//定时器0的中断服务程序
void xianshi(void) interrupt 1 using 1///中断方式显示数据
{
TH0=50000/256;
TL0=50000%256;
display();
}
/*//////////////////////////////////////////////////
//定时器1的中断服务程序
void alarm(void) interrupt 3 using 2///中断方式控制蜂鸣器
{
P3&=0xbf;
}*/
uchar key_busf;
/*////////////////////////////////////////////////////
//16进制高低位分解子程序
void hex_fen(uchar i)
{
disp_busf[0]=i&0x0f;
disp_busf[1]=i&0xf0;
disp_busf[1]>>=4;
}*/
////////////////////////////////////////////////////
//密码设置
uchar mima[4];
int config; //验证修改密码是否有足够的权限
void mima_setup(void)
{
uchar i,twice=0;
uchar mima1[4];
weishu=0;
if(config==0)
{
P0&=0x0f;
return;
}
loop:
i=key();
if(i==0xff)
goto loop;
else if(i<10&&weishu<4)
{
disp_busf[3]=disp_busf[2];
disp_busf[2]=disp_busf[1];
disp_busf[1]=disp_busf[0];
disp_busf[0]=i;
weishu++;
}
else if(i==0x0d)
{
if(weishu!=0)
{
disp_busf[0]=disp_busf[1];
disp_busf[1]=disp_busf[2];
disp_busf[2]=disp_busf[3];
weishu--;
}
}
else if(i==0x0f&&weishu==4)
{
if(twice==0)
{
for(i=0;i<4;i++)
{mima1[i]=disp_busf[i];}
twice=1;
}
P0|=0xf0;
if(twice==1)
{
for(i=0;i<4;i++)
{
if(mima1[i]!=disp_busf[i])
break;
}
if(i==4)
{
for(i=0;i<4;i++)
{
mima[i]=disp_busf[i];
P0|=0xf0;
}
config=0;
return;
}
}
}
else
goto loop;
}
//////////////////////////////////////////////////////
//输入数据子程序
void shuru(void)
{
uchar i,wrong=0;
loop:
i=key();
if(i==0xff)
goto loop;
else if(i<10)
{
if(weishu!=4)
{
disp_busf[3]=disp_busf[2];
disp_busf[2]=disp_busf[1];
disp_busf[1]=disp_busf[0];
disp_busf[0]=i;
weishu++;
}
}
else if(i==0x0d)
{
if(weishu!=0)
{
disp_busf[0]=disp_busf[1];
disp_busf[1]=disp_busf[2];
disp_busf[2]=disp_busf[3];
weishu--;
}
}
else if(i==0x0f&&weishu==4)
{
for(i=0;i<4;i++)
{if(disp_busf[i]!=mima[i]) break;}
if(i!=4)
{
P0&=0x0f;
wrong++;
if(wrong==3)
{
P3|=0x40;
// TH1=10000/256;
// TL1=10000%256;
for(i=0;i<10000;i++)
{
i=key();
if(i==0x0c)
break;
}
P3&=0xbf;
wrong=0;
}
}
else
{
P0|=0xf0;
config=1;
wrong=0;
}
return;
}
else if(i==0x0e)
{
mima_setup();
return;
}
else
goto loop;
}
//////////////////////////////////////////////////////////////
//主程序
void main(void)
{
TMOD=0x11;
TH0=50000/256;
TL0=50000%256;
ET0=1;
TR0=1;
EA=1;
mima[0]=1;//密码初始化
mima[1]=0;
mima[2]=2;
mima[3]=5;
config=0;
weishu=0;//LED初始状态不显示
loop:
shuru();
goto loop;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -