想要完成触摸屏的读取与输入,自然离不开虚拟键盘,很简单的一个模板就是?X?,先确定必要的功能:确认、课程(高中至少九种)、退出,算出占用十个格子,外加一些辅助功能:当前输入的是周几的课程、已选择哪个功能、当前状态等一些人机交互的选项,最终定的就是5X3五行三列的虚拟键盘设计,具体功能如下:
显示周几 | 显示上一次输入 | 清空本次输入 |
数学 | 语文 | 英语 |
物理 | 生物 | 化学 |
地理 | 政治 | 历史 |
录入 | 切换周几 | 取消录入 |
然后开始用画线函数:
void lcd_draw_bline(u16 x1, u16 y1, u16 x2, u16 y2,u8 size,u16 color)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
if(x1<size|| x2<size||y1<size|| y2<size)return;
delta_x=x2-x1;
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x>0)incx=1;
else if(delta_x==0)incx=0;
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;
else{incy=-1;delta_y=-delta_y;}
if( delta_x>delta_y)distance=delta_x;
else distance=delta_y;
for(t=0;t<=distance+1;t++ )
{
gui_fill_circle(uRow,uCol,size,color);
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
画一条线,起始xy和终点xy,剩下的分别是粗细和颜色。比划着在屏幕的下半段完成覆盖即可,五列三行的线条,写好后封装如load_keyboard()函数中,方便后续多次调用。
画完键盘自然就该填入内容,为减小代码体积,我就放弃了中文字库的加载,直接使用LCD_ShowString()完成英文内容填充,由240X320的3.5寸规格计算起始位置,计算字高字宽以及显示长度,根据画虚拟键盘的五行三列坐标位置计算填入每个英文课程即可。
触摸电阻屏原理就是按下时屏幕电阻不同进行触摸定位,if(tp_dev.sta&TP_PRES_DOWN)检测电阻屏是否被按下(电阻变换),通过tp_dev.x[0]<?&&tp_dev.y[0]<?这两结构体数组判断触摸区域进行定位。而虚拟键盘,键盘,很容易就让人想到51单片机初学时使用到的矩阵键盘。同样我们将每个区域打上矩阵键盘的标号,以此加算确定按下了哪个区域的虚拟键盘值,为每个区域附上功能函数即可完成虚拟键盘的设置。
以上虚拟键盘的设计基本完成,至此可以实现不变内容的展示。对于可变内容显示实时选择:我们需要用到填充函数进行“欺骗”,通常在屏幕上显示内容,无论是OLED还是LCD都是需要清屏函数进行刷新,而在我们的儿童书包里,要进行连续的课程写入则只能允许部分刷新,为此我们需要LCD_Fill()函数,根据背景色的不同填充不同的色块,色块大小可由填入内容函数那获取参考,这个“部分刷新函数”需要在可变内容区域的“新内容到来前”执行,做到手动刷新。有点绕,什么意思呢?就是“123,木头人”效果就是在你睁眼的一瞬间它完成了从旧位置到新位置这段路程的“替换”,于是现在输入周几课程、现在已选什么课程、当前状态的人机交互辅助功能就设计完成。
至此,虚拟键盘设计暂告一段落,我们通过矩阵键盘的行列扫描结合tp_dev.x[0]和tp_dev.y[0]可以确定在虚拟键盘里按下了哪个区域哪个按键值,通过预留功能函数即可方便我们日后编写AT24C02的课程内容写入,LCD_Fill()函数填充的背景色块可以帮我们做到动态刷新功能。