⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ref.c

📁 利用AT89C51单片机做主控单元实现电子密码锁功能
💻 C
字号:
#include "MATH.H"
#include "REG51.H"
#include "parameter.h"

void main  ()
{
unsigned char display(int i)  ;
unsigned char pick_8seg(int j);
unsigned char scan_key(void) ;
void delay(int k);
void display_words(int i);

 unsigned char my_code[4]={0x88,0x88,0x88,0x88}  ;   //初始密码
 unsigned char *qq,*p,receive_code[4]={0x0}, bb,dd    ; 
 int count,j,k,i ;


 count=0;
 qq=my_code;
 p=receive_code;
 k=0;i=0;
 P0=0x3f;
 P2=0x00; 
 j=0;

while (1)

 {  bb=scan_key();
 switch (bb)
 {
  case 0x88 :                     // 键盘数字“7”
  if ( j<4 )
   {
   P2=pick_8seg(j);
   P0=display(13);
   receive_code[j]=0x88;
      j++;
   }
   	  break;

   case 0x84 : 		               // 键盘数字“8”
  if ( j<4 )
   {
   P2=pick_8seg(j);
   P0=display(13);
   receive_code[j]=0x84;
    j++;
   }
   	break;


   case 0x82 : 		             // 键盘数字“9”
  if ( j<4 )
   {
   P2=pick_8seg(j);
   P0=display(13);
   receive_code[j]=0x82;
    j++;
	
   }
   break;

   case 0x48 : 		             // 键盘数字“4”
  if ( j<4 )
   {
   P2=pick_8seg(j);
   P0=display(13);
   receive_code[j]=0x48;
      j++;
	
   }
   break;

   case 0x44 : 		           // 键盘数字“5”
  if ( j<4 )
   {
   P2=pick_8seg(j);
   P0=display(13);
   receive_code[j]=0x44;
      j++;
	
   }
   break;
					          // 键盘数字“6”
   case 0x42 : 
  if ( j<4 )
   {
   P2=pick_8seg(j);
   P0=display(13);
   receive_code[j]=0x42;
      j++;
	  
   }
   break;

   case 0x28 : 		         // 键盘数字“1”
  if ( j<4 )
   {
   P2=pick_8seg(j);
   P0=display(13);
   receive_code[j]=0x28;
      j++;
	  
   }
   break;

   case 0x24 : 			     // 键盘数字“2”
  if ( j<4 )
   {
   P2=pick_8seg(j);
   P0=display(13);
   receive_code[j]=0x24;
      j++;
	  
   }
   break;

   case 0x22 : 		         // 键盘数字“3”
  if ( j<4 )
   {
   P2=pick_8seg(j);
   P0=display(13);
   receive_code[j]=0x22;
      j++;
	  
   }
   break;

						   // 键盘数字“0”
   case 0x14 : 
  if ( j<4 )
   {
   P2=pick_8seg(j);
   P0=display(13);
   receive_code[j]=0x14;
      j++;
	  
   }
   break;

  case 0x18:				//键盘字符“ON/C”	,表示输入密码确认键
  for ( i=0;i<4;i++ )
  {
  if( *( p+i )==*( qq+i )  )          //输入密码和原密码的比较
    count++;
  }

if (count==4)                       
  {
for (i=0;i<2000;i++)
	{
	P3_6=0;	
    display_words(0);			      //若输入正确,则显示“YES”表示密码输入正确
	P3_6=0;
		 
	}
	P2=0xff;//P0=0x3f;
	P3_6=1;
	j=0;
	count=0;
	for (i=0;i<4;i++)
	{
	*(p+i)=0x0;
	}
	}
   
else
  {
  if ( k<3 )  
  {for( i=0;i<300;i++   )    
    {
	display_words(1);		            //若输入错误则显示“ERROR”表示密码输入错误
	}
  for ( i=0;i<500;i++)
    {
	display_words(k+2);		    //用“NO 2”和“NO 3”提示第二次和第三次密码输入
	}
	//i=0;
	j=0;
	P2=0xff;
	//P0=0x3f;
	k++;
	count=0;
	}
	
   }
   if(k==3)
	 {	
	  while(1)
	   {
	   P3_7=0;
	   delay(10);
	   P3_7=1;
	   delay(10);
	   //display_words(4);    //若第三次密码还输入错误,则用“DEAD”显示禁止进入系统
	   P3_7=0;
	   delay(10);
	   P3_7=1;
	   delay(10);
	   }
	  
	 }
	break;

  case 0x21:           //键盘字符“-”表示前一位密码输入错误,重新输入前一位密码
     if (j<5)
      { j=j-1;
	  if(j!=-1)
	   {
	   P2=pick_8seg(j-1);
	   P0=display(13);
	   }
	  if (j==-1)
	   {
	   P2=0xff;
	   j=j+1;
	   }
	  
	  }
	 
   break;

  case 0x11 :              	// 键盘字符“+”表示新密码设定
    P2=0x00;
	P0=0x3f;
     while (1)
	 {
	 dd=scan_key();
	  
	if  ( (dd!=0x18)&&(dd!=0x21)&&(dd!=0x12)&&(dd!=0x11)&&(dd!=0)&&(j<4)  )
	   {
	   	my_code[j]=dd;
		P2=pick_8seg(j);
	    P0=display(13);
		j++;
	   }
	 if(dd==0x21)
	   {
	   if (j<5)
      {
	   j=j-1;
	   P2=pick_8seg(j-1);
	   P0=display(13);
	  }
	   }

	 if(dd==0x12)
	   { 
	  for (i=1;i<5-j;i++)
	   {  
	     j=j-1;
	     my_code[j+i]=0x0;
		 j=j+1;
	   }  
	   j=0;
	   break;
	   }
	   }
   //break;

 case 0x12:          //键盘字符“=”表示新密码已经确认
   j=0;
   P2=0xff;
 break;

default :break;

   }
 }
}




