用八位LED做的简单的电子密码锁,开锁成功红灯亮,失败黄灯亮。可以设6位密码,修改密码等功能。
#include "reg51.h"
#include "intrins.h" //_nop_();延时函数用
#define uchar unsigned char
#define uint unsigned int
#define GET_OUT1 P0
#define GET_OUT2 P2
#define BIT_OUT P1
#define KEY_IO P3
unsigned long temp;
uchar data keytemp,key,temp2,temp1,a,b,c,d,e,f,a1,b1,c1,d1,e1,f1,flay=0;
uchar dis_buff[8]={0,0,0,0,0,0,0,0};
sbit LED_YEN=P1^1;
sbit LED_REN=P1^0;
bit flag_key=0;
bit queyan=0;
bit shemima=0;
uchar code tab[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};
void Delay(uint n)
{
uchar k,j;
for(k=0;k<n;k++)
for(j=0;j<125;j++)
;
}
//////////LED动态显示/////////////////
void deplay_led(void)
{
uchar L;
uchar m=0xfb;
for(L=0;L<6;L++)
{
BIT_OUT=0xff;
GET_OUT1=tab[dis_buff[L]];
GET_OUT2=tab[dis_buff[L]];
BIT_OUT=m;
Delay(4);
m=(m<<1)|0x01;
}
}
///////////////////////////////////////////
void qing_0(void) //用来清零
{
flay=0;
temp=000000;
dis_buff[0]=temp/10000000;
dis_buff[1]=(temp%10000000)/1000000;
dis_buff[2]=(temp%1000000)/100000;
dis_buff[3]=(temp%100000)/10000;
dis_buff[4]=(temp%10000)/1000;
dis_buff[5]=(temp%1000)/100;
dis_buff[6]=(temp%100)/10;
dis_buff[7]=temp%10;
}
//////////////////按键程序///////////////////
void scanpay(void)
{
uchar i,t=0xef; //1110 1111
KEY_IO=0x0f;
keytemp=(~KEY_IO)&0x0f;
if(keytemp!=0) //0000 0000 ;0000 1000; 0000 0100; 0000 0010; 0000 0001;
{
Delay(1);
for(i=0;i<4;i++)
{
KEY_IO=t;
keytemp=(~KEY_IO)&0x0f;
if(keytemp!=0&flag_key==0)
{
flag_key=1;
switch(keytemp)
{
case 0x08:key=0*4+i;break;
case 0x04:key=1*4+i;break;
case 0x02:key=2*4+i;break;
case 0x01:key=3*4+i;break;
default:break;
}
switch(key)
{
case 0:temp=1;flay+=1;break;
case 1:temp=2;flay+=1;break;
case 2:temp=3;flay+=1;break;
case 3:temp=4;flay+=1;break;
case 4:temp=5;flay+=1;break;
case 5:temp=6;flay+=1;break;
case 6:temp=7;flay+=1;break;
case 7:temp=8;flay+=1;break;
case 8:temp=9;flay+=1;break;
case 9:temp=0;flay+=1;break;
case 10:{shemima=1;qing_0();}break; //上密码按键
case 11:queyan=1;break; //解密码按键
case 12:qing_0();break; //xx键
default:break;
}
}
t=(t<<1)|0x01;
}
}
else flag_key=0;
}
//////////////////////////////////上密码
void xianshi_led1(void)
{
if(flay<=6&&shemima==0)
{
if(flay==1)
{
a=temp;
dis_buff[5]=a;
}
if(flay==2)
{
b=temp;
dis_buff[4]=b;
}
if(flay==3)
{
c=temp;
dis_buff[3]=c;
}
if(flay==4)
{
d=temp;
dis_buff[2]=d;
}
if(flay==5)
{
e=temp;
dis_buff[1]=e;
}
if(flay==6)
{
f=temp;
dis_buff[0]=f;
}
}
}
////////////////////////////////////////////////解密码
void xianshi_led2(void)
{
if(shemima==1)
{
if(flay<=6)
{
if(flay==1)
{
a1=temp;
dis_buff[5]=a1;
}
if(flay==2)
{
b1=temp;
dis_buff[4]=b1;
}
if(flay==3)
{
c1=temp;
dis_buff[3]=c1;
}
if(flay==4)
{
d1=temp;
dis_buff[2]=d1;
}
if(flay==5)
{
e1=temp;
dis_buff[1]=e1;
}
if(flay==6)
{
f1=temp;
dis_buff[0]=f1;
}
}
}
}
///////////////////////////////////////////////
main()
{
while(1)
{
scanpay();
deplay_led();
xianshi_led1();
xianshi_led2();
if(queyan==1&&flay==6)
{
if(a==a1&&b==b1&&c==c1&&d==d1&&e==e1&&f==f1)
{
LED_REN=0;
}
else LED_YEN=0;
}
}
}