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

📄 huangvn9.c

📁 我同学做的电子密码锁
💻 C
📖 第 1 页 / 共 2 页
字号:
									 #include <reg52.h>
									 #include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define keyport  P2//P2定义键盘端口
#define no_key 20//定义无键按下返回值
#define backkey 10;//定义退格键
#define clearkey 11;//定义清除键
#define  modifykey 12;//定义管理员登陆键
#define  lockkey 13;//定义闭锁键
#define  enterkey 14;//定义确认键
//定义按键扫描码表  按键扫描时,4位列线和4位行线组成字节数据表
uchar code keycode[]={0xee,0xde,0xbe,0x7e,
						0xed,0xdd,0xbd,0x7d,
						0xeb,0xdb,0xbb,0x7b,
						0xe7,0xd7,0xb7,0x77};

uchar password1[]={1,2,3,4,5,6};  //定义用户始初密码表
uchar code password2[]={6,5,4,3,2,1} ;// 定义 管理员初始化密码

													  
uchar passinbuf1[6];//保存用户输入密码
uchar passinbuf2[6];//保存管理员登陆密码
uchar passinbuf3[6];//保存管理员修改密码第一次值
uchar passinbuf4[6];//保存管理员第二次输入密码值

uchar dispbuf[6];//保存显示的字符

uchar pass1=0;//用户输入密码存放passinbuf1[]中
uchar pass2=0;//管理员输入密码存放passinbuf2[]中
uchar pass3=0;//管理员修改输入第一次密码存放passinbuf3[]中	
uchar pass4=0;//管理员修改输入第二次密码存放passinbuf4[]中		 


uchar errorcnt=0;//用户连续输入错误次数	

uchar sysmode=0;//系统所处模式  0:用户输入密码模式 1:管理员修改密码模式 2:等待管理员解锁 3:管理员解密输入 4:管理员登陆		

uchar xg=0;//0:管理员登陆  1:修改密码第一次输入做准备  2:修改密码再次输入做准备
//*************************************液晶部分定义

// 液晶显示控制
sbit lcd_psb=P1^0;									   
sbit lcd_e=P1^6;
sbit lcd_rw=P1^5;
sbit lcd_rs=P1^4 ;                    
sbit lcd_ret=P1^7;
                      
sbit ACC7 = ACC^7;
sbit  int00=P3^2;  //使用外部中断0为键盘中断
sbit  alarmcon=P1^2;// 控制蜂鸣器鸣叫
sbit   lockcon=P1^3;//控制电子锁开闭

void write_cmd(unsigned char lcd_cmd);   //写命令到LCD
void write_data(unsigned char lcd_data); //写数据到LCD
void lcd_int(void);                     //初始化LCD
void functionset(void);
void clear_lcd(void) ;
void delayms(unsigned int count);//延时1ms
void  zhici();//开机致辞
void  yonghu();//用户界面
void  guanliyuan();//管理员界面
void  xiugai();//修改密码第一次输入界面
void   chaoshi();//输入密码超时
void   queding();//修改密码第二次输入界面
void  chenggong();//操作成功
void suoding();	//关闭服务器


//**********************
   //1ms延时函数
void delayms(unsigned int count)//延时
{ 
     unsigned int i;
       while (count) 
        {
         i=250;
         while(i>0)i--;
          count--;
         }
 }


 
 
 //初始化LCD
void lcd_int(void)
{lcd_ret=0;
delayms(10);
lcd_ret=1;
_nop_();
lcd_psb=1;
_nop_();
}
//设置
void functionset(void)
{
	write_cmd(0x30);//功能设置8位控制界面,基本指令集
	write_cmd(0x0c);//显示打开,光标关,反白显示关
	write_cmd(0x06);//DDRAM的地址计数器AC加1
	write_cmd(0x01);//清除屏幕显示,将DDRAM的地址计数器清零
	delayms(1);
}
//清屏
void clear_lcd(void)
{
  write_cmd(0x01);
  //write_cmd(0x34);
  write_cmd(0x30);
}

//写命令到LCD
void write_cmd(unsigned char lcd_cmd) //写命令
{
  delayms(100);
  lcd_rs=0;
  lcd_rw=0;
  P0=lcd_cmd;
  lcd_e=1;
  _nop_();
  _nop_();
  lcd_e=0;	
}

