打印

如何给不带字库的12864设计小型字库?

[复制链接]
4662|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wang12zhe|  楼主 | 2013-5-29 20:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的12864液晶不带字库,显示一个或者几个汉字我会,可以、把要显示的汉字编码放在数组里,
但是有一个问题,当汉字有重复字的话数组会很大,
例如:高高兴兴快快乐乐,每个汉字在数组里都需要保存编码,

有什么办法在字模里相同的汉字只保存一次,是用的时候查找对应汉字的编码即可,

请大神指教。

相关帖子

沙发
吾要单片机| | 2013-5-29 20:56 | 只看该作者
“汉字有重复字的话数组会很大”,不能理解。你不会用索引吗?

使用特权

评论回复
板凳
wang12zhe|  楼主 | 2013-5-29 21:24 | 只看该作者
吾要单片机 发表于 2013-5-29 20:56
“汉字有重复字的话数组会很大”,不能理解。你不会用索引吗?

小菜鸟一个,不会用索引,请说一下原理,非常感谢

使用特权

评论回复
地板
吾要单片机| | 2013-5-29 21:27 | 只看该作者
你可以在网上搜索相关例程,你就会明白的。

使用特权

评论回复
5
wang12zhe|  楼主 | 2013-5-29 21:39 | 只看该作者
吾要单片机 发表于 2013-5-29 21:27
你可以在网上搜索相关例程,你就会明白的。

额  搜了 但是没找到,给点提示吧,感激

使用特权

评论回复
6
吾要单片机| | 2013-5-29 21:46 | 只看该作者
C51程序集里面就有

使用特权

评论回复
7
wang12zhe|  楼主 | 2013-5-29 22:08 | 只看该作者
吾要单片机 发表于 2013-5-29 21:46
C51程序集里面就有

额  我承认自己很笨 但想学习……

使用特权

评论回复
8
吾要单片机| | 2013-5-29 22:11 | 只看该作者
你要买本书看才行,这很重要,不能指望在网上发贴解决问题的。

使用特权

评论回复
9
LSHSULE| | 2013-5-29 22:38 | 只看该作者

使用特权

评论回复
10
通宵敲代码| | 2013-6-1 16:26 | 只看该作者
可以用数组的方式建库(最好写在头文件里方便重复使用),然后加一个函数,方便对数组中的编码查找,调用的时候用数组偏移量或指针甚至是简单的编号都行。

使用特权

评论回复
11
kk8346| | 2013-6-1 21:10 | 只看该作者
本帖最后由 kk8346 于 2013-6-1 21:16 编辑

我是这样做的,供你参考。

以16*16汉字为例:
1、将汉字的字模数据做成结构体,结构体中包括汉字内码和字模。如下:
/** @brief  汉字字库结构体(顺序必须与字库对应) */
typedef struct
{
uint8_t                      Font[32];      ///< 字模(字形数据)【汉字16x16,为32字节】
TYPE_CHAR_CODE   Hanzi;            ///< 汉字(内码)
} TYPE_HANZI;

定义一个字模数组,数组中的每个元素是一个结构体,对应一个汉字:
const TYPE_HANZI FONT_Hanzi16x16[] =
{
0xC0,0x80,0x80,0x00,0xFC,0x80,0x80,0x80,0xFC,0x80,0x80,0x80,0x80,0xFE,0x00,0x00,
0x00,0x03,0x01,0x30,0x7F,0x01,0x01,0x31,0x7F,0x01,0x01,0x01,0x61,0xFF,0x00,0x00,     "主",
0x00,0x00,0xFE,0x30,0xF0,0x30,0x30,0x30,0xB0,0xF0,0x1F,0x06,0x80,0xC0,0x60,0x00,
0x0C,0x0C,0x0D,0x0C,0x7F,0x6C,0x6C,0x66,0x67,0x66,0x63,0x63,0x61,0x3E,0x18,0x00,  "功",
0x0C,0x1C,0x6C,0xC6,0xFF,0xC6,0x00,0xFE,0xC6,0xFE,0xC6,0xFE,0xC6,0xC6,0xF6,0x66,
0x06,0x06,0x76,0x1E,0x67,0xE6,0x7E,0x00,0x06,0x76,0x1E,0x06,0x66,0xE6,0x7C,0x00,    "能",
}

