硬件:战舰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:");
}