OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3961|回复: 7

如何将16*16的中文字库扩大成32*32的字库

[复制链接]

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2017-8-23
在线时间
16 小时
发表于 2017-9-15 10:30:12 | 显示全部楼层 |阅读模式
这里主要写一下思路:
首先明确中文字库的取模顺序,我采用的是:阴码+逐行+顺向 (高位在前)

16*16的中文字库每一行是由2Bytes组成,而32*32的中文字库每一行是由4Bytes组成,所以只需要将每一个点扩大成两个点,比如第一个数为0x80,二进制表示为1000 0000,扩大后变为11000000 00000000,即只需要在每一个位后面插入跟前面一样的为即可。

那么纵向也需要扩大两倍,这个比较简单,只需要复制前面那一行即可。

如下是源代码:
/*
* @Description: 显示单个32x32中文字体
* @param: x,y :起点坐标
//          fc:前置画笔颜色
//          bc:背景颜色
//          s:字符串地址
//          mode:模式 0,填充模式;1,叠加模式
* @return:none
*/
void lcdDrawFont32(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
{
    u8 i,j;
    u16 k;
    u16 HZnum;
    u16 x0=x;
    u8 asc[32];
    u16 asc16[16];
    u8 zoneBitCode[2] = {0};
    u16 HZKAddr = 0;
    u32 fontAddr = 0;
    zoneBitCode[0] = *(s) - 0xa0;
    zoneBitCode[1] = *(s+1) - 0xa0;
    HZKAddr = 94*(zoneBitCode[0] - 1) + zoneBitCode[1] - 1;
    fontAddr = HZKAddr*32 + HZK16_OFFSET;
    spiflashRead(asc,fontAddr,32);
    for (i = 0; i<16; i++)
    {
        asc16[i] = (u16)(asc[i*2]<<8) | asc[i*2+1];
    }
    lcdSetWindow(x,y,x+32-1,y+32-1);
    for(i=0;i<16;i++)
    {
        for (k = 0; k < 2; k++)
        {
            for(j=0;j<16;j++)
            {
                if(!mode) //非叠加方式
                {
                    if(asc16[i]&(0x8000>>j)){
                        lcdDrawPoint16Bit(fc);
                        lcdDrawPoint16Bit(fc);
                    }
                    else {
                        lcdDrawPoint16Bit(bc);
                        lcdDrawPoint16Bit(bc);
                    }
                }
                else
                {
                    POINT_COLOR=fc;
                    if(asc16[i]&(0x8000>>j))
                    {
                        lcdDrawPoint(x,y);//画一个点
                        x++;
                        lcdDrawPoint(x,y);//画一个点
                        x++;
                    }
                    else
                    {
                        x = x+2;
                    }
                    if((x-x0)==32)
                    {
                        x=x0;
                        y++;
                        break;
                    }
                }
            }
        }
    }
    lcdSetWindow(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏
}
因为专注,所以专业!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

35

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2016-10-12
在线时间
53 小时
发表于 2017-9-15 15:44:08 | 显示全部楼层
为什么不直接用32的字库呢?那样会好看得多。
如果一定要用16字库,那你画的时候,一次显示两个点吧,每次两行都点亮
回复 支持 反对

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-9-15 16:15:31 | 显示全部楼层
扩大后的字体简直是不堪入目呀!
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2017-8-23
在线时间
16 小时
 楼主| 发表于 2017-9-18 14:22:34 | 显示全部楼层
kmmyk 发表于 2017-9-15 15:44
为什么不直接用32的字库呢?那样会好看得多。
如果一定要用16字库,那你画的时候,一次显示两个点吧,每次 ...

32位的字库暂定内存比较大,所以用扩展来做。就是将横向和纵向分别扩大一倍就可以了
因为专注,所以专业!
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2017-8-23
在线时间
16 小时
 楼主| 发表于 2017-9-18 14:23:19 | 显示全部楼层
xlong_06 发表于 2017-9-15 16:15
扩大后的字体简直是不堪入目呀!

你用的也是16*16的字库扩大成32*32的吗,我扩大的效果还可以。
因为专注,所以专业!
回复 支持 反对

使用道具 举报

34

主题

173

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1087
金钱
1087
注册时间
2017-3-10
在线时间
172 小时
发表于 2017-9-19 16:43:16 | 显示全部楼层
Mrzeng 发表于 2017-9-18 14:23
你用的也是16*16的字库扩大成32*32的吗,我扩大的效果还可以。

我以前翻倍过挺不错的啊,我的只是8*16换到16*16.
回复 支持 反对

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2017-9-19 20:58:03 | 显示全部楼层
为什么不多用一点空间呢?那样显示效果会好很多吧
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2017-8-23
在线时间
16 小时
 楼主| 发表于 2017-9-20 16:39:18 | 显示全部楼层
钩月黄昏 发表于 2017-9-19 20:58
为什么不多用一点空间呢?那样显示效果会好很多吧

FLASH资源有限啊,得省这点用,只能牺牲点效果,但整齐影响不是很大。
因为专注,所以专业!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-18 11:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表