原子LCD屏汉字显示程序的优化

2019-07-20 22:30发布

原子例程提供了使用外接字库芯片的汉字显示程序,对于大部分的应用来说,屏幕显示的汉字在100个左右,而且对于4.3寸屏来说,24点阵显示偏小,需要48点阵字库,外接字库芯片会增加硬件成本。参照原子例程中ASC码的显示方法,使用自造点阵数据,显示少量的汉字,完全能满足大部分设计的应用。 其汉字的显示方法是:读出汉字编码→取出对应编码汉字点阵→逐点显示→完成。 此方法虽能显示出汉字,但显示速度较慢。我们进行了测试,显示11个48点阵汉字需140ms。 经仔细查看资料,认真观看原子视频,认为程序还有很大的优化空间,对以上汉字显示程序进行改进,以提高汉字显示速度。 优化内容:1、屏幕初始化部分。原子例程适应于多种显示屏,而在实际应用中,就是一种显示屏,所以在初始化程序中删除多余程序,只留下现用的屏程序。虽然初始化部分不影响显示速度,可也减少程序占用空间。2、将取汉字点阵改为取汉字点阵指针,减少一次读取点阵过程。3、就是优化的关键,将逐点显示改为设定初始点坐标,并设定显示数据宽度,采用连续输出点阵数据的方法。这样,48点阵的汉字的显示,就少了2300多次坐标点设定,大大提高了显示速度。4、将调用短函数内的指令直接写到函数中,减少程序跳转。5、ASC码的显示也照此方法优化。6、在程序中空格一般显示较多,可将空格显示单独列出,不用读字库,而直接写底 {MOD}数据。 我的项目使用原子的4.3寸电容触摸屏,横屏显示,所以点阵取模方式采用逐行式,将例程中的ASC码字模要重新取模,汉字也要用逐行式取模。竖屏显示是不是采用逐列式,我没有验证。
通过以上程序优化,经实测,显示11个48点阵汉字的时间是14ms,只有原程序的十分之一,效果明显。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
大个之
1楼-- · 2019-07-20 22:51
汉字显示程序较长,不方便贴出。这里我放上画横线和画竖线程序,即能明白程序优化原理。
//画水平线
//x0,y0:坐标
//len:线长度
//color:颜 {MOD}
void gui_draw_hline(u16 x0,u16 y0,u16 len)
{
        u16 j;
       
        LCD->LCD_REG = lcddev.setxcmd; LCD->LCD_RAM = x0 >> 8;
        LCD->LCD_REG = lcddev.setxcmd + 1; LCD->LCD_RAM = x0;
        LCD->LCD_REG = lcddev.setxcmd + 2; LCD->LCD_RAM = (x0 + len - 1) >> 8;
        LCD->LCD_REG = lcddev.setxcmd + 3; LCD->LCD_RAM = (x0 + len - 1);        //宽度
        LCD->LCD_REG = lcddev.setycmd; LCD->LCD_RAM = y0 >> 8;
        LCD->LCD_REG = lcddev.setycmd+1; LCD->LCD_RAM = y0;
        LCD->LCD_REG = lcddev.wramcmd;
        for(j = 0;j < len; j++) LCD->LCD_RAM = POINT_COLOR;        //显示颜 {MOD}             
}
//画垂直线
//x0,y0:坐标
//len:线长度
//color:颜 {MOD}
void gui_draw_lline(u16 x0,u16 y0,u16 len)
{
        u16 j;
       
        LCD->LCD_REG = lcddev.setxcmd; LCD->LCD_RAM = x0 >> 8;
        LCD->LCD_REG = lcddev.setxcmd + 1; LCD->LCD_RAM = x0;
        LCD->LCD_REG = lcddev.setxcmd + 2; LCD->LCD_RAM = x0 >> 8;
        LCD->LCD_REG = lcddev.setxcmd + 3; LCD->LCD_RAM = x0;        //宽度
        LCD->LCD_REG = lcddev.setycmd; LCD->LCD_RAM = y0 >> 8;
        LCD->LCD_REG = lcddev.setycmd+1; LCD->LCD_RAM = y0;
        LCD->LCD_REG = lcddev.wramcmd;                    //开始写入GRAM         
        for(j = 0;j < len; j++) LCD->LCD_RAM = POINT_COLOR;        //显示颜 {MOD}             
}

一周热门 更多>