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

📄 mi2.c

📁 数字万年历”的软件和硬件设计 软件环境:KEIL C集成环境
💻 C
字号:
#include <reg51.h>
#include <intrins.h>

typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ; 
sbit rs	= P2^0;		//
sbit rw = P2^1;
sbit ep = P2^2;
bit codeflag=0,nameflag=0;
BYTE code diskey[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
BYTE  namein[4]={0};
BYTE  namesave[4][4]={1,1,9,0,
                               2,2,2,2,
							   4,2,2,5,
							   8,0,0,5};
BYTE numb=0,card=0;
BYTE OP_READ;
BYTE OP_WRITE;

sbit SCL=P1^0;
sbit SDA=P1^1;
BYTE newcode1[6],newcode2[6];
BYTE  codein[6]={0};
BYTE  codesave[6]={0}; 
        
BYTE code dis1[] = {"DATE:2006/08/30"};
BYTE code dis2[] = {"TIME:12:30   MON"};
BYTE code dis3[] = {"NAME:----    -C-"};
BYTE code dis4[] = {"CODE:------     "};
BYTE code dis5[] = {"   --RIGHT--    "};
BYTE code dis6[] = {"    --WRONG--   "};
BYTE code dis7[] = {"OPEN DOOR    -F-"};
BYTE code dis8[] = {"CHANGE CODE  -E-"};
BYTE code dis9[] = {"   -WELCOME-    "};
BYTE code dis10[] = {"  ---SUCCESS--- "};
BYTE code dis11[] = {"NEW CODE:------ "};
BYTE code dis12[] = {"OPEN DOOR    -F-"};
BYTE code dis13[] = {"EXIT         -B-"};
BYTE code dis15[] = {"  --THANKS--    "};
BYTE code dis14[] = {"  ---GOODBYE--- "};
BYTE code dis16[] = {"  ERROR & BACK  "};

name_in();
code_in();
newcode_in2();
newcode_in1();
namecomp();
codecomp();
newcodecomp();
void delayms(BYTE ms);
main();


delay(BYTE ms)
{							// 延时子程序
	BYTE i;
	while(ms--)
	{
		for(i = 0; i< 250; i++)
		{
			_nop_();
			_nop_();
			_nop_();
			_nop_();
		}
	}
}

BOOL lcd_bz()
{							// 测试LCD忙碌状态
	BOOL result;
	rs = 0;
	rw = 1;
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	result = (BOOL)(P0 & 0x80);
	ep = 0;
	return result;	
}

lcd_wcmd(BYTE cmd)
{							// 写入指令数据到LCD
	while(lcd_bz());
	rs = 0;
	rw = 0;
	ep = 0;
	_nop_();
	_nop_();	
	P0= cmd;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 0;		
}

lcd_pos(BYTE pos)
{							//设定显示位置
	lcd_wcmd(pos | 0x80);
}

lcd_wdat(BYTE dat)	
{							//写入字符显示数据到LCD
	while(lcd_bz());
	rs = 1;
	rw = 0;
	ep = 0;
	P0 = dat;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ep = 0;	
}

lcd_init()
{							//LCD初始化设定
	lcd_wcmd(0x38);			//
	delay(1);
	lcd_wcmd(0x0c);			//
	delay(1);
	lcd_wcmd(0x06);			//
	delay(1);
	lcd_wcmd(0x01);			//清除LCD的显示内容
	delay(1);
}

void xianshi1()
{BYTE i=0;
  lcd_pos(0);
	while(dis1[i] != '\0')
	{						
		lcd_wdat(dis1[i]);
		i++;
	}
	lcd_pos(0x40);			
	i = 0;
	while(dis2[i] != '\0')
	{
		lcd_wdat(dis2[i]);	
		i++;
	}
delay(1000);	
}

void xianshi2()
{BYTE i=0;
  lcd_pos(0);
	while(dis3[i] != '\0')
	{						
		lcd_wdat(dis3[i]);
		i++;
	}
  lcd_pos(0x40);			
	i = 0;
	while(dis4[i] != '\0')
	{
		lcd_wdat(dis4[i]);	
		i++;
	}
delay(1000);	
}
void xianshi3()
{BYTE i=0;
   lcd_init();
   lcd_pos(0x40);
	while(dis5[i] != '\0')
	{						
		lcd_wdat(dis5[i]);
		i++;
	}
	delay(1000);
	}

	
	void xianshi6()
{BYTE i=0;
   lcd_init();
   lcd_pos(0x40);
	while(dis6[i] != '\0')
	{						
		lcd_wdat(dis6[i]);
		i++;
	}
	delay(1000);
	}

void xianshi5()
{BYTE i=0;
     lcd_pos(0);
	while(dis7[i] != '\0')
	{						
		lcd_wdat(dis7[i]);
		i++;
	}
	lcd_pos(0x40);			
	i = 0;
	while(dis8[i] != '\0')
	{
		lcd_wdat(dis8[i]);	
		i++;
	}
delay(1000);	
}

void xianshi4()
{BYTE i=0;
  lcd_pos(0);
	while(dis12[i] != '\0')
	{						
		lcd_wdat(dis12[i]);
		i++;
	}
	lcd_pos(0x40);			
	i = 0;
	while(dis13[i] != '\0')
	{
		lcd_wdat(dis13[i]);	
		i++;
	}	
}	
void xianshi10()
{BYTE i=0;
   lcd_init();
   lcd_pos(0x40);
	while(dis16[i] != '\0')
	{						
		lcd_wdat(dis16[i]);
		i++;
	}
	delay(1000);
	}


void xianshi7()
{BYTE i=0;
   lcd_init();
   lcd_pos(0x40);
	while(dis4[i] != '\0')
	{						
		lcd_wdat(dis4[i]);
		i++;
	}
	delay(1000);
	}

void xianshi8()
{BYTE i=0;
   lcd_init();
   lcd_pos(0x40);
	while(dis10[i] != '\0')
	{						
		lcd_wdat(dis10[i]);
		i++;
	}
	delay(1000);
	}

	void xianshi9()
{BYTE i=0;
   lcd_init();
   lcd_pos(0x40);
	while(dis9[i] != '\0')
	{						
		lcd_wdat(dis9[i]);
		i++;
	}
	delay(1000);
	}

start()
// 开始位
{
	SDA = 1;
	SCL = 1;
	_nop_();
	_nop_();
	SDA = 0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SCL = 0;
}

 stop()
// 停止位
{
	SDA = 0;
	_nop_();
	_nop_();
	SCL = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SDA = 1;
}
 shin()
// 从AT24Cxx移入数据到MCU
{
	BYTE i,read_data;
	for(i = 0; i < 8; i++)
	{
		SCL = 1;
		read_data <<= 1;
		read_data |= (BYTE)SDA;
		SCL = 0;
	}
	return(read_data);
}

shout(BYTE write_data)
// 从MCU移出数据到AT24Cxx
{
	BYTE i;
	bit ack_bit;
	for(i = 0; i < 8; i++)		// 循环移入8个位
	{
		SDA = (bit)(write_data & 0x80);
		_nop_();
		SCL = 1;
		_nop_();
		_nop_();
		SCL = 0;
		write_data <<= 1;
	}
	SDA = 1;			// 读取应答
	_nop_();
	_nop_();
	SCL = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ack_bit = SDA;
	SCL = 0;
	return ack_bit;			// 返回AT24Cxx应答位
}

void write_byte(BYTE addr, BYTE write_data)
// 在指定地址addr处写入数据write_data
{
	start();
	shout(OP_WRITE);
	shout(addr);
	shout(write_data);
	stop();
	delayms(10);		// 写入周期
}



BYTE read_current()
// 在当前地址读取
{
	BYTE read_data;
	start();
	shout(OP_READ);
	read_data = shin();
	stop();
	return read_data;
}

BYTE read_random(BYTE random_addr)
// 在指定地址读取
{
	start();
	shout(OP_WRITE);
	shout(random_addr);
	return(read_current());
}

void delayms(BYTE ms)	
// 延时子程序
{
	BYTE i;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}
}