2、需要显示某个汉字时,给出汉字的内码,让函数在字模数组中查找相同的汉字内码,一旦找到相同的汉字内码,则就找到了字模数组的索引,然后就将该索引对应的字模数据送显示。以显示“主”字为例:
本函数为显示汉字函数:LCD_DisplayString("主要问题");
当遇到“主”字时(编译器对于“主”字,是以内码方式存储),程序要用“主”字的内码去字模数组FONT_Hanzi16x16[]中查找,一旦找到,则其索引就确定了,然后,对应的32个字节的字模数据就找到了,就可以送给液晶显示了。
例如:“主”字在上面的数组的FONT_Hanzi16x16[0],即其索引为0,则其字模数据都在FONT_Hanzi16x16[0]中。


回到你的问题上,“高高兴兴快快乐乐”,只需要在字库中存放“高兴快乐”4个汉字的结构体数据。
然后,调用时:LCD_DisplayString("高高兴兴快快乐乐");
在LCD_DisplayString()这个函数中,每遇到一个汉字,就去字库里查找,显示。直到把所有汉字都显示完。

我的做法就是这样,仅供参考。







使用特权

评论回复
12
renwocai| | 2013-6-2 09:45 | 只看该作者
kk8346 发表于 2013-6-1 21:10
我是这样做的,供你参考。

以16*16汉字为例:

非常感谢。
第二步具体是怎样做的?还能具体些吗?

使用特权

评论回复
13
lcdi| | 2013-6-2 14:02 | 只看该作者
你可以每个字建立一个数组,不同的字调用不同的数组,同一个字调用同一个数组。

使用特权

评论回复
14
kk8346| | 2013-6-2 20:20 | 只看该作者
具体显示时的处理:

/** @brief  汉字字库结构体(顺序必须与字库对应) */
typedef struct
{
uint8_t   Font[32]; ///< 字模(字形数据)【汉字16x16,为32字节】
uint8_t   Hanzi[2];  ///< 汉字(内码)
} TYPE_HANZI;


假定构造一个显示函数:LCD_DisplayString(uint8_t *string);该函数的输入是指向待显示的字串的指针。
函数内部可以这样处理:
    根据汉字内码(两个字节),去字库数组中查找相同的内码:使用if语句判断
    找到之后,该汉字在数组中的位置就找到了,于是其对应的字模数据也就找到了。
    然后,将这个字模数据送去显示就行了。
    在函数内部,依次处理每个汉字。汉字是以两字节形式存放在程序代码中。(可以把这两个字节组合成一个双字节数,也可以分解成两个单字节数。)
    这里假定分解成两个单字节数:

LCD_DisplayString(uint8_t *string);
{
   //处理单个汉字的代码段
    HanziCodeHi  = string[0]; //汉字内码分解成单字节
    HanziCodeLo = string[1];

    for (使用变量index,在整个数组中遍历一次)
    {
         if((HanziCodeHi  = FONT_Hanzi16x16[index].Hanzi[0])&& (HanziCodeLo = FONT_Hanzi16x16[index].Hanzi[1])) //内码相同,表明就是要显示的那个汉字
        {
             //找到对应的汉字了,于是FONT_Hanzi16x16[index]就是对应这个汉字的数组元素,相应的字模数据就是FONT_Hanzi16x16[index].Font
         }
    }
}

大概思路就是这样。
(帖子里面不好排版,凑合着看吧)



使用特权

评论回复
15
wang12zhe|  楼主 | 2013-6-3 09:11 | 只看该作者
kk8346 发表于 2013-6-1 21:10
我是这样做的,供你参考。

以16*16汉字为例:

非常感谢!方法很给力

使用特权

评论回复
16
renwocai| | 2013-6-3 10:29 | 只看该作者
kk8346 发表于 2013-6-2 20:20
具体显示时的处理:

/** @brief  汉字字库结构体(顺序必须与字库对应) */

谢谢,我还得补下结构体

使用特权

评论回复
17
renwocai| | 2013-6-3 10:32 | 只看该作者
一个含有数组的结构体的数组

使用特权

评论回复
18
秦时明月94| | 2014-9-28 17:09 | 只看该作者
kk8346 发表于 2013-6-2 20:20
具体显示时的处理:

/** @brief  汉字字库结构体(顺序必须与字库对应) */

那显示英文呢? 只有八位,要从新写一个显示字母函数吧

使用特权

评论回复
19
秦时明月94| | 2014-9-28 17:09 | 只看该作者
那显示英文呢? 只有八位,要从新写一个显示字母函数吧

使用特权

评论回复
20
zhaoyu2005| | 2014-9-28 19:28 | 只看该作者
上ucgui吧,可以自建字库,有专门的工具,很方便

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

205

帖子

1

粉丝