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

📄 1602.c

📁 单片机密码锁c程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			for(i=0;i<16;i++)
			{
				write_1602dat(Error[i]);	
			}
		}
		else
		{
			//DisplayListChar(0,1,start_line);	
			write_1602com(er);
			for(i=0;i<16;i++)
			{
				write_1602dat(start_line[i]);	
			}
		}
	}
}

void DisplayInput(void)
{
	unsigned char i;
	if(CorrectCont==1)
	{
		//DisplayListChar(0,0,Input);
		write_1602com(er);
		for(i=0;i<16;i++)
		{
			write_1602dat(Input[i]);	
		}
	}
}


//========================重置密码==================================================
//==================================================================================
void ResetPassword(void)
{
	unsigned char i;	
	unsigned char j;
	if(pass==0)
	{
		pass=0;
		DisplayChar();
		ThreeAlam();
	}
	else
	{
    	if(ReInputEn==1)
		{
			if(N==6)
			{
				ReInputCont++;				
				if(ReInputCont==2)
				{
					for(i=0;i<6;)
					{
						if(TempPassword[i]==InputData[i])	//将两次输入的新密码作对比
							i++;
						else
						{
							//DisplayListChar(0,1,Error);
							write_1602com(er);
							for(j=0;j<16;j++)
							{
								write_1602dat(Error[j]);	
							}
							ThreeAlam();			//错误提示	
							pass=0;
							ReInputEn=0;			//关闭重置功能,
							ReInputCont=0;
							DisplayChar();
							break;
						}
					} 
					if(i==6)
					{
						//DisplayListChar(0,1,ResetOK);
						write_1602com(er);
						for(j=0;j<16;j++)
						{
							write_1602dat(ResetOK[j]);	
						}

						TwoAlam();				//操作成功提示
					 	WrToROM(TempPassword,0,6);		//将新密码写入24C02存储
						ReInputEn=0;
					}
					ReInputCont=0;
					CorrectCont=0;
				}
				else
				{
					OneAlam();
					//DisplayListChar(0, 1, again); 		//显示再次输入一次
					write_1602com(er);
					for(j=0;j<16;j++)
					{
						write_1602dat(again[j]);	
					}					
					for(i=0;i<6;i++)
					{
						TempPassword[i]=InputData[i];		//将第一次输入的数据暂存起来						
					}
				}

			N=0;						//输入数据位数计数器清零
		   }
	    }
	}

}



//=======================输入密码错误超过三过,报警并锁死键盘======================
void Alam_KeyUnable(void)
{
	P1=0x00;
	{
		ALAM=~ALAM;
		Delay5Ms();
	}
}


//=======================取消所有操作============================================
void Cancel(void)
{	
	unsigned char i;
	unsigned char j;
	//DisplayListChar(0, 1, start_line); 
	write_1602com(er);
	for(j=0;j<16;j++)
	{
		write_1602dat(start_line[j]);	
	}
	TwoAlam();				//提示音
	for(i=0;i<6;i++)
	{
		InputData[i]=0;
	}
	KEY=1;					//关闭锁
	ALAM=1;					//报警关
	operation=0;			//操作标志位清零
	pass=0;					//密码正确标志清零
	ReInputEn=0;			//重置输入充许标志清零
	ErrorCont=0;			//密码错误输入次数清零
	CorrectCont=0;			//密码正确输入次数清零
	ReInputCont=0;			//重置密码输入次数清零 
	open_led=1;
	s3_keydown=0;
	key_disable=0;
	N=0;					//输入位数计数器清零
}


