完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
这是之前一个项目中已实现的方法,现在整理后拿出来分享。
单片机系统中文字显示部分一般用的是用取模软件取出字模后输出到屏幕上显示,这种方式显示的字体有锯齿,在DPI低的显示屏上锯齿效果非常明显。对于单色屏来说,这种情况无解。但是对于彩屏来说,如果还是用这种方式就显得有点落伍了,由于屏幕可显示的颜色丰富了许多,完全可以把显示效果做得更好,至少去掉字体边缘的锯齿。 一、思路 1、自制字体取模软件,取出所需字体的alpha值,作为字库。 2、在单片机系统上通过AlphaBlend算法,根据前景色和背景色以及字库中的alpha值,计算出最终的颜色值,显示在屏幕上。 二、解决 1、字体取模软件 作为一个老delphier,自然是用delphi xe制作了,还可以跨平台运行(win、mac、linux)。 2.单片机用的是stm32f103c8t6,显示部分的代码很简单: /************************************ / / AlphaBlend算法 / 输入: / foreground_color:前景色 / background_color:背景色 / alpha:alpha值 / 返回:最终显示的颜色值(RGB565格式) *************************************/ uint16_t LCD_AlphaBlend(uint32_t foreground_color,uint32_t background_color,uint8_t alpha){ uint16_t r=0,g=0,b=0; if((foreground_color==0xffffff)&&(background_color==0)){ //默认的前景和背景色,不做alpha计算 r=alpha; g=alpha; b=alpha; } else{ uint8_t *fg = (uint8_t *)&foreground_color; uint8_t *bg = (uint8_t *)&background_color; b = ((int)(*fg * alpha) + (int)*bg * (256 - alpha))>>8; fg++;bg++; g = ((int)(*fg * alpha) + (int)*bg * (256 - alpha))>>8; fg++;bg++; r = ((int)(*fg * alpha) + (int)*bg * (256 - alpha))>>8; } uint16_t temp= (((b >>3) & 0x1f)<<0)|(((g>>2) & 0x3f) << 5) |(((r >>3) & 0x1f) <<11); return (temp << 8) | (temp >> 8);//由于用的是DMA传输,需要高低字节互换 } /***************** *显示中文字符 ****************/ void LCD_ShowZhChar(int x,int y,char *str,uint32_t fc,uint32_t bc){ memset(fontCache, 0, sizeof(fontCache)); //fontCache是字库显示缓存,32x32x2大小 uint16_t *p = fontCache; for (int i = 0; i < ZH_FONT_WIDTH*ZH_FONT_HEIGHT; i++) { *p = LCD_AlphaBlend(fc,bc, gZhFont); p++; } LCD_setAddrWindow(x, y, x+ZH_FONT_WIDTH-1, y+ZH_FONT_HEIGHT-1);//设置显示区域 SPI_LCD_CS_LOW(); SPI_LCD_DATA_R(); LCD_DMA_Send((uint8_t *)fontCache, sizeof(fontCache)); //DMA发送 while(is_LCD_DMA_busy); SPI_LCD_CS_HIGH(); } 显示效果非常理想(用的是0.96寸80x160分辨率的液晶屏),字体边缘很平滑,没有难看的锯齿: |
|
|
|
只有小组成员才能发言,加入小组>>
3314 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9059 浏览 16 评论
4088 浏览 18 评论
1178浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 04:42 , Processed in 2.112548 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号