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

📄 1602.lst

📁 单片机密码锁c程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 566   1      	CorrectCont=0;			//密码正确输入次数清零
 567   1      	ReInputCont=0;			//重置密码输入次数清零 
 568   1      	open_led=1;
 569   1      	s3_keydown=0;
 570   1      	key_disable=0;
 571   1      	N=0;					//输入位数计数器清零
 572   1      }
 573          
 574          
 575          //==========================确认键,并通过相应标志位执行相应功能===============================
 576          void Ensure(void)
 577          {	
 578   1      	unsigned char i,j;
 579   1      	RdFromROM(CurrentPassword,0,6); 					//从24C02里读出存储密码
 580   1          if(N==6)
 581   1      	{
 582   2      	    if(ReInputEn==0)							//重置密码功能未开启
 583   2      		{
 584   3      			for(i=0;i<6;)
 585   3         			{					
 586   4      				if(CurrentPassword[i]==InputData[i])
 587   4      				{
 588   5      					i++;
 589   5      				}
 590   4      				else 
 591   4      				{			
 592   5      					ErrorCont++;
 593   5      					if(ErrorCont==3)			//错误输入计数达三次时,报警并锁定键盘
 594   5      					{
 595   6      						write_1602com(er);
 596   6      						for(i=0;i<16;i++)
 597   6      						{
 598   7      							write_1602dat(Error[i]);	
 599   7      						}
 600   6      						do
 601   6      						Alam_KeyUnable();
 602   6      						while(1);
 603   6      					}
 604   5      					else
 605   5      					{
 606   6      						TR0=1;				//开启定时
 607   6      						key_disable=1;			//锁定键盘
 608   6      						pass=0;
 609   6      						break;
 610   6      					}
 611   5      				}
 612   4      			}
 613   3      
C51 COMPILER V6.12  1602                                                                   10/12/2012 11:14:18 PAGE 11  

 614   3      			if(i==6)
 615   3      			{
 616   4      				CorrectCont++;
 617   4      				if(CorrectCont==1)				//正确输入计数,当只有一次正确输入时,开锁,
 618   4      				{
 619   5      					//DisplayListChar(0,1,LockOpen);
 620   5      					write_1602com(er);
 621   5      					for(j=0;j<16;j++)
 622   5      					{
 623   6      						write_1602dat(LockOpen[j]);	
 624   6      					}
 625   5      					TwoAlam();			//操作成功提示音
 626   5      					KEY=0;											//开锁
 627   5      					pass=1;											//置正确标志位
 628   5      					TR0=1;											//开启定时
 629   5      					open_led=0;										//开锁指示灯亮
 630   5      					for(j=0;j<6;j++)								//将输入清除
 631   5      					{
 632   6      						InputData[i]=0;
 633   6      					}
 634   5      				}	
 635   4      				else												//当两次正确输入时,开启重置密码功能
 636   4      				{
 637   5      					//DisplayListChar(0,1,SetNew);
 638   5      					write_1602com(er);
 639   5      					for(j=0;j<16;j++)
 640   5      					{
 641   6      						write_1602dat(SetNew[j]);	
 642   6      					}
 643   5      					TwoAlam();									    //操作成功提示
 644   5      					ReInputEn=1;									//允许重置密码输入
 645   5      					CorrectCont=0;									//正确计数器清零
 646   5      				}
 647   4      	  		}
 648   3      	
 649   3      			else			//=========================当第一次使用或忘记密码时可以用131420对其密码初始化============
 650   3      			{
 651   4      				if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(Inp
             -utData[5]==0))
 652   4      		  	 	{
 653   5      					WrToROM(initpassword,0,6); 				//强制将初始密码写入24C02存储
 654   5      					//DisplayListChar(0,1,initword);			//显示初始化密码
 655   5      					write_1602com(er);
 656   5      					for(j=0;j<16;j++)
 657   5      					{
 658   6      						write_1602dat(initword[j]);	
 659   6      					}
 660   5      					TwoAlam();
 661   5      					Delay400Ms();
 662   5      					TwoAlam();
 663   5      					N=0;
 664   5      				}
 665   4      				else
 666   4      				{
 667   5      					//DisplayListChar(0,1,Error);
 668   5      					write_1602com(er);
 669   5      					for(j=0;j<16;j++)
 670   5      					{
 671   6      						write_1602dat(Error[j]);	
 672   6      					}
 673   5       					ThreeAlam();										//错误提示音
 674   5      					pass=0;	
C51 COMPILER V6.12  1602                                                                   10/12/2012 11:14:18 PAGE 12  

 675   5      				}
 676   4      			}
 677   3      		}
 678   2      
 679   2      		else											//当已经开启重置密码功能时,而按下开锁键,
 680   2      		{
 681   3      			//DisplayListChar(0,1,Er_try);
 682   3      			write_1602com(er);
 683   3      			for(j=0;j<16;j++)
 684   3      			{
 685   4      				write_1602dat(Er_try[j]);	
 686   4      			}
 687   3      			ThreeAlam();
 688   3      		}
 689   2      	}
 690   1      
 691   1      	else
 692   1      	{
 693   2      		//DisplayListChar(0,1,Error);
 694   2      		write_1602com(er);
 695   2      		for(j=0;j<16;j++)
 696   2      		{
 697   3      			write_1602dat(Error[j]);	
 698   3      		}
 699   2      
 700   2       		ThreeAlam();										//错误提示音
 701   2      		pass=0;	
 702   2      	}
 703   1      	
 704   1      	N=0;													//将输入数据计数器清零,为下一次输入作准备
 705   1      
 706   1      	operation=1;
 707   1      }
 708          
 709          
 710          //==============================主函数===============================
 711          void main(void)
 712          {
 713   1       	unsigned char KEY,NUM;
 714   1      	unsigned char i,j;
 715   1       	P1=0xFF; 
 716   1      	TMOD=0x11;
 717   1       	TL0=0xB0;
 718   1       	TH0=0x3C;
 719   1       	EA=1;
 720   1       	ET0=1;	
 721   1       	TR0=0;
 722   1       	Delay400Ms(); 	//启动等待,等LCM讲入工作状态
 723   1       	lcd_init(); 	//LCD初始化
 724   1      	write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示
 725   1      	for(i=0;i<16;i++)
 726   1      	{
 727   2      		write_1602dat(name[i]);//向液晶屏写日历显示的固定符号部分
 728   2      	}
 729   1      	write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示
 730   1      	for(i=0;i<16;i++)
 731   1      	{
 732   2      		write_1602dat(start_line[i]);//写显示时间固定符号,两个冒号
 733   2      	}
 734   1      	write_1602com(er+9);	//设置光标位置
 735   1      	write_1602com(0x0f);	//设置光标为闪烁
 736   1       	Delay5Ms(); //延时片刻(可不要)
C51 COMPILER V6.12  1602                                                                   10/12/2012 11:14:18 PAGE 13  

 737   1      
 738   1       	N=0;														//初始化数据输入位数
 739   1       	while(1)
 740   1       	{
 741   2      		if(key_disable==1)
 742   2      			Alam_KeyUnable();
 743   2      		else
 744   2      			ALAM=1;								//关报警
 745   2      
 746   2      		KEY=keynum();
 747   2      		if(KEY!=0)
 748   2      		{	
 749   3      			if(key_disable==1)
 750   3      			{
 751   4      				second=0;
 752   4      			}
 753   3      			else
 754   3      			{
 755   4      				NUM=coding(KEY);
 756   4      				{
 757   5      					switch(NUM)
 758   5      					{
 759   6      						case ('A'): 	; 					break;
 760   6      						case ('B'):		;     				break;
 761   6      						case ('C'): 	; 					break;
 762   6      						case ('D'): ResetPassword();		break;      //重新设置密码
 763   6      						case ('*'): Cancel();				break;      //取消当前输入
 764   6      						case ('#'): Ensure(); 				break;   	//确认键,
 765   6      						default: 
 766   6      						{	
 767   7      							//DisplayListChar(0,1,Input);
 768   7      							write_1602com(er);
 769   7      							for(i=0;i<16;i++)
 770   7      							{
 771   8      								write_1602dat(Input[i]);
 772   8      							}
 773   7      						    operation=0;
 774   7      							if(N<6)                   					//当输入的密码少于6位时,接受输入并保存,大于6位时则无效。
 775   7      							{  
 776   8      								OneAlam();								//按键提示音						
 777   8      								//DisplayOneChar(6+N,1,'*');
 778   8      						 		for(j=0;j<=N;j++)
 779   8      								{
 780   9      									write_1602com(er+6+j);
 781   9      									write_1602dat('*');
 782   9      								}
 783   8      								InputData[N]=NUM;
 784   8      								N++;
 785   8      							}
 786   7      							else										//输入数据位数大于6后,忽略输入
 787   7      							{
 788   8      								N=6;
 789   8      						 		break;
 790   8      							}
 791   7      						}
 792   6      					}
 793   5      				}
 794   4      			}
 795   3      	 	} 
 796   2      	}
 797   1      }
 798          
