这个的效果是字体放大。ZLGGUI里,如果要多做几种字体显示的话,就会有好几个字体库,程序代码会越来越大。又不想做外部存储,这样要单独的写专门烧写flash的代码。
我想把点阵数据当图片处理。然后用图片处理的办法来放大它。
先试了一下在函数上改。没有研究算法,直接改出来的。
出来的效果还可以用,虽然很粗糙,但实现简单。分享上来接受大家批评
原来显示方式:// GUI_PutString72_72(20, 100,"ABCD");//需要一个72×72的库
修改后显示: GUI_PutString24_24_AMP(10, 80,3,"ABCD");//一个24×24的就够了
原来的调用函数:
/**
* @brief 显示ASCII码(24*32字体),显示值为'0'-'9'、'.'、'+'、'-'及'若为其它值,则显示' ')。
* @param x 指定显示位置,x坐标
* @param y 指定显示位置,y坐标
* @param ch 要显示的ASCII码值。
* @retval None
*/
unsigned char GUI_PutChar24_24( int x, int y, unsigned char ch )
{
unsigned char font_dat;
unsigned char i, j;
unsigned char get_color_back[2], get_color_disp[2];
bit color_back_disp = 0;
get_color_2( back_color[0], back_color[1], back_color[2], get_color_back );
get_color_2( disp_color[0], disp_color[1], disp_color[2], get_color_disp );
/* 参数过滤 */
if ( x > (GUI_LCM_XMAX - 24) )
return(0);
if ( y > (GUI_LCM_YMAX - 24) )
return(0);
for ( i = 0; i < sizeof(FONT24x24_TAB); i++ )
{
if ( FONT24x24_TAB[i] == ch )
break;
}
ch = i;
Set_xywh( x, y, 24, 24 ); /* 画图区域 */
for ( i = 0; i < 24; i++ ) /* 显示共32行 */
{
for ( j = 0; j < 24; j++ ) /* 每行共24点 */
{ /* 若当前点为0、8、16点,读取点阵数据 */
/*
* font_dat = 0xff;
* if( (j&0x07)==0 ) font_dat = FONT24x32[ch][i*3+j>>3];//+j>>3
*/
if ( j == 0 )
font_dat = FONT24x24[ch][i * 3]; /* +j>>3 */
if ( j == 8 )
font_dat = FONT24x24[ch][i * 3 + 1]; /* +j>>3 */
if ( j == 16 )
font_dat = FONT24x24[ch][i * 3 + 2]; /* +j>>3 */
/* 设置相应的点为color或为back_color */
if ( (font_dat & DCB2HEX_TAB[j % 8]) == 0 )
color_back_disp = 0;
else color_back_disp = 1;
if ( color_back_disp == 1 )
{
write_DISPdata_16( get_color_disp[0], get_color_disp[1] );
}else{
write_DISPdata_16( get_color_back[0], get_color_back[1] );
}
}
y++; /* 指向下一行 */
}
return(1);
}
/**
* @brief 输出显示字符串(没有自动换行功能)。
* @param x 指定显示位置,x坐标
* @param y 指定显示位置,y坐标
* @param str 要显示的ASCII码串。
* @retval None
*/
void GUI_PutString24_24( int x, int y, char *str )
{
while ( 1 )
{
if ( (*str) == '\0' )
break;
if ( GUI_PutChar24_24( x, y, *str++ ) == 0 )
break;
x += 25; /* 下一个字符显示位置,y不变(即不换行) */
}
}
复制代码
修改后的函数:就是在原函数上增加了一个amp做乘数
/**
* @brief 显示ASCII码(24*32字体),显示值为'0'-'9'、'.'、'+'、'-'及'若为其它值,则显示' ')。
* @param x 指定显示位置,x坐标
* @param y 指定显示位置,y坐标
* @param amp 放大倍数
* @param ch 要显示的ASCII码值。
* @retval None
*/
unsigned char GUI_PutChar24_24_AMP( int x, int y, int amp, unsigned char ch )
{
unsigned char font_dat;
unsigned char i, j;
unsigned char get_color_back[2], get_color_disp[2];
bit color_back_disp = 0;
get_color_2( back_color[0], back_color[1], back_color[2], get_color_back );
get_color_2( disp_color[0], disp_color[1], disp_color[2], get_color_disp );
/* 参数过滤 */
if ( x > (GUI_LCM_XMAX - 24) )
return(0);
if ( y > (GUI_LCM_YMAX - 24) )
return(0);
for ( i = 0; i < sizeof(FONT24x24_TAB); i++ )
{
if ( FONT24x24_TAB[i] == ch )
break;
}
ch = i;
Set_xywh( x, y, 24 * amp, 24 * amp ); /* 画图区域 */
for ( i = 0; i < (24 * amp); i++ ) /* 显示共32行*/
{
for(j=0; j<(24*amp); j++) /* 每行共24点 */
{ /* 若当前点为0、8、16点,读取点阵数据 */
/*
* font_dat = 0xff;
* if( (j&0x07)==0 ) font_dat = FONT24x32[ch][i*3+j>>3];//+j>>3
*/
if ( j / amp == 0 )
font_dat = FONT24x24[ch][i / amp * 3]; /* +j>>3 */
if ( j / amp == 8 )
font_dat = FONT24x24[ch][i / amp * 3 + 1]; /* +j>>3 */
if ( j / amp == 16 )
font_dat = FONT24x24[ch][i / amp * 3 + 2]; /* +j>>3 */
/* 设置相应的点为color或为back_color */
if ( (font_dat & DCB2HEX_TAB[(j / amp) % 8]) == 0 )
color_back_disp = 0;
else color_back_disp = 1;
if ( color_back_disp == 1 )
{
write_DISPdata_16( get_color_disp[0], get_color_disp[1] );
}else{
write_DISPdata_16( get_color_back[0], get_color_back[1] );
}
}
y++; /* 指向下一行 */
}
return(1);
}
/**
* @brief 输出显示字符串(没有自动换行功能)。自动放大
* @param x 指定显示位置,x坐标
* @param y 指定显示位置,y坐标
* @param amp 放大倍数
* @param str 要显示的ASCII码串。
* @retval None
*/
void GUI_PutString24_24_AMP( int x, int y, int amp, char *str )
{
while ( 1 )
{
if ( (*str) == '\0' )
break;
if ( GUI_PutChar24_24_AMP( x, y, amp, *str++ ) == 0 )
break;
x += 25 * amp; /* 下一个字符显示位置,y不变(即不换行) */
}
}
复制代码
显示效果:3倍放大转载
|