单片机按键密码锁源代码
          
            时间:01-18 15:35 阅读:880次
*温馨提示:点击图片可以放大观看高清大图
                
         
        
		  
               简介:在这里和大家分享一个基于单片机按键密码锁的源代码。
               
                        
          
            #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;
  }
}