单片机系统中的一种文字平滑(抗锯齿)显示方法

这是之前一个项目中已实现的方法,现在整理后拿出来分享。

单片机系统中文字显示部分一般用的是用取模软件取出字模后输出到屏幕上显示,这种方式显示的字体有锯齿,在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[i]);
		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分辨率的液晶屏),字体边缘很平滑,没有难看的锯齿:

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值