/************************************************************
键盘扫描及取键值程序
BYTE getkeyin(void)
功能:键值放入keyin。
*************************************************************/

BYTE getkeyin(void)
{BYTE keyin;
 BYTE temp,i;
 P3=0x0f; 
 temp=P3;
 if(temp==0x0f)
   {
    keyin=0xff;
    }
   
 
  if(temp!=0x0f)
    {          //按键有松开过 

       for(i=10;i>0;i--);     //键盘去抖延迟
          P3=0xef;         //P1^4=0
         temp=P3;
         temp=temp&0x0f;
         if (temp!=0x0f)
           {             
            switch(temp)
                {
                  case 0x0e:keyin=0x0f;
                   	    break;   //keyin='a'
    		  case 0x0d:keyin=0x0b;
                          break;   //keyin='b'
    		  case 0x0b:keyin=8;break;   //keyin='c'
    		  case 0x07:keyin=4;break;   //keyin='d'
    		 }
 
             return keyin;
           }

       P3=0xdf;         //P1^5=0
      temp=P3;
      temp=temp & 0x0f;
   if (temp!=0x0f)
       {
         switch(temp)
           {
      		case 0x0e:keyin=0x0e;
			   break;    //keyin='3'
    		case 0x0d:keyin=0x0a;
			   break;    //keyin='6'
   		case 0x0b:keyin=7;break;    //keyin='9'
    	case 0x07:keyin=3;break;   //keyin='f'
   	   }
 		return keyin;             
 	}

     P3=0xbf;         //P1^6=0
     temp=P3;
     temp=temp & 0x0f;              
    if (temp!=0x0f)
      {
  	switch(temp)
	   {
    		case 0x0e:keyin=0x0d;break;    //keyin='2'
    		case 0x0d:keyin=0;break;    //keyin='5'
    		case 0x0b:keyin=6;break;    //keyin='8'
    		case 0x07:keyin=2;break;       //keyin='0'
  	    }
   		return keyin ;              
      }
	P3=0x7f;         //P1^7=0
	temp=P3;
	temp=temp & 0x0f;
	if (temp!=0x0f)
	{
  	  switch(temp)
           {
    		case 0x0e:keyin=0x0c;break;    //keyin='1'
    		case 0x0d:keyin=9;break;    //keyin='4'      
    		case 0x0b:keyin=5;break;    //keyin='7'
    		case 0x07:keyin=1;break;   //keyin='e'
  	    }             

   return keyin;
   
   }
   }
keyin=0x20;    
}



