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

📄 1602.lst

📁 单片机密码锁c程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 280          //=========================================================================================
 281          
 282          
 283          
 284          
 285          //==============将按键值编码为数值=========================
 286          unsigned char coding(unsigned char m)	 
 287          {
 288   1      	unsigned char k;
 289   1      	
 290   1      	switch(m)
 291   1      	{
 292   2      		case (0x18): k=1;break;
 293   2      		case (0x28): k=2;break;
 294   2      		case (0x48): k=3;break;
 295   2      		case (0x88): k='A';break;
 296   2      		case (0x14): k=4;break;
 297   2      		case (0x24): k=5;break;
 298   2      		case (0x44): k=6;break;
 299   2      		case (0x84): k='B';break;
 300   2      		case (0x12): k=7;break;
 301   2      		case (0x22): k=8;break;
 302   2      		case (0x42): k=9;break;
 303   2      		case (0x82): k='C';break;
C51 COMPILER V6.12  1602                                                                   10/12/2012 11:14:18 PAGE 6   

 304   2      		case (0x11): k='*';break;
 305   2      		case (0x21): k=0;break;
 306   2      		case (0x41): k='#';break;
 307   2      		case (0x81): k='D';break;
 308   2      	}
 309   1      	return(k);
 310   1      }
 311          
 312          
 313          //=====================按键检测并返回按键值===============================
 314          unsigned char keynum(void)
 315          {
 316   1       	unsigned char row,col,i;
 317   1       	P1=0xf0;
 318   1       	if((P1&0xf0)!=0xf0)
 319   1       	{
 320   2      	   	Delay5Ms();
 321   2              Delay5Ms();
 322   2         		if((P1&0xf0)!=0xf0)
 323   2      		{
 324   3          		row=P1^0xf0;          //确定行线
 325   3      			i=0;
 326   3      			P1=a[i];	          //精确定位
 327   3      			while(i<4)
 328   3      			{
 329   4      	 			if((P1&0xf0)!=0xf0)
 330   4      	  			{
 331   5      	   				col=~(P1&0xff);	  //确定列线
 332   5      	   				break;            //已定位后提前退出   
 333   5      	  			}
 334   4      				else 
 335   4      	  			{
 336   5      	   				i++;
 337   5      	   				P1=a[i];
 338   5      	  			}
 339   4      			}
 340   3      		}
 341   2      		else 
 342   2      		{
 343   3      			return 0;
 344   3      		}
 345   2      	
 346   2      		while((P1&0xf0)!=0xf0);
 347   2      
 348   2      		return (row|col);	 		//行线与列线组合后返回
 349   2       	}
 350   1       	else return 0;	         		//无键按下时返回0
 351   1      }
 352          
 353          
 354          
 355          
 356          //=======================一声提示音,表示有效输入========================
 357          void OneAlam(void)
 358          {
 359   1      	ALAM=0;
 360   1      	Delay5Ms();
 361   1          ALAM=1;
 362   1      }
 363          
 364          //========================二声提示音,表示操作成功========================
 365          void TwoAlam(void)
