儿童智能书包(二)-----------虚拟键盘设计

        想要完成触摸屏的读取与输入,自然离不开虚拟键盘,很简单的一个模板就是?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()函数填充的背景色块可以帮我们做到动态刷新功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值