//==========================确认键,并通过相应标志位执行相应功能===============================
void Ensure(void)
{	
	unsigned char i,j;
	RdFromROM(CurrentPassword,0,6); 					//从24C02里读出存储密码
    if(N==6)
	{
	    if(ReInputEn==0)							//重置密码功能未开启
		{
			for(i=0;i<6;)
   			{					
				if(CurrentPassword[i]==InputData[i])
				{
					i++;
				}
				else 
				{			
					ErrorCont++;
					if(ErrorCont==3)			//错误输入计数达三次时,报警并锁定键盘
					{
						write_1602com(er);
						for(i=0;i<16;i++)
						{
							write_1602dat(Error[i]);	
						}
						do
						Alam_KeyUnable();
						while(1);
					}
					else
					{
						TR0=1;				//开启定时
						key_disable=1;			//锁定键盘
						pass=0;
						break;
					}
				}
			}

			if(i==6)
			{
				CorrectCont++;
				if(CorrectCont==1)				//正确输入计数,当只有一次正确输入时,开锁,
				{
					//DisplayListChar(0,1,LockOpen);
					write_1602com(er);
					for(j=0;j<16;j++)
					{
						write_1602dat(LockOpen[j]);	
					}
					TwoAlam();			//操作成功提示音
					KEY=0;											//开锁
					pass=1;											//置正确标志位
					TR0=1;											//开启定时
					open_led=0;										//开锁指示灯亮
					for(j=0;j<6;j++)								//将输入清除
					{
						InputData[i]=0;
					}
				}	
				else												//当两次正确输入时,开启重置密码功能
				{
					//DisplayListChar(0,1,SetNew);
					write_1602com(er);
					for(j=0;j<16;j++)
					{
						write_1602dat(SetNew[j]);	
					}
					TwoAlam();									    //操作成功提示
					ReInputEn=1;									//允许重置密码输入
					CorrectCont=0;									//正确计数器清零
				}
	  		}
	
			else			//=========================当第一次使用或忘记密码时可以用131420对其密码初始化============
			{
				if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0))
		  	 	{
					WrToROM(initpassword,0,6); 				//强制将初始密码写入24C02存储
					//DisplayListChar(0,1,initword);			//显示初始化密码
					write_1602com(er);
					for(j=0;j<16;j++)
					{
						write_1602dat(initword[j]);	
					}
					TwoAlam();
					Delay400Ms();
					TwoAlam();
					N=0;
				}
				else
				{
					//DisplayListChar(0,1,Error);
					write_1602com(er);
					for(j=0;j<16;j++)
					{
						write_1602dat(Error[j]);	
					}
 					ThreeAlam();										//错误提示音
					pass=0;	
				}
			}
		}

		else											//当已经开启重置密码功能时,而按下开锁键,
		{
			//DisplayListChar(0,1,Er_try);
			write_1602com(er);
			for(j=0;j<16;j++)
			{
				write_1602dat(Er_try[j]);	
			}
			ThreeAlam();
		}
	}

	else
	{
		//DisplayListChar(0,1,Error);
		write_1602com(er);
		for(j=0;j<16;j++)
		{
			write_1602dat(Error[j]);	
		}

 		ThreeAlam();										//错误提示音
		pass=0;	
	}
	
	N=0;													//将输入数据计数器清零,为下一次输入作准备

	operation=1;
}


//==============================主函数===============================
void main(void)
{
 	unsigned char KEY,NUM;
	unsigned char i,j;
 	P1=0xFF; 
	TMOD=0x11;
 	TL0=0xB0;
 	TH0=0x3C;
 	EA=1;
 	ET0=1;	
 	TR0=0;
 	Delay400Ms(); 	//启动等待,等LCM讲入工作状态
 	lcd_init(); 	//LCD初始化
	write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示
	for(i=0;i<16;i++)
	{
		write_1602dat(name[i]);//向液晶屏写日历显示的固定符号部分
	}
	write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示
	for(i=0;i<16;i++)
	{
		write_1602dat(start_line[i]);//写显示时间固定符号,两个冒号
	}
	write_1602com(er+9);	//设置光标位置
	write_1602com(0x0f);	//设置光标为闪烁
 	Delay5Ms(); //延时片刻(可不要)

 	N=0;														//初始化数据输入位数
 	while(1)
 	{
		if(key_disable==1)
			Alam_KeyUnable();
		else
			ALAM=1;								//关报警

		KEY=keynum();
		if(KEY!=0)
		{	
			if(key_disable==1)
			{
				second=0;
			}
			else
			{
				NUM=coding(KEY);
				{
					switch(NUM)
					{
						case ('A'): 	; 					break;
						case ('B'):		;     				break;
						case ('C'): 	; 					break;
						case ('D'): ResetPassword();		break;      //重新设置密码
						case ('*'): Cancel();				break;      //取消当前输入
						case ('#'): Ensure(); 				break;   	//确认键,
						default: 
						{	
							//DisplayListChar(0,1,Input);
							write_1602com(er);
							for(i=0;i<16;i++)
							{
								write_1602dat(Input[i]);
							}
						    operation=0;
							if(N<6)                   					//当输入的密码少于6位时,接受输入并保存,大于6位时则无效。
							{  
								OneAlam();								//按键提示音						
								//DisplayOneChar(6+N,1,'*');
						 		for(j=0;j<=N;j++)
								{
									write_1602com(er+6+j);
									write_1602dat('*');
								}
								InputData[N]=NUM;
								N++;
							}
							else										//输入数据位数大于6后,忽略输入
							{
								N=6;
						 		break;
							}
						}
					}
				}
			}
	 	} 
	}
}

//*********************************中断服务函数**************************************
void  time0_int(void) interrupt 1 
{
 	TL0=0xB0;
 	TH0=0x3C;
 	//TR0=1;
 	countt0++;
  	if(countt0==20)
   	{
		countt0=0;
		second++;
		if(pass==1)
		{
			if(second==1)
			{
				open_led=1;			//关指示灯
				TR0=0;				//关定时器
				TL0=0xB0;
 				TH0=0x3C;
				second=0;
			}
		}
		else
		{
			if(second==3)
			{
				TR0=0;
				second=0;
				key_disable=0;	
				s3_keydown=0;	
				TL0=0xB0;
				TH0=0x3C;
			}
			else
			    TR0=1;
		}
			
   	}
}

⌨️ 快捷键说明

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