#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "touch.h"
#include "Lock.h"
//数字表
u32 kbd_tbl[9]={1,2,3,4,5,6,7,8,9,};
//
u8 i=0,j=0,k;
u8 static code[6]={1,2,3,4,5,6};
u8 In_code[6]={0,0,0,0,0,0};
//
/***************************************************************
if(lcddev.id==0X5310){kbdxsize=86;kbdysize=43;}//根据LCD分辨率设置按键大小
else if(lcddev.id==0X5510||lcddev.id==0X1963){kbdxsize=140;kbdysize=70;}
else {kbdxsize=60;kbdysize=40;}
****************************************************************************/
u16 kbdxsize=76; //虚拟键盘按键宽度
u16 kbdysize=60; //虚拟键盘按键高度
char c[]={'X','0','k'};
///////////////////////////////////加载键盘界面//////////////////////////////
//x,y:界面起始坐标
void Display_lock(u16 x,u16 y)
{
int i,h=0;
int j=0,k=0,g=0;
POINT_COLOR=RED;
LCD_DrawRectangle(x,y,x+kbdxsize*3,y-30);
LCD_DrawRectangle(x,y,x+kbdxsize*3,y+kbdysize*4);
LCD_DrawRectangle(x+kbdxsize,y,x+kbdxsize*2,y+kbdysize*4);
LCD_DrawRectangle(x,y+kbdysize*2,x+kbdxsize*3,y+kbdysize*3);
LCD_DrawRectangle(x,y+kbdysize,x+kbdxsize*3,y+kbdysize);
POINT_COLOR=BLUE;
LCD_ShowNum(x+40,y-25,In_code[0],1,24);
LCD_ShowNum(x+60,y-25,In_code[1],1,24);
LCD_ShowNum(x+80,y-25,In_code[2],1,24);
LCD_ShowNum(x+100,y-25,In_code[3],1,24);
LCD_ShowNum(x+120,y-25,In_code[4],1,24);
LCD_ShowNum(x+140,y-25,In_code[5],1,24);
//显示数字,高位为0,则不显示
//x,y :起点坐标
//len :数字的位数
//size:字体大小 12-16-24
//color:颜色
//num:数值(0~4294967295);
LCD_ShowNum(x+26,y+18,1,1,24);
for(j=0;j<3;j++)
{
if(j==0)
{
for(k=0;k<3;k++)
{
LCD_ShowNum(x+kbdxsize*h+26,y+18,kbd_tbl[i],1,24);
i++; h++;
}
h=0;
}
if(j==1)
{
for(k=0;k<3;k++)
{
LCD_ShowNum(x+kbdxsize*h+26,y+18+kbdysize*1,kbd_tbl[i],1,24);
i++; h++;
}
h=0;
}
if(j==2)
{
for(k=0;k<3;k++)
{
LCD_ShowNum(x+kbdxsize*h+26,y+18+kbdysize*2,kbd_tbl[i],1,24);
i++; h++;
}
h=0;
}
}
for(k=0;k<3;k++)
{
LCD_ShowChar(x+kbdxsize*h+26,y+18+kbdysize*3,c[g],24,1);
g++;h++;
}
}
/////////////////////////////////////触摸部分////////////////////////////////
//在指定宽度的中间显示字符串
//如果字符长度超过了len,则用Show_Str显示
//len:指定要显示的宽度
//按键状态设置
//x,y:键盘坐标
//key:键值(0~8)
//sta:状态,0,松开;1,按下;
void py_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
{
u16 i=keyx/3,j=keyx%3;
if(keyx>12)return;
if(sta)LCD_Fill(x+j*kbdxsize+1,y+i*kbdysize+1,x+j*kbdxsize+kbdxsize-1,y+i*kbdysize+kbdysize-1,GREEN);
else LCD_Fill(x+j*kbdxsize+1,y+i*kbdysize+1,x+j*kbdxsize+kbdxsize-1,y+i*kbdysize+kbdysize-1,WHITE);
//Show_Str_Mid(x+j*kbdxsize,y+4+kbdysize*i,(u8*)kbd_tbl[keyx],16,kbdxsize);
//Show_Str_Mid(x+j*kbdxsize,y+kbdysize/2+kbdysize*i,(u8*)kbs_tbl[keyx],16,kbdxsize);
}
//获得键盘输入
//X,Y键盘坐标
//返回键盘值
u8 Touch_lock(u16 x,u16 y)
{
u16 i,j;
static u8 key_x=0;
u8 key=0; //键值
tp_dev.scan(0); //扫描触摸屏.0,屏幕扫描;1,物理坐标;
if(tp_dev.sta&&TP_PRES_DOWN) //触摸屏被按下
{
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
if(tp_dev.x[0]<(x+j*kbdxsize+kbdxsize)&&tp_dev.x[0]>(x+j*kbdxsize)&&tp_dev.y[0]<(y+i*kbdysize+kbdysize)&&tp_dev.y[0]>(y+i*kbdysize))
{
key=j+i*3+1;
break;
}
}
if(key)
{
if(key_x==key)key=0;
else
{
py_key_staset(x,y,key_x-1,0);
key_x=key;
py_key_staset(x,y,key_x-1,1);
}
break;
}
}
}
else if(key_x)
{
py_key_staset(x,y,key_x-1,0);
key_x=0;
LED1=0;
delay_ms(50);
LED1=1;
}
return key;
}
//判断键值输入
void inport_keynum(u16 x,u16 y,u8 key)
{
switch(key)
{
case 1:
LCD_ShowNum(x+10,y-30,1,1,24);
break;
case 2:
LCD_ShowNum(x+10,y-30,2,1,24);
break;
case 3:
LCD_ShowNum(x+10,y-30,3,1,24);
break;
case 4:
LCD_ShowNum(x+10,y-30,4,1,24);
break;
case 5:
LCD_ShowNum(x+10,y-30,5,1,24);
break;
case 6:
LCD_ShowNum(x+10,y-30,6,1,24);
break;
case 7:
LCD_ShowNum(x+10,y-30,7,1,24);
break;
case 8:
LCD_ShowNum(x+10,y-30,8,1,24);
break;
case 9:
LCD_ShowNum(x+10,y-30,9,1,24);
break;
case 10:
LCD_ShowNum(x+10,y-30,10,2,24);
break;
case 11:
LCD_ShowNum(x+10,y-30,11,2,24);
break;
case 12:
LCD_ShowNum(x+10,y-30,12,2,24);
break;
default :
key = 0;
break;
}
}
u8 identify_code(u8 key)
{
u8 state=0;
if(key!=0)
{
if((key<10||key==11)&&i<6)
{
LED1=0;
delay_ms(10);
LED1=1;
if(key==11){key=0;}
switch(key)
{
case 0:
In_code[i]=key;i++;
break;
case 1:
In_code[i]=key;i++;
break;
case 2:
In_code[i]=key;i++;
break;
case 3:
In_code[i]=key;i++;
break;
case 4:
In_code[i]=key;i++;
break;
case 5:
In_code[i]=key;i++;
break;
case 6:
In_code[i]=key;i++;
break;
case 7:
In_code[i]=key;i++;
break;
case 8:
In_code[i]=key;i++;
break;
case 9:
In_code[i]=key;i++;
break;
}
}
else
{
i=0;key=0;
for(k=0;k<6;k++)
{
if(In_code[k] == code[k]){j++;}
}
if(j==6)
{
j=0; state=1;
}
else{j=0;state=0;}
}
if(key==10)
{
In_code[i]=0;
if(i>0)
{i--;LED1=0;delay_ms(10);LED1=1;}
key=0;
}
}
return state;
}
void lock(u16 x,u16 y)
{
u8 key,state;
Display_lock(x,y);
key=Touch_lock(x,y);
inport_keynum(x+4,y,key);
state= identify_code(key);
if(state==1)
{
LCD_Fill(x+160,y-20,x+360,y+20,WHITE);
LCD_ShowString(x+160,y-20,200,40,24,"OPEN"); LED1=0;
}
}
|