//写数据
void write_data( unsigned char lcd_data)//写数据
{
 delayms(100);
  lcd_rs=1;
  lcd_rw=0;
  P0=lcd_data;
  lcd_e=1;
  _nop_();
  _nop_();
  lcd_e=0;
 }
  
  
   //开机显示题目函数:基于弹片机的电子密码锁(保持5S)
void  zhici()
{
   write_cmd(0x91);
   write_data(0xBB); //基
   write_data(0xF9); 
   write_data(0xD3); //于
   write_data(0xDA);
   write_data(0xB5); //单
   write_data(0xA5);
   write_data(0xC6); //片
   write_data(0xAC);
   write_data(0xBB); //机
   write_data(0xFA);
   write_data(0xB5); //的
   write_data(0xC4);

   write_cmd(0x89);
   write_data(0xB5); //电
   write_data(0xE7);
   write_data(0xD7); //子
   write_data(0xD3);
   write_data(0xC3); //密
   write_data(0xDC);
   write_data(0xC2); //码
   write_data(0xEB);
   write_data(0xCB); //锁
   write_data(0xF8);
   delayms(1000);//保持1S	
   clear_lcd();
 }  
 //用户界面
 void  yonghu()
 {	
 	write_cmd(0x90);

	write_data(0xCA);//输
	write_data(0xE4);
	write_data(0xC8);//入
	write_data(0xEB) ;
	write_data(0xC3); //密
	write_data(0xDC);
	write_data(0xC2);//码
	write_data(0xEB);
	write_data(0x3A);//冒号
	

	

 
 
 }
 //管理员界面
 void  guanliyuan()
 { 	
 	write_cmd(0x90);

	write_data(0xB9);//管
	write_data(0xDC);
	write_data(0xC0);//理
	write_data(0xED);
	write_data(0xD4);//员
	write_data(0xB1);
	write_data(0xCA);//输
	write_data(0xE4);
	write_data(0xC8);//入
	write_data(0xEB) ;
	write_data(0xC3); //密
	write_data(0xDC);
	write_data(0xC2);//码
	write_data(0xEB);
	write_data(0x3A);//冒号
	

 
 }
 void  xiugai()
 {	
 	write_cmd(0x90);
	
	write_data(0xD0);//修
	write_data(0xDE);
	write_data(0xB8);//改
	write_data(0xC4);
	write_data(0xC3); //密
	write_data(0xDC);
	write_data(0xC2);//码
	write_data(0xEB);
	write_data(0x3A);//冒号


 }
 void   chaoshi()
 {
 	  write_cmd(0x90);
	  
	  write_data(0xca);//输
	  write_data(0xe4);
	  write_data(0xc8);//入
	  write_data(0xeb);
	  write_data(0xc3);// 密
	  write_data(0xdc);
	  write_data(0xc2);// 码
	  write_data(0xeb);
	  write_data(0xca);//时
	  write_data(0xb1);	
	
	  write_data(0xbc);//间
	  write_data(0xe4);
	
	  write_data(0xd2);//已
	  write_data(0xd1); 
	
	  write_data(0xb5);//到
	  write_data(0xbd);   

 
 }
 void   queding()
 {	
 	write_cmd(0x90);

	write_data(0xD4);//再
	write_data(0xD9);
	write_data(0xB4);//次
	write_data(0xCE);
	write_data(0xCA);//输
	write_data(0xE4);
	write_data(0xC8);//入
	write_data(0xEB) ;
	write_data(0x3A);//冒号


	
 }