C51 COMPILER V6.12  1602                                                                   10/12/2012 11:14:18 PAGE 7   

 366          {
 367   1      	ALAM=0;
 368   1      	Delay5Ms();
 369   1          ALAM=1;
 370   1          Delay5Ms();
 371   1      	ALAM=0;
 372   1      	Delay5Ms();
 373   1          ALAM=1;
 374   1      }
 375          
 376          //========================三声提示音,表示错误========================
 377          void ThreeAlam(void)
 378          {
 379   1      	ALAM=0;
 380   1      	Delay5Ms();
 381   1          ALAM=1;
 382   1          Delay5Ms();
 383   1      	ALAM=0;
 384   1      	Delay5Ms();
 385   1          ALAM=1;
 386   1          Delay5Ms();
 387   1      	ALAM=0;
 388   1      	Delay5Ms();
 389   1          ALAM=1;
 390   1      
 391   1      }
 392          
 393          //=====================显示输入的N个数字,用H代替以便隐藏============================
 394          void DisplayOne(void)
 395          {
 396   1      //	DisplayOneChar(9+N,1,'*');
 397   1      	write_1602com(yi+5+N);
 398   1      	write_1602dat('*');
 399   1      }
 400          
 401          //=======================显示提示输入=========================
 402          void DisplayChar(void)
 403          {
 404   1      	unsigned char i;
 405   1      	if(pass==1)
 406   1      	{
 407   2      		//DisplayListChar(0,1,LockOpen);
 408   2      		write_1602com(er);
 409   2      		for(i=0;i<16;i++)
 410   2      		{
 411   3      			write_1602dat(LockOpen[i]);	
 412   3      		}
 413   2      	}
 414   1      	else
 415   1      	{
 416   2      		if(N==0)
 417   2      		{
 418   3      			//DisplayListChar(0,1,Error);
 419   3      			write_1602com(er);
 420   3      			for(i=0;i<16;i++)
 421   3      			{
 422   4      				write_1602dat(Error[i]);	
 423   4      			}
 424   3      		}
 425   2      		else
 426   2      		{
 427   3      			//DisplayListChar(0,1,start_line);	
C51 COMPILER V6.12  1602                                                                   10/12/2012 11:14:18 PAGE 8   

 428   3      			write_1602com(er);
 429   3      			for(i=0;i<16;i++)
 430   3      			{
 431   4      				write_1602dat(start_line[i]);	
 432   4      			}
 433   3      		}
 434   2      	}
 435   1      }
 436          
 437          void DisplayInput(void)
 438          {
 439   1      	unsigned char i;
 440   1      	if(CorrectCont==1)
 441   1      	{
 442   2      		//DisplayListChar(0,0,Input);
 443   2      		write_1602com(er);
 444   2      		for(i=0;i<16;i++)
 445   2      		{
 446   3      			write_1602dat(Input[i]);	
 447   3      		}
 448   2      	}
 449   1      }
 450          
 451          
 452          //========================重置密码==================================================
 453          //==================================================================================
 454          void ResetPassword(void)
 455          {
 456   1      	unsigned char i;	
 457   1      	unsigned char j;
 458   1      	if(pass==0)
 459   1      	{
 460   2      		pass=0;
 461   2      		DisplayChar();
 462   2      		ThreeAlam();
 463   2      	}
 464   1      	else
 465   1      	{
 466   2          	if(ReInputEn==1)
 467   2      		{
 468   3      			if(N==6)
 469   3      			{
 470   4      				ReInputCont++;				
 471   4      				if(ReInputCont==2)
 472   4      				{
 473   5      					for(i=0;i<6;)
 474   5      					{
 475   6      						if(TempPassword[i]==InputData[i])	//将两次输入的新密码作对比
 476   6      							i++;
 477   6      						else
 478   6      						{
 479   7      							//DisplayListChar(0,1,Error);
 480   7      							write_1602com(er);
 481   7      							for(j=0;j<16;j++)
 482   7      							{
 483   8      								write_1602dat(Error[j]);	
 484   8      							}
 485   7      							ThreeAlam();			//错误提示	
 486   7      							pass=0;
 487   7      							ReInputEn=0;			//关闭重置功能,
 488   7      							ReInputCont=0;
 489   7      							DisplayChar();
C51 COMPILER V6.12  1602                                                                   10/12/2012 11:14:18 PAGE 9   

 490   7      							break;
 491   7      						}
 492   6      					} 
 493   5      					if(i==6)
 494   5      					{
 495   6      						//DisplayListChar(0,1,ResetOK);
 496   6      						write_1602com(er);
 497   6      						for(j=0;j<16;j++)
 498   6      						{
 499   7      							write_1602dat(ResetOK[j]);	
 500   7      						}
 501   6      
 502   6      						TwoAlam();				//操作成功提示
 503   6      					 	WrToROM(TempPassword,0,6);		//将新密码写入24C02存储
 504   6      						ReInputEn=0;
 505   6      					}
 506   5      					ReInputCont=0;
 507   5      					CorrectCont=0;
 508   5      				}
 509   4      				else
 510   4      				{
 511   5      					OneAlam();
 512   5      					//DisplayListChar(0, 1, again); 		//显示再次输入一次
 513   5      					write_1602com(er);
 514   5      					for(j=0;j<16;j++)
 515   5      					{
 516   6      						write_1602dat(again[j]);	
 517   6      					}					
 518   5      					for(i=0;i<6;i++)
 519   5      					{
 520   6      						TempPassword[i]=InputData[i];		//将第一次输入的数据暂存起来						
 521   6      					}
 522   5      				}
 523   4      
 524   4      			N=0;						//输入数据位数计数器清零
 525   4      		   }
 526   3      	    }
 527   2      	}
 528   1      
 529   1      }
 530          
 531          
 532          
 533          //=======================输入密码错误超过三过,报警并锁死键盘======================
 534          void Alam_KeyUnable(void)
 535          {
 536   1      	P1=0x00;
 537   1      	{
 538   2      		ALAM=~ALAM;
 539   2      		Delay5Ms();
 540   2      	}
 541   1      }
 542          
 543          
 544          //=======================取消所有操作============================================
 545          void Cancel(void)
 546          {	
 547   1      	unsigned char i;
 548   1      	unsigned char j;
 549   1      	//DisplayListChar(0, 1, start_line); 
 550   1      	write_1602com(er);
 551   1      	for(j=0;j<16;j++)
C51 COMPILER V6.12  1602                                                                   10/12/2012 11:14:18 PAGE 10  

 552   1      	{
 553   2      		write_1602dat(start_line[j]);	
 554   2      	}
 555   1      	TwoAlam();				//提示音
 556   1      	for(i=0;i<6;i++)
 557   1      	{
 558   2      		InputData[i]=0;
 559   2      	}
 560   1      	KEY=1;					//关闭锁
 561   1      	ALAM=1;					//报警关
 562   1      	operation=0;			//操作标志位清零
 563   1      	pass=0;					//密码正确标志清零
 564   1      	ReInputEn=0;			//重置输入充许标志清零
 565   1      	ErrorCont=0;			//密码错误输入次数清零

⌨️ 快捷键说明

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