C51 COMPILER V6.12  1602                                                                   10/12/2012 11:14:18 PAGE 14  

 799          //*********************************中断服务函数**************************************
 800          void  time0_int(void) interrupt 1 
 801          {
 802   1       	TL0=0xB0;
 803   1       	TH0=0x3C;
 804   1       	//TR0=1;
 805   1       	countt0++;
 806   1        	if(countt0==20)
 807   1         	{
 808   2      		countt0=0;
 809   2      		second++;
 810   2      		if(pass==1)
 811   2      		{
 812   3      			if(second==1)
 813   3      			{
 814   4      				open_led=1;			//关指示灯
 815   4      				TR0=0;				//关定时器
 816   4      				TL0=0xB0;
 817   4       				TH0=0x3C;
 818   4      				second=0;
 819   4      			}
 820   3      		}
 821   2      		else
 822   2      		{
 823   3      			if(second==3)
 824   3      			{
 825   4      				TR0=0;
 826   4      				second=0;
 827   4      				key_disable=0;	
 828   4      				s3_keydown=0;	
 829   4      				TL0=0xB0;
 830   4      				TH0=0x3C;
 831   4      			}
 832   3      			else
 833   3      			    TR0=1;
 834   3      		}
 835   2      			
 836   2         	}
 837   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1737    ----
   CONSTANT SIZE    =    214    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     24      23
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      5    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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