视频演示:(有点粗糙,很多没细节没去弄了)
电子锁触摸屏
直接使用正点原子实验26触摸屏实验进行添加:
这里借用了博客基于STM32的TFT触摸屏虚拟按键_鱼鱼不秃头的博客-CSDN博客_stm32触摸屏设置按键的代码
①设置显示界面
只需根据你所用lcd的大小来改变参数即可;
void Load_keyboard(u16 x,u16 y,u8 **key_content)
{
u16 i;
POINT_COLOR=RED; //
keycontent=key_content;
LCD_Fill(x,y,x+240,y+150,WHITE);
LCD_DrawRectangle(x,y,x+240,y+150);
LCD_DrawRectangle(x+80,y,x+160,y+150);
LCD_DrawRectangle(x,y+30,x+240,y+60);
LCD_DrawRectangle(x,y+90,x+240,y+120);
LCD_DrawRectangle(x,y-46,x+240,y+150);
LCD_ShowString(x+5, y-30, 200, 16, 16,"secret = ");
POINT_COLOR=BLUE;
for(i=0;i<15;i++)
{
//if(i==1) //":"不需要中间显示
LCD_ShowString(x+(i%3)*80+2,y+7+30*(i/3),40,16,16,(u8*)keycontent[i]);
//else
//Show_Str_Mid(x+(i%3)*80,y+7+30*(i/3),(u8*)keycontent[i],16,80);
}
}
②设置按键显示存储函数
// x, y 为显示的初始坐标, keyx, keyy 为触摸坐标
void Press_down_Fill(u16 x, u16 y, int keyx, int keyy)
{
int i, j, status, ii1, ii2, jj1, jj2;
int ret=0, mean, del=0, enter=0, a, b;
i = keyx / 80;
j = (keyy - 150) / 30;
ii1 = x+80*i;
jj1 = y+30*j;
ii2 = x+80*(i+1);
jj2 = y+30*(j+1);
status = j*3 + i + 1;
if (keyy>150&&keyy<300)
{
if(tp_dev.sta&TP_PRES_DOWN)
{
LCD_Fill(ii1+2, jj1+2, ii2-2, jj2-2, GREEN);
POINT_COLOR=BLUE;
LCD_ShowString(ii1+2, jj1+7, 40, 16, 16, (u8*)keycontent[status-1]);
delay_ms(500);
LCD_Fill(ii1+2, jj1+2, ii2-2, jj2-2, WHITE);
POINT_COLOR=BLUE;
LCD_ShowString(ii1+2, jj1+7, 40, 16, 16, (u8*)keycontent[status-1]);
tp_dev.x[0] = 65536;
tp_dev.y[0] = 65536;
}
/*else
{
LCD_Fill(ii1+2, jj1+2, ii2-2, jj2-2, WHITE);
POINT_COLOR=BLUE;
LCD_ShowString(ii1+2, jj1+7, 40, 16, 16, (u8*)keycontent[status-1]);
tp_dev.x[0] = 65536;
tp_dev.y[0] = 65536;
}*/
switch(status-1){
case 0: ret = 1; break;
case 3: mean = 1; break;
case 4: mean = 2; break;
case 5: mean = 3; break;
case 6: mean = 4; break;
case 7: mean = 5; break;
case 8: mean = 6; break;
case 9: mean = 7; break;
case 10: mean = 8; break;
case 11: mean = 9; break;
case 12: del = 1; break;
case 13: mean = 0; break;
case 14: enter = 1; break;
}
if (ret == 1)
{
for(a=0;a<=num;a++)
input[a] = 0;
num = 0;
LCD_Fill(70, 110, 180, 140, WHITE);
ret = 0;
}
else if (del == 1)
{
num = num-1;
input[num] = ' ';
//LCD_ShowNum(80+num*10, 120, 0, 1, 16);
LCD_Fill(80+num*10, 110, 180, 140, WHITE);
del = 0;
}
else if (enter == 1)
{
for(a=0;a<num;a++)
{
if (secret[a] == input[a])
{
bingo = 1;
LCD_ShowString(100, 90, 200, 16, 16,"secret yes");
}
else
{
bingo = 0;
LCD_ShowString(100, 90, 200, 16, 16,"secret no");
}
}
num = 0;
enter = 0;
}else
{
LCD_ShowNum(60, 90, num, 1, 16);
LCD_ShowNum(70, 90, num, 1, 16);
input[num] = mean;
switch(num){
case 0: LCD_ShowNum(60+20, 120, input[num], 1, 16); break;
case 1: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
LCD_ShowNum(70+20, 120, input[num], 1, 16);} break;
case 2: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
LCD_ShowNum(70+20, 120, input[1], 1, 16);
LCD_ShowNum(80+20, 120, input[num], 1, 16);} break;
case 3: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
LCD_ShowNum(70+20, 120, input[1], 1, 16);
LCD_ShowNum(80+20, 120, input[2], 1, 16);
LCD_ShowNum(90+20, 120, input[num], 1, 16);} break;
case 4: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
LCD_ShowNum(70+20, 120, input[1], 1, 16);
LCD_ShowNum(80+20, 120, input[2], 1, 16);
LCD_ShowNum(90+20, 120, input[3], 1, 16);
LCD_ShowNum(100+20, 120, input[num], 1, 16);} break;
case 5: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
LCD_ShowNum(70+20, 120, input[1], 1, 16);
LCD_ShowNum(80+20, 120, input[2], 1, 16);
LCD_ShowNum(90+20, 120, input[3], 1, 16);
LCD_ShowNum(100+20, 120, input[4], 1, 16);
LCD_ShowNum(110+20, 120, input[num], 1, 16);} break;
case 6: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
LCD_ShowNum(70+20, 120, input[1], 1, 16);
LCD_ShowNum(80+20, 120, input[2], 1, 16);
LCD_ShowNum(90+20, 120, input[3], 1, 16);
LCD_ShowNum(100+20, 120, input[4], 1, 16);
LCD_ShowNum(110+20, 120, input[5], 1, 16);
LCD_ShowNum(120+20, 120, input[num], 1, 16);} break;
case 7: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
LCD_ShowNum(70+20, 120, input[1], 1, 16);
LCD_ShowNum(80+20, 120, input[2], 1, 16);
LCD_ShowNum(90+20, 120, input[3], 1, 16);
LCD_ShowNum(100+20, 120, input[4], 1, 16);
LCD_ShowNum(110+20, 120, input[5], 1, 16);
LCD_ShowNum(120+20, 120, input[6], 1, 16);
LCD_ShowNum(130+20, 120, input[num], 1, 16);} break;
case 8: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
LCD_ShowNum(70+20, 120, input[1], 1, 16);
LCD_ShowNum(80+20, 120, input[2], 1, 16);
LCD_ShowNum(90+20, 120, input[3], 1, 16);
LCD_ShowNum(100+20, 120, input[4], 1, 16);
LCD_ShowNum(110+20, 120, input[5], 1, 16);
LCD_ShowNum(120+20, 120, input[6], 1, 16);
LCD_ShowNum(130+20, 120, input[7], 1, 16);
LCD_ShowNum(140+20, 120, input[num], 1, 16);} break;
case 9: {LCD_ShowNum(60+20, 120, input[0], 1, 16);
LCD_ShowNum(70+20, 120, input[1], 1, 16);
LCD_ShowNum(80+20, 120, input[2], 1, 16);
LCD_ShowNum(90+20, 120, input[3], 1, 16);
LCD_ShowNum(100+20, 120, input[4], 1, 16);
LCD_ShowNum(110+20, 120, input[5], 1, 16);
LCD_ShowNum(120+20, 120, input[6], 1, 16);
LCD_ShowNum(130+20, 120, input[7], 1, 16);
LCD_ShowNum(140+20, 120, input[8], 1, 16);
LCD_ShowNum(150+20, 120, input[num], 1, 16);} break;
}
num++;
delay_ms(2000);
if (num==10)
num = 0;
}}
}
其中 tp_dev.x[x]、tp_dev.y[y] 为触摸坐标,点击数字按钮可以输入十位以内的密码,若与设置的密码相同则密码正确,显示“secret yes”,否则“secret no”,要注意TFT时电阻屏,博主一开始在测试的时候,将许多显示代码写到了电容屏测试函数中,导致没有任何测试效果,还卡了一会。在显示密码的时候直接用了笨办法,就是输入的几位数字就显示几位。