战舰触摸屏数字密码锁

硬件:战舰V3+电容/电阻触摸屏

显示屏的UI部分

/*.h部分*/
void Show_Str_Mid(u16 x,u16 y,u8*str,u8 size,u8 len);
void UI_load_keyboard(u16 x,u16 y,u8 **kbtbl);
void UI_key_staset(u16 x,u16 y,u8 keyx,u8 sta);
int UI_get_keynum(u16 x,u16 y);
void TouchInitUI(void);

/*.c部分*/
u8* kbd_fn_tbl[2];
const u8* kbd_tbl1[13]={"1","2","3","4","5","6","7","8","9","Del","0","Add"," "};
u8** kbd_tbl;

void Show_Str_Mid(u16 x,u16 y,u8*str,u8 size,u8 len)//把对应的字符显示到格子中间
{
	u16 strlenth=0;
  strlenth=strlen((const char*)str);
	strlenth*=size/2;
	if(strlenth>len)LCD_ShowString(x,y,lcddev.width,lcddev.height,size,str);
	else
	{
		strlenth=(len-strlenth)/2;
	    LCD_ShowString(strlenth+x,y,lcddev.width,lcddev.height,size,str);
	}
} 


void UI_load_keyboard(u16 x,u16 y,u8 **kbtbl)//设计3X5表格,每个格子100*50
{
	u16 i;
	POINT_COLOR=RED;
	kbd_tbl=kbtbl;
	LCD_Fill(x,y,x+300,y+250,WHITE);//占屏幕的大小,长300,款250
	LCD_DrawRectangle(x,y,x+300,y+250);	//外围矩形					   
	LCD_DrawRectangle(x+100,y,x+200,y+250);	 
	LCD_DrawRectangle(x,y+50,x+300,y+100);
	LCD_DrawRectangle(x,y+150,x+300,y+200);
	POINT_COLOR=BLUE;
	for(i=0;i<15;i++)
	{
		if(i<13)Show_Str_Mid(x+(i%3)*100,y+13+50*(i/3),(u8*)kbd_tbl[i],24,100);//显示每个格子中的内容
		/*
		13怎么算?(50-24)/2=13
		50(格子的宽度),100格子的长度
		*/
		else Show_Str_Mid(x+(i%3)*100,y+13+50*(i/3),kbd_fn_tbl[i-13],24,100); 
	}  		 					   
}


//加载显示界面
void TouchInitUI()
{
	LCD_ShowString(0,0,lcddev.width,lcddev.height,24,"-------Ordinary Mode-------");		
	LCD_ShowString(0,24,lcddev.width,lcddev.height,24,"PASSWD:");
	kbd_fn_tbl[0]="Enter";
	kbd_fn_tbl[1]="Back"; 
	UI_load_keyboard(10,230,(u8**)kbd_tbl1);//加载要显示键盘 
	/*
	为什么x轴从10开始?屏幕长320,320-300=20  20/2=10
	230=480-250,总的屏幕的高度减去表格的高度=表格上方空余的
	*/
}


//按键状态设置
//x,y:键盘坐标
//key:键值(0~8)
//sta:状态,0,松开;1,按下;
void UI_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
{		  
	u16 i=keyx/3,j=keyx%3;
	if(keyx>15)
		return;
	if(sta)
		LCD_Fill(x+j*100+1,y+i*50+1,x+j*100+98,y+i*50+48,GREEN);
	else 
		LCD_Fill(x+j*100+1,y+i*50+1,x+j*100+98,y+i*50+48,WHITE); 
	if(j&&(i>3))
		Show_Str_Mid(x+j*100,y+13+50*i,(u8*)kbd_fn_tbl[keyx-13],24,100);/*这里的13,50,100同上*/
	else 
		Show_Str_Mid(x+j*100,y+13+50*i,(u8*)kbd_tbl[keyx],24,100);		 		 
}


//得到触摸屏的输入
//x,y:键盘坐标
//返回值:按键键值(1~15有效;0,无效)
int UI_get_keynum(u16 x,u16 y)
{
	int i,j;
	static unsigned int key_x=0;//0,没有任何按键按下;1~15,1~15号按键按下
	int key=0;
	tp_dev.scan(0); 		 
	if(tp_dev.sta&TP_PRES_DOWN)			//触摸屏被按下
	{	
		for(i=0;i<5;i++)
		{
			for(j=0;j<3;j++)
			{
			 	if(tp_dev.x[0]<(x+j*100+100)&&tp_dev.x[0]>(x+j*100)&&tp_dev.y[0]<(y+i*50+50)&&tp_dev.y[0]>(y+i*50))
				{	
					key=i*3+j+1;	 
					break;	 		   
				}
			}
			if(key)
			{	   
				if(key_x==key)key=0;
				else 
				{
					UI_key_staset(x,y,key_x-1,0);
					key_x=key;
					UI_key_staset(x,y,key_x-1,1);
				}
				break;
			}
		}  
	}else if(key_x) 
	{
		UI_key_staset(x,y,key_x-1,0);
		key_x=0;
	} 
	return key; 
}

 

数字锁部分