void delay(int k)	        //延时子程序
{
int i;
for(i=0;i<k;i++)
   ;
   
}


#include "REG51.H"
unsigned char display(int ii)
{
//unsigned char display_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x79,0x31,0x3e,0x6e,0x6d}; 

switch (ii)
{
case 0  :return (0x3f); break;	 //"0"
case 1  :return(0x06); break;	 //"1"
case 2  :return(0x5b); break;	//"2"
case 3  :return(0x4f); break;	 //"3"
case 4  :return(0x66); break;	//"4"
case 5  :return(0x6d); break;	 //"5"
case 6  :return(0x7d);  break;	 //"6"
case 7  :return(0x07);  break;	 //"7"
case 8  :return(0x7f);  break;	  //"8"
case 9  :return(0x6f);  break;	 //"9"
case 10 :return(0x77);  break;	 //"A"
case 11 :return(0x79);	break; //"E"
case 12 :return(0x31);	break;	//"r"
case 13 :return(0x3e);	break;	 //"u"
case 14 :return(0x6e);	break; //"Y"
case 15 :return(0x6d);	break;	//"s"
case 16 :return(0x37);  break;	 //"n"
case 17 :return (0x5e); break;	 //"d"
case 18 :return (0x7b); break;	  //"e"


default :  break;
}
}

unsigned char pick_8seg(int jj)
{
switch (jj)
 {
  case 0  :return(0xfe);  break;
  case 1  :return(0xfc);  break;
  case 2  :return(0xf8);  break;
  case 3  :return(0xf0);  break;
  case 4  :return(0xe0);  break;
  case 5  :return(0xc0);  break;
  case 6  :return(0x80);  break;
  case 7  :return(0x00);  break;
default :  break;
 }
}

void display_words(int i)
{
unsigned char display(int ii)  ;
void delay(int k)	;

switch(i)
  {
  case 0:                  //显示"yes"	 字符,表示输入密码正确
    P2= 0xfe;
    P0=display(14);
	delay(30);
	P2=0xfd;
    P0= display(11);
	delay(30);
	P2=0xfb;
    P0= display(15);
	delay(30);
	break;

  case 1:                    //显示“error”  字符,表示输入密码错误
    P2=0xfe;
    P0=display(11);
	delay(30);
	P2=0xfd;
	P0=display(12);
	delay(30);
	P2=0xfb;
	P0=display(12);
	delay(30);
	P2=0xf7;
	P0=display(0);
	delay(30);
	break;
  case 2:	                  //显示“NO 2”表示第二次输入密码
	P2=0xfe;
    P0=display(16);
	delay(30);
	P2=0xfd;
	P0=display(0);
	delay(30);
	P2=0xf7;
	P0=display(2);
	delay(30);
	break;
  case 3 :	                  //显示“NO 3 ”表示第三次输入密码
	P2=0xfe;
    P0=display(16);
	delay(30);
	P2=0xd;
	P0=display(0);
	delay(30);
	P2=0xf7;
	P0=display(3);
	delay(30);
	break;
  case 4 :	                   //显示“DEAD”表示密码输入错误,禁止进入系统
    P2=0xfe;
	P0=display(17);
	delay(30);
	P2=0xfd;
	P0=display(11);
	delay(30);
	P2=0xfb;
	P0=display(10);
	delay(30);
	P2=0xf7;
	P0=display(17);
	delay(30);
	break;

	default :break;
	}

}


#include "REG51.H"
unsigned char scan_key(void)      //键扫描程序
{
void delay(int k)  ;
unsigned char a,b,c; 

//while (1)

P1=0xf0;
if (  ( P1&0xf0 )!=0xf0  )	
 { 
  //delay(5);
    if (  ( P1&0xf0 )!=0xf0  )
	  {
	   a=0xfe;
	   while(  ( a&0x10 ) !=0 )
	     {
		  P1=a;
		  if (  ( P1&0xf0 )!=0xf0  )
		  {	   c=P1;
		  while((P1&0xf0 )!=0xf0 ) ;
		  b=(c&0xf0 )|0x0f;
		  return ( (~a)+(~b) );
		  }
		  else a=( a<<1 )|0x01;
		 }
	  }
 }
  else return (0);
  }

  

#include "REG51.H"
#ifndef __parameter_h__
#define __parameter_h__

sbit P3_0= P3^0	;
sbit P3_1= P3^1	;
sbit P3_6= P3^6	 ;
sbit P3_7= P3^7	;


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -