单片机按键密码锁源代码
时间:01-18 15:35 阅读:759次
*温馨提示:点击图片可以放大观看高清大图
简介:在这里和大家分享一个基于单片机按键密码锁的源代码。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define KeyPort P1
sbit Dula=P2^2; //段选
sbit Wela=P2^3; //位选
sbit Led =P2^0;
uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码
uchar code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码
uchar password[8];
uchar dis_smg[8];
bit Flag=0;
uchar KeyScan(void);
uchar KeyPro(void);
/**********************************************************************************
************************* 延 时 函 数 ******************************************
***********************************************************************************/
void delayus(uchar t)
{
while(--t);
}
void delayms(uchar t)
{
while(t--)
{
delayus(245);
delayus(245);
}
}
/**********************************************************************************
************************* 显 示 函 数 ******************************************
***********************************************************************************/
void Display(uchar Firstbit ,uchar Num)
{
static uchar i;
P0=0x00;
Dula=1;Dula=0;
P0=smg_we[i+Firstbit];
Wela=1;Wela=0;
P0=dis_smg[i];
Dula=1;Dula=0;
i++;
if(i==Num)
i=0;
}
/**********************************************************************************
*************************** 定时初始化 ******************************************
***********************************************************************************/
void Timer0_Init(void)
{
TMOD|=0X01;
TR0=1;
ET0=1;
EA=1;
}
/**********************************************************************************
************************* 设 置 密 码 ******************************************
***********************************************************************************/
void SetPassword(uchar KeyNum)
{
static uchar i=0;
uchar j,n;
uchar tempcode[8];
if((KeyNum>=0)&&(KeyNum<=9))
{
Led=1;
if(i==0)
{
for(j=0;j<8;j++)
tempcode[j]=0;
}
if(i<8)
{
tempcode[i]=smg_du[KeyNum];
for(j=0;j<=i;j++)
dis_smg[7-i+j]=tempcode[j];
}
i++;
if(i==8)
i=0;
}
if(KeyNum==15) //密码修改确认键
{
KeyNum=0xff;
for(n=0;n<8;n++)
{
password[n]=tempcode[n];
dis_smg[n]=0;
}
dis_smg[0]=0x3f;
dis_smg[1]=0x76;
Flag=0;
i=0; //静态变量清零,下次进入时可以从新开始
}
}
/**********************************************************************************
************************* 输 入 密 码 ******************************************
***********************************************************************************/
void KeyControl(uchar Keynum)
{
static uchar i=0;
uchar j;
uchar temp[8];
bit flag;
if((Keynum>=0)&&(Keynum<=9)) //数字输入按键
{
Led=0;
if(i==0)
{
for(j=0;j<8;j++)
dis_smg[j]=0;
}
if(i<8)
{
temp[i]=smg_du[Keynum];
for(j=0;j<=i;j++)
dis_smg[7-i+j]=temp[j];
}
i++;
if(i==8)
i=0;
}
if(Keynum==15) //确认键
{
Keynum=0xff;
flag=1;
for(j=0;j<8;j++)
{
flag=flag&&(temp[j]==password[j]);//比较八位密码数字是否全正确
dis_smg[j]=0;
}
if(flag)
{
dis_smg[0]=0x3f; // "o"
dis_smg[1]=0x73; // "p"
dis_smg[2]=0x79; // "E"
dis_smg[3]=0x37; // "n"
}
else
{
dis_smg[0]=0x79; // "E"
dis_smg[1]=0x50; // "r"
dis_smg[2]=0x50; // "r"
}
i=0; //清零,准备下次输入密码
}
if(Keynum==14) //修改密码键
{
Flag=1;
for(i=0;i<8;i++)
{
dis_smg[i]=0x40;
}
i=0; //静态变量清零,下次进入时可以从新开始
}
}
/**********************************************************************************
************************* 控 制 函 数 ******************************************
***********************************************************************************/
void Dominate(void)
{
uchar keynum;
keynum=KeyPro();
if(keynum!=0xff)
{
if(Flag==0)
KeyControl(keynum);
else
SetPassword(keynum);
}
}
/**********************************************************************************
************************* main 函 数 ******************************************
***********************************************************************************/
void main()
{
Timer0_Init();
while(1)
{
Dominate();
}
}
/**********************************************************************************
************************* 中断服务函数 ******************************************
***********************************************************************************/
void Timer0(void) interrupt 1
{
TH0=0XF8;
TL0=0X30; //2ms
Display(0,8);
}
/**********************************************************************************
************************* 按 键 扫 描(反复式扫描法) **************************
***********************************************************************************/
uchar KeyScan(void)
{
uchar cord_h,cord_l;
KeyPort=0x0f;
cord_l=KeyPort&0x0f;
if(cord_l!=0x0f)
{
delayms(10);
if((KeyPort&0x0f)!=0x0f)
{
cord_l=KeyPort&0x0f;
KeyPort=cord_l|0xf0;
cord_h=KeyPort&0xf0;
while((KeyPort&0xf0)!=0xf0);
return (cord_h+cord_l);
}
}return (0xff);
}
uchar KeyPro(void)
{
switch(KeyScan())
{
case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值
case 0x7d:return 1;break;//1
case 0x7b:return 2;break;//2
case 0x77:return 3;break;//3
case 0xbe:return 4;break;//4
case 0xbd:return 5;break;//5
case 0xbb:return 6;break;//6
case 0xb7:return 7;break;//7
case 0xde:return 8;break;//8
case 0xdd:return 9;break;//9
case 0xdb:return 10;break;//a
case 0xd7:return 11;break;//b
case 0xee:return 12;break;//c
case 0xed:return 13;break;//d
case 0xeb:return 14;break;//e
case 0xe7:return 15;break;//f
default:return 0xff;break;
}
}