/*.c*/
u8 open_pwd[6]="123456";//初始密码
u8 root_pwd[6]="666666";//管理员密码
int in_times=0;
int mykey=0;

u8 *in_pwd1=0;
u8 *in_pwd2=0;
u8 *in_pwd3=0;
u8 *in_pwd4=0;
u8 *in_pwd5=0;
u8 *in_pwd6=0;
u8 *str=0; 


void NumberLock()
{
	int key=0;
	LCD_Clear(WHITE);//清屏
	TouchInitUI();//显示输入数字密码界面
	while(1)
	{
		key=UI_get_keynum(10,230);//返回触摸按键的值
		if(key)//如果有按键按下
		{
			switch(key)
			{
				case 1:str="1";break;			   
				case 2:str="2";break;	    
				case 3:str="3";break;	    
				case 4:str="4";break;		 
				case 5:str="5";break;		  
				case 6:str="6";break;	   
				case 7:str="7";break;		  
				case 8:str="8";break;		  
				case 9:str="9";break;		   
				case 10:str="*";break;		    
				case 11:str="0";break;		  
				case 12:str="#";break;	   
				case 13:str="DEL";break;	    
				case 14:str="Enter";break;		    
				case 15:str="Back";re_in();break;		     
			}
			if(mykey==0)
			{
				in_times++;
				//限制:只有数字才能作为密码输入
				if(str=="0"||str=="1"||str=="2"||str=="3"||str=="4"||str=="5"||str=="6"||str=="7"||str=="8"||str=="9")
				{
					switch(in_times)
					{
						case 1:in_pwd1=str;LCD_ShowString(0,48,200,16,24,in_pwd1);delay_ms(200);LCD_ShowString(0,48,200,16,24,"*");break;
						case 2:in_pwd2=str;LCD_ShowString(24,48,200,16,24,in_pwd2);delay_ms(200);LCD_ShowString(24,48,200,16,24,"*");break;
						case 3:in_pwd3=str;LCD_ShowString(48,48,200,16,24,in_pwd3);delay_ms(200);LCD_ShowString(48,48,200,16,24,"*");break;
						case 4:in_pwd4=str;LCD_ShowString(72,48,200,16,24,in_pwd4);delay_ms(200);LCD_ShowString(72,48,200,16,24,"*");break;
						case 5:in_pwd5=str;LCD_ShowString(96,48,200,16,24,in_pwd5);delay_ms(200);LCD_ShowString(96,48,200,16,24,"*");break;
						case 6:in_pwd6=str;LCD_ShowString(120,48,200,16,24,in_pwd6);delay_ms(200);LCD_ShowString(120,48,200,16,24,"*");break;
					}
				}
				mykey=1;
			}
			
			if(in_times==6)
			{
				if(*in_pwd1==open_pwd[0]&&*in_pwd2==open_pwd[1]&&*in_pwd3==open_pwd[2]&&*in_pwd4==open_pwd[3]&&*in_pwd5==open_pwd[4]&&*in_pwd6==open_pwd[5])//普通用户配对成功
				{
					LCD_ShowString(0,160,lcddev.width,lcddev.height,24,"TheRightPassward");	//数字密码正确->开门,进入下一项
				}
				else if(*in_pwd1==root_pwd[0]&&//管理员用户配对成功
								*in_pwd2==root_pwd[1]&&
								*in_pwd3==root_pwd[2]&&
								*in_pwd4==root_pwd[3]&&
								*in_pwd5==root_pwd[4]&&
								*in_pwd6==root_pwd[5])
				{
					 root_h();  //进入管理员模式
				}
				else//配对失败
				{
					LCD_Fill(0,0,lcddev.width,200,WHITE);//清除之前输入的密码
					LCD_ShowString(0,0,lcddev.width,lcddev.height,24,"-------Ordinary Mode-------");		
					LCD_ShowString(0,24,lcddev.width,lcddev.height,24,"PASSWD:");
					LCD_ShowString(0,160,lcddev.width,200,24,"Password Error!!!");
					delay_ms(500);
					LCD_Fill(0,160,lcddev.width,200,WHITE);
				}
				in_times=0;
			}
		}else 
		{
			delay_ms(10);	  
			mykey=0;//放手时,归零以便下次重新计数
		}
	}
}

void re_in(void)//重置/重新输入
{
	LCD_Fill(0,0,lcddev.width,200,WHITE);//清除之前输入的密码
	LCD_ShowString(0,0,lcddev.width,lcddev.height,24,"-------Ordinary Mode-------");		
	LCD_ShowString(0,24,lcddev.width,lcddev.height,24,"PASSWD:");
	delay_ms(500);
	in_times=-1;
}

