现象
stm32触摸屏(数字键盘)
简介
最近有个项目,为了更加高级,我决定舍弃了矩阵按键,采用了触摸屏,为了实现任意数字的输入,首先要有一个键盘,在此,我用STM32TFTLCD触屏做了一个触摸键盘(电阻屏,竖屏)。
实现流程
1、设置显示界面
void Load_keyboard(u16 x,u16 y,u8 **key_content)
{
u16 i;
BRUSH_COLOR=RED; //字体颜色为红色
keycontent=key_content;
LCD_Fill_onecolor(x,y,x+240,y+180,WHITE);
LCD_DrawRectangle(x,y,x+240,y+180);
LCD_DrawRectangle(x,y+30,x+240,y+60);
LCD_DrawRectangle(x,y+90,x+240,y+120);
LCD_DrawRectangle(x,y+150,x+240,y+180);
LCD_DrawRectangle(x+80,y+30,x+160,y+180);
BRUSH_COLOR=BLUE;
LCD_DisplayString(x+100,y+7,16,"Close");
y+=30;
for(i=0;i<15;i++)
{
LCD_DisplayString(x+(i%3)*80+6,y+7+30*(i/3),16,(u8*)keycontent[i]);
}
}
2、读取触摸数据
//返回值:1-16
u8 Get_keynum(u16 x,u16 y)
{
u16 i,j;
static u8 key_x=0;
u8 key=0;
XPT2046_Scan(0);
if(Xdown<lcd_width&&Ydown<lcd_height) //触摸屏被按下
{for(i=0;i<5;i++)
{
for(j=0;j<3;j++)
{
if(Xdown<(x+j*80+80)&&Xdown>(x+j*80)&&Ydown<(y+i*30+30)&&Ydown>(y+i*30)) //决定每一块区域所代表的值
{
key=i*3+j+1; //i代表行 每一行的变化需要变化三个值 j代表列 每一列变化仅需要变化一个值
break;
}
}
if(Xdown<240&&Xdown>0&&Ydown<170&&Ydown>140)//按的是close
{
key=16;
}
if(key) //key!=0
{
if(key_x==key)key=0;
else
{
Key_staset(x,y,key_x-1,0); //清掉上一次的高亮,不然可能一下子高亮多块
key_x=key;
Key_staset(x,y,key_x-1,1); //决定哪一块区域发生按键捕获
}
break;
}
}
}
else if(key_x) //每次从0开始 不记录上次的状态
{
Key_staset(x,y,key_x-1,0);
key_x=0;
}
delay_ms(80);
return key;
}
3、补充
u8** keycontent;
const u8* key_menu[16]={"Storage","take","Quit","1","2","3","4","5","6","7","8","9","0","DEL","OK","Close"}; //按键界面菜单
void Load_keyboard(u16 x,u16 y,u8 **key_content); //加载按键界面
void Key_staset(u16 x,u16 y,u8 keyx,u8 sta); //设置按键捕获状态
u8 Get_keynum(u16 x,u16 y); //得到按键的输入
void Key_staset(u16 x,u16 y,u8 keyx,u8 sta)
{
u16 i=keyx/3,j=keyx%3;
if(keyx>17)return;
if(sta==1)
{
if(keyx<15)
{
LCD_Fill_onecolor(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,GREEN); //当该区域被按下 区域被绿色填充
}
else//close变成绿色
{
LCD_Fill_onecolor(0+1,140+1,240-2,170-2,GREEN);
}
}
else//松手后区域恢复白色
{
if(keyx<15)
{
LCD_Fill_onecolor(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,WHITE); //当该区域被按下 区域被绿色填充
}
else//close变成绿色
{
LCD_Fill_onecolor(0+1,140+1,240-2,170-2,WHITE);
}
}
//区域被填色后重新显示
if(keyx<15)
{
LCD_DisplayString(x+j*80+6,y+7+30*i,16,(u8*)keycontent[keyx]);
}
else
{
LCD_DisplayString(100,140+7,16,"Close");
}
}
总结
这就是一套触摸屏数字键盘的模板了,我自己去网上找,一大堆没用的资料,不是收费就是啥,看的我很不舒服,我直接复刻,放在这里给需要的人使用。