name_in()
{BYTE i=0x12,j=4;
   	         	// 初始化LCD			    
	 	while(1)
	{ 
     P3=0x0f;
     if((P3!=0x0f))
       delay(12);
	  if(P3!=0x0f)
   {  i=getkeyin();
        P3=0x0f; 
	while(P3!=0x0f)
         {} 
   if((i>=0)&&(i<=9))
      j++;
 
		}
  
  if((i>=0)&&(i<=9))
    { 
     lcd_pos(j);
	 lcd_wdat(diskey[i]);
	 namein[j-5]=i;}

		  
     delay(10);  

 	 if(j==8)break; 
	}
if(namecomp()) 
code_in();

}


code_in()

{
    BYTE i=0x12,j=0x44,jian,k=0;
   			// 初始化LCD			
	delay(10);
    
 	while(1)
	{
       P3=0x0f;
     if((P3!=0x0f))
       delay(12);
	  if(P3!=0x0f)
   {  i=getkeyin();
    P3=0x0f; 
	while(P3!=0x0f)
         {} 
  if((i>=0)&&(i<=9))
  {j++;
  k++;}
  
		}
  
if((i>=0)&&(i<=9))

    { 
      lcd_pos(j);
	 lcd_wdat(0x2a);
	 codein[k-1]=i;
	}	  
     delay(10);  
  if(j==0x4a)
   {delay(500);
     break;}
	}
  if(codecomp())
   {xianshi3();	
  ef:   
    xianshi5();
	delay(1000);
	 P3=0x0f; 
	while(P3==0x0f)
         {} 
    jian=getkeyin();
		 P3=0x0f; 
	while(P3!=0x0f)
         {} 
 if(jian==0x0f)   //xiaodou
   xianshi9();
 else if(jian==0x0e)
   newcode_in1();
   else 
   goto ef;
   }
  	
else {xianshi6();
  xianshi7();
  code_in();}
}