void root_h(void)//管理员用户函数
{

	u8 key;
	in_times=0;
	mykey=0;
	in_pwd1="0";
	in_pwd2="0";
	in_pwd3="0";
	in_pwd4="0";
	in_pwd5="0";
	in_pwd6="0";
	
	LCD_Fill(0,0,lcddev.width,220,WHITE);//		清除数字键盘以上所有显示
	LCD_ShowString(0,0,lcddev.width,lcddev.height,24,"---------Root Mode--------");	
	LCD_ShowString(0,24,lcddev.width,lcddev.height,24,"You can change password here:");
	LCD_ShowString(0,48,lcddev.width,lcddev.height,24,"Please input NEWPWD:");//提示输入新密码
	do
	{
		key=UI_get_keynum(10,230);	
		if(key)
		{	  
			switch(key)
			{
				case 1:str="1";break;			   
				case 2:str="2";break;	    
				case 3:str="3";break;	    
				case 4:str="4";break;		 
				case 5:str="5";break;		  
				case 6:str="6";break;	   
				case 7:str="7";break;		  
				case 8:str="8";break;		  
				case 9:str="9";break;		   
				case 10:str="*";break;		    
				case 11:str="0";break;		  
				case 12:str="#";break;	   
				case 13:str="DEL";break;	    
				case 14:str="Enter";break;		    
				case 15:str="Back";re_in();break;		     
			}
			if(mykey==0)
			{
				in_times++;
				if(str=="0"||//限制:只有数字才能作为密码输入
					 str=="1"||
				   str=="2"||
				   str=="3"||
				   str=="4"||
				   str=="5"||
				   str=="6"||
				   str=="7"||
				   str=="8"||
				   str=="9")
				{
					switch(in_times)
					{
						case 1:in_pwd1=str;open_pwd[0]=*str;LCD_ShowString(0,72,lcddev.width,200,24,in_pwd1);delay_ms(200);LCD_ShowString(0,72,lcddev.width,200,24,"*");break;//第一次输入
						case 2:in_pwd2=str;open_pwd[1]=*str;LCD_ShowString(24,72,lcddev.width,200,24,in_pwd2);delay_ms(200);LCD_ShowString(24,72,lcddev.width,200,24,"*");break;//第二次输入
						case 3:in_pwd3=str;open_pwd[2]=*str;LCD_ShowString(48,72,lcddev.width,200,24,in_pwd3);delay_ms(200);LCD_ShowString(48,72,lcddev.width,200,24,"*");break;//第三次输入
						case 4:in_pwd4=str;open_pwd[3]=*str;LCD_ShowString(72,72,lcddev.width,200,24,in_pwd4);delay_ms(200);LCD_ShowString(72,72,lcddev.width,200,24,"*");break;//第四次输入
						case 5:in_pwd5=str;open_pwd[4]=*str;LCD_ShowString(96,72,lcddev.width,200,24,in_pwd5);delay_ms(200);LCD_ShowString(96,72,lcddev.width,200,24,"*");break;//第五次输入
						case 6:in_pwd6=str;open_pwd[5]=*str;LCD_ShowString(120,72,lcddev.width,200,24,in_pwd6);delay_ms(200);LCD_ShowString(120,72,lcddev.width,200,24,"*");break;//第六次输入
					}
				}
				
				if(in_pwd1=="6"&&in_pwd2=="6"&&in_pwd3=="6"&&in_pwd4=="6"&&in_pwd5=="6"&&in_pwd6=="6")
				{
					LCD_Fill(0,0,lcddev.width,200,WHITE);//清除输入新密码提示以及新密码
					LCD_ShowString(0,0,lcddev.width,200,24,"coudle not same as root");
					LCD_ShowString(0,24,lcddev.width,200,24,"password has been back to ");
					LCD_ShowString(0,48,lcddev.width,200,24,"123456");
					open_pwd[0]=*"1";
					open_pwd[1]=*"2";
					open_pwd[2]=*"3";
					open_pwd[3]=*"4";
					open_pwd[4]=*"5";
					open_pwd[5]=*"6";
					delay_ms(1500);
					LCD_Fill(0,0,lcddev.width,200,WHITE);//清除输入新密码提示以及新密码
				}
				
				mykey=1;//设置为1防止再次进入
			}
			
			if(in_times==6)
			{
				in_times=0;
				LCD_Fill(0,0,lcddev.width,200,WHITE);//清除输入新密码提示以及新密码
				LCD_ShowString(0,0,lcddev.width,lcddev.height,24,"Reset Complete");
				delay_ms(700);
				LCD_Fill(0,0,lcddev.width,200,WHITE);//		清除管理员用户界面提示
				LCD_ShowString(0,0,lcddev.width,lcddev.height,24,"-------Ordinary Mode-------");	
				LCD_ShowString(0,24,lcddev.width,lcddev.height,24,"PASSWD:");
				key=13;

			}
				

		}
		else 
		{
			delay_ms(10);	  
			mykey=0;//放手时,归零以便下次重新计数
		}
	}while(key!=13);
	LCD_Fill(0,0,lcddev.width,200,WHITE);//		清除普通用户界面提示
	LCD_ShowString(0,0,lcddev.width,lcddev.height,24,"-------Ordinary Mode-------");		
	LCD_ShowString(0,24,lcddev.width,lcddev.height,24,"PASSWD:");
}


发布了11 篇原创文章 · 获赞 5 · 访问量 457

猜你喜欢

转载自blog.csdn.net/weixin_43739167/article/details/104284358