不好意思啊兄弟只能先把你写到这里了 跟真实的密码锁功能上相差甚远
不过应该满足了你的要求
还有之前你要求的3*3键盘只有9个数字 但是0~9是十个数字所以键盘我改成了4*3的
上电后显示000

确认按下小灯亮

//2013/6/16 待完善
//3*4矩阵键盘简单密码锁控制
//使用上电默认显示000
// uchar D[ ]={1,1,1}; //设定密码
//74HC573做驱动
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define date P1
sbit wei=P3^0;
sbit duan=P3^1;
sbit h1=P1^0;
sbit h2=P1^1;
sbit h3=P1^2;
sbit h4=P1^3; //行信号
uchar keynum;
uchar num;
uchar D[ ]={1,1,1}; //设定密码
uchar code table[]={0xc0,0xf9,0xa4,
0x0b0,0x99,0x92,
0x82,0xf8,0x80,0x90, //0~9段码
0XFF,0XFF}; //确认键/取消键 关闭显示
void delay()
{
uchar i,j;
for(j=10;j>0;j--)
for(i=33;i>0;i--);
}
void delayms(uint x)
{
uchar i;
for(i=x;i>0;i--)
delay();
}
void initshuma()
{
wei=1;
P0=0x07;
wei=0;
duan=1;
P0=table[0];
duan=0;
}
void keyscan_time0() interrupt 1 //几十个ms扫描一次键盘
{
TR0=0;
date=0X0F;
if((date&0x0F)!=0x0F)
delayms(10);
if((date&0x0F)!=0x0F)
{
date=0x3f; //1
if(h1==0)
{
while(h1==0);
keynum=0;
num++;
}
if(h2==0)
{
while(h2==0);
keynum=3;
num++;
}
if(h3==0)
{
while(h3==0);
keynum=6;
num++;
}
if(h4==0)
{
while(h4==0);
keynum=9;
num++;
}
date=0x5f; //2
if(h1==0)
{
while(h1==0);
keynum=1;
num++;
}
if(h2==0)
{
while(h2==0);
keynum=4;
num++;
}
if(h3==0)
{
while(h3==0);
keynum=7;
num++;
}
if(h4==0)
{
while(h4==0);
keynum=10;
num++;
}
date=0x6F; //3
if(h1==0)
{
while(h1==0);
keynum=2;
num++;
}
if(h2==0)
{
while(h2==0);
keynum=5;
num++;
}
if(h3==0)
{
while(h3==0);
keynum=8;
num++;
}
if(h4==0)
{
while(h4==0);
keynum=11;
num++;
}
if(num>5)
num=1;
switch(num)
{
case 1: wei=1;
P0=0x01;
wei=0;
break;
case 2: wei=1;
P0=0x02;
wei=0;
break;
case 3: wei=1;
P0=0x04;
wei=0;
break;
default: break;
}
duan=1;
P0=table[keynum];
duan=0;
}
TR0=1;
TH0=(65536-100)/256;
TL0=(65536-100)%6;
}
void main()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%6;
TR0=1;
keynum=0xff; //初始化键值
initshuma();
while(1)
{
while(!((num==1)&(keynum==D[0])));
while(!((num==2)&(keynum==D[1])));
while(!((num==3)&(keynum==D[2]))); //与设定密码比较是否相同
while(!(keynum==10)); //确认键
P2=0XFE;
while(!(keynum==11)); //取消键
P2=0XFF;
}
}