大哥大姐们跪求“密码锁控制电路”的设计``小弟在此谢过了

[复制链接]
查看11 | 回复0 | 2008-4-14 19:21:55 | 显示全部楼层 |阅读模式
51单片机实现密码锁//设定密码为937602。P1口接4*4键盘,按下0-9中的6个数字,再按下确认键,//若密码正确绿灯亮,否则红灯亮。按下取消键会清除已经输入的所有数字//P0口接6个集成七段LED的a~g引脚,6个com脚分别接P2.0--P2.5 #include #define uchar unsigned char#define uint unsigned intuchar code dm[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar digbit;
// 字位uchar wordbuf[6];
// 字型码缓冲区uchar t1count; // 定时器1由50ms累积到1s所用的计数器uchar count;
// 密码位计数uchar pw[6];
// 初始密码存储区uchar pwbuf[6];
// 输入密码存储区bit enterflag;
// 确认键按下与否标志bit pwflag;
// 密码正确与否标志bit showflag;
// 数码管显示与否标志sbit green=P3^0;sbit red=P3^1;void delay(void){ uchar i; for (i=300;i>0;i--);}/* 键扫描函数 */uchar keyscan(void){ uchar scancode,tmpcode; P1 = 0xf0;
if ((P1&0xf0)!=0xf0)
{delay();
if ((P1&0xf0)!=0xf0)
{ scancode = 0xfe; while((scancode&0x10)!=0)
{
P1 = scancode;
if ((P1&0xf0)!=0xf0)
{
tmpcode = (P1&0xf0)|0x0f; /* 返回特征字节码,为1的位即对应于行和列 */
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<<1)|0x01;
}} } return(0);// 无键按下,返回值为0}void display(void){ uchar i; switch (digbit) {case 1:i=0; break;case 2:i=1; break;case 4:i=2; break;case 8:i=3; break;case 16: i=4; break;case 32: i=5; break;default:break; } P2 = 0x00;
P0 = dm[wordbuf];
P2 = digbit;
if (digbit<0x20)
digbit = digbit*2 ;
else
digbit = 0x01;}void time0_int(void) interrupt 1 {TH0 = -2000/256; TL0 = -2000%256; if (showflag==1)display();
}void time1_int(void) interrupt 3 { uchar k;TH1 = -50000/256; TL1 = -50000%256; if (t1count<20)
{t1count++; } else
// 计时到1s {TR1 = 0;
t1count = 0; green = 1;
red = 1;
showflag = 1;
digbit = 0x01;
for (k=0;k<6;k++) // 显示888888 wordbuf[k] = 8; }}/* 密码比较函数 */bit pwcmp(void){ bit flag; uchar i; for (i=0;i<6;i++) {if (pw==pwbuf) flag = 1;else{ flag = 0; i = 6;} } return(flag);}void main(){ uchar j,key;
P2 = 0x00;
TMOD = 0x11;
TH0 = -2000/256; TL0 = 2000%256; TH1 = -50000/256; TL1 = -50000%256;
TR0 = 1; ET0 = 1; TR1 = 0; ET1 = 1; EA = 1;
count = 0;// 初始没有输入密码,计数器设为0 enterflag = 0;// 没有按下确认键 pwflag = 0;// 密码标志先置为0
green = 1;
red = 1;
/* 假设内定密码为937602 */ pw[0] = 9; pw[1] = 3; pw[2] = 7; pw[3] = 6; pw[4] = 0; pw[5] = 2;digbit = 0x01;
/* 刚加电时,显示888888 */ for (j=0;j<6;j++)wordbuf[j] = 8; showflag = 1;
while(1)
{key = keyscan();
switch(key)
{
case 0x11:
if (count<6)
{ wordbuf[count] = 0x0f; // 对应密码位上显示“F” pwbuf[count] = 0; count++;
} break;case 0x21:
if (count<6)
{ wordbuf[count] = 0x0f;
pwbuf[count] = 1; count++;
} break;
case 0x41:
if (count<6)
{ wordbuf[count] = 0x0f;
pwbuf[count] = 2; count++;
} break;
case 0x81:
if (count<6)
{ wordbuf[count] = 0x0f;
pwbuf[count] = 3; count++;
} break;case 0x12:
if (count<6)
{ wordbuf[count] = 0x0f;
pwbuf[count] = 4; count++;
} break;case 0x22:
if (count<6)
{ wordbuf[count] = 0x0f;
pwbuf[count] = 5; count++;
} break;case 0x42:
if (count<6)
{ wordbuf[count] = 0x0f;
pwbuf[count] = 6; count++;
} break;case 0x82:
if (count<6)
{ wordbuf[count] = 0x0f;
pwbuf[count] = 7; count++;
} break;case 0x14:
if (count<6)
{ wordbuf[count] = 0x0f;
pwbuf[count] = 8; count++;
} break;case 0x24:
if (count<6)
{ wordbuf[count] = 0x0f;
pwbuf[count] = 9; count++;
} break;case 0x44:
enterflag = 1;
if (count==6)
pwflag = pwcmp();
else
pwflag = 0;
break;case 0x84:
count = 0;
for (j=0;j<6;j++) { wordbuf[j] = 8;
pwbuf[j] = 0x0f;// 用FFFFFF清除已经输入的密码
} break; default:break;}if (enterflag==1)// 如果按下确认键{ enterflag = 0;
count = 0;
for (j=0;j<6;j++)
pwbuf[j] = 0x0f;// 用FFFFFF清除已经输入的密码
showflag = 0;
TR1 = 1;
t1count = 0; // 定时器1由50ms累积到1s所用的计数器 if (pwflag==1)
green = 0;
else
red = 0;
} }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行