//密码输入成功界面
void  chenggong()
{
	
	write_cmd(0x91);
	
	write_data(0xc3);//密	
	write_data(0xdc);
	write_data(0xc2);//码	
	write_data(0xeb);
	write_data(0xca);//输
	write_data(0xe4);
	write_data(0xc8);//入
   	write_data(0xeb);
   	write_data(0xd5);//正
	write_data(0xfd);
	write_data(0xc8);//确
	write_data(0xb7);
	
}				
 //锁定界面
 void suoding()
 {
 	
	write_cmd(0x91);
	
	write_data(0xb7);//服	
	write_data(0xfe);	
 	write_data(0xce);//务	
 	write_data(0xf1);
	write_data(0xc6);//器
	write_data(0xf7);
	write_data(0xd2);//已
	write_data(0xd1);
	write_data(0xb1);//被
	write_data(0xbb);
	write_data(0xcb);//锁
	write_data(0xf8);
	
	write_cmd(0x88);

	write_data(0xc7);//请
	write_data(0xeb);
	write_data(0xd3);//与
	write_data(0xeb);
	write_data(0xb9);//管
	write_data(0xdc);
	write_data(0xc0);//理
	write_data(0xed);
	write_data(0xd4);//员
	write_data(0xb1);
	write_data(0xc1);//联
	write_data(0xaa);
	write_data(0xcf);//系
	write_data(0xb5);
	
 }
  //   键盘中断服务程序
  uchar find_key()											  
  {
 	delayms(10);//延时10MS消抖
	if(int00==0)
	 {	
	    uchar keytemp,i;
		keytemp=keyport;//读按键端口值
		if(keytemp==0xf0)
		 return  no_key; 
		
	 	keyport=keytemp|0x0f;//线反转法
	 	keytemp=keyport;//读取按键端口值
		for(i=0;i<16;i++)															                                                                                                               
		 {
				if(keytemp==keycode[i])//根据按键端口扫描值,查找按键值
				//while(!int00);//直到按键释放返回键值
				return  i; //返回按键值
				
		 }
	  }	
	else
		 return no_key;
   	 }




	 //键值处理函数
 void  key_process(uchar keytemp)
 {
 		uchar a=0;			 	
		//uchar output;
		uchar i;
	/*uchar code  dispnumber[]=
	{0x30,0x31,0x32,0x33,0x34,
	 0x35,0x36,0x37,0x38,0x39,
   	};*/	
	if(keytemp==no_key)	
	  return;//无键按下,不处理
	switch(sysmode)
	{
	  case 0://用户输入密码
	     switch(keytemp)
		 {
		 	case 0:
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
			case 9:
					TR0=1;//启动定时器T0
					write_cmd(0x8A+pass1); //密码输入起始位			
					
					//output=dispnumber[keytemp];//查找代码
				    //write_data(output);//显示输入密码
				
					write_data(0xA1);//显示黑点
					write_data(0xf1);
					passinbuf1[pass1]=keytemp;//保存用户输入的密码
					if(pass1<6)
					{
						pass1++;//调整保存下一个密码位置
					}
					else
					{
						pass1=0;//只能输入6位的密码
					}
					//alarmcon=1;//发按键提示音200ms
					//delayms(200);
					//alarmcon=0;
					break;
        	case 10://退格键
					pass1=pass1-1;
					write_cmd(0x8a+pass1);
					write_data(0x20);//显示空格
					write_data(0x20);
					pass1=pass1-1;
				  break;
			case 11://清除键
				  
				  
					if(pass1!=0)
					{
						 for(a=0;a<=pass1;a++)
						{
						    write_cmd(0x8A+a); //从第一位开始清除		
							write_data(0x20);//显示空格
							write_data(0x20);				
						}
						a=0;	
					}
				   pass1=0;
				 
				  break;
			case 12 ://定义管理员登陆键
				  sysmode=1;//管理员登陆模式
				  clear_lcd();//清屏
				  break;				 	
		 	case 13://定义闭锁键
				  lockcon=1;
				  break;   
            case 14://定义确认键
				   for (i=0;i<6;i++)
				  {//比较用户输入密码与系统预设密码是否一致 
				  
				   if(passinbuf1[i]!=password1[i])
				   break; }
				   if(i>=6)
				   { //输入密码正确
				   		clear_lcd();
				   	   chenggong();
					   pass1=0;
					   errorcnt=0;//错误次数清零
					   lockcon=0;//开锁
					   alarmcon=1;//开蜂鸣器
					   delayms(2000);//蜂鸣器鸣叫2S
					   alarmcon=0;//关闭蜂鸣器
					   delayms(3000);//延时5S自动闭锁	
					   lockcon=1;//闭锁
					  clear_lcd();
					   return;

				   }				   
				   else
				   {
				   		errorcnt++;// 出错次数加1
						if(errorcnt>2)
						{//次数超过3次
					     	//	errorcnt=0;
							pass1=0;							 
							alarmcon=1;//报警1分钟

⌨️ 快捷键说明

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