namecomp()
{BYTE i,j,k=0;
bit flag;
for(j=0;j<4;j++)
for(i=0;i<4;i++)
{ if(namein[i]!=namesave[j][i])
   {flag=0;
   break;}
   else
   { k++;
   if(k==4)
   numb=j;}
  }
   if(k==4)
   {flag=1;
  
   }
 if(flag==1)
 return 1;
 if(flag==0)
 return 0;

}


codecomp()
{BYTE i,k=0,n=0;
bit flag;
   for(i=0;i<6;i++)
{OP_READ=0xa1;	
 OP_WRITE=0xa0;	
n=6*numb;
codesave[i]=read_random(n);
n++;
}
 for(i=0;i<6;i++)
    { if(codein[i]!=codesave[i])
     {flag=0;
     break;}
     else k++;
     }
    if(k==6)flag=1;
   if(flag==1)
   return 1;
   if(flag==0)
   return 0;
}

newcode_in1()

{
    BYTE i=0x12,j=0x44,k=0;
   	  xianshi7();		// 初始化LCD			
	delay(10);
    
 	while(1)
	{  P3=0x0f;
        if((P3!=0x0f))
           delay(12);
	    if(P3!=0x0f)
          {  i=getkeyin();
            P3=0x0f; 
	       while(P3!=0x0f)
                {} 
           if((i>=0)&&(i<=9))
            { j++;
             k++;}
  
	      }
  
     if((i>=0)&&(i<=9))
	 
         {   lcd_pos(j);
	       lcd_wdat(0x2a);
	       newcode1[k-1]=i;
	
	     }
        
     delay(10);  
	 if(j==0x4a)
	    {delay(500);
          break;}

}

newcode_in2();
}

newcode_in2()

{
    BYTE i=0x12,j=0x44,k=0,jian;
   	  xianshi7();		// 初始化LCD			
	delay(10);
    
 	while(1)
	{  P3=0x0f;
        if((P3!=0x0f))
           delay(12);
	    if(P3!=0x0f)
          {  i=getkeyin();
            P3=0x0f; 
	       while(P3!=0x0f)
                {} 
           if((i>=0)&&(i<=9))
            { j++;
             k++;}
  
	      }
  
     if((i>=0)&&(i<=9))
	  
         {   lcd_pos(j);
	       lcd_wdat(0x2a);
	       newcode2[k-1]=i;
	
	     }
       
     delay(10);  
        if(j==0x4a)
		 {delay(500);
          break;}
       
    }

 


    if(newcodecomp())
       {
	     
	       xianshi8();
	  bf:  xianshi4();
       	   delay(1000);
	     jian=getkeyin();
	       P3=0x0f; 
	    while(P3==0x0f)
         {} 
          jian=getkeyin();
		   P3=0x0f; 
	      while(P3!=0x0f)
             {} 
        if(jian==0x0f)   //xiaodou
         { xianshi9();
		   delay(10);
		   xianshi1();}
        else if(jian==0x0b)
             main();
	      else goto bf;
		  }
    else 
	{ xianshi10(); 
	  newcode_in1();   
     }
}
newcodecomp()
{BYTE i,n,k=0;
bit flag;
for(i=0;i<6;i++)
 { if(newcode1[i]!=newcode2[i])
   {flag=0;
     break;}
   else k++;
   }
   if(k==6)flag=1;
 if(flag==1)
  {    for(k=0;k<6;k++)
	      {OP_READ=0xa1;	
	     OP_WRITE=0xa0;	
         n=6*numb;
	     write_byte(n,newcode1[k]);
	       }
 return 1;}
 if(flag==0)
 return 0;
}



main()
{BYTE jian,j,n=0,k=0;
 
	SDA = 1;
	SCL = 1;
	lcd_init();

  hui:  xianshi1();

   jian=getkeyin();
   if(jian==0x0a)
  {xianshi2();
  delay(500);
  name_in();}
  goto hui;
}

⌨️ 快捷键说明

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