OpenEdv-开源电子网

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

实现液晶显示16×16、24×24、32×32、40×40汉字包括图标10种字体

  [复制链接]

4

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
351
金钱
351
注册时间
2013-4-23
在线时间
98 小时
发表于 2013-6-8 12:53:05 | 显示全部楼层 |阅读模式
     已过天命之年,自Protues仿真学习AVR也有大半年时间了,一直对STM32望而却步,不敢涉足,怀着Protues8.0能仿真STM32的期待,结果失望,无奈经不住STM32高性能和低价格的诱惑,在克服对STM32超长C代码和复杂的寄存器操作恐惧后,还是踏进了STM32之门,一个月来,初学的困惑加之零基础的C语言知识,正是应了那句古语:“少壮不努力,老大图伤悲”。
    首次发贴,诚惶诚恐,不当之处,还请各位单片机的先驱们斧正。本着开源精神和为后来初学者释疑的意图,把这半个月来对彩屏液晶汉字显示的理解,所做的一点努力与各位爱好者共享。

      一、汉字字库的制作
    汉字的取模采用软件ts3“点阵字库生成器3.8”模式用“横向取模方式1”,软件网上可以找到。用该软件可以制作任何字体和不大于32×32字号的汉字库。注意:做好的字库要用ULTRAEDIT或WINHEX等编辑软件,将字库从后面开始所有0X00的字节直到不含0x00的那些行删掉,以减少字库大小。
    ASCII码取模,用PCtoLCD2002.exe软件制作,取模方式“顺向(高位在前)、逐行式”按16×16、24×24等方式取模,保存C文件,删除文件内的注释部份,只保存纯粹的16进制文件如:0x00,0x00,注意删除最后一个逗号,网上下载C文件转BIN软件,将ASCII的C文件转成字库文件.bin后缀文件。
      二、图标字库的制作
    在选择字体制作的时候,偶然选择了WINDOWS自带的WEBDINGS等4个字体,打开看到是一些图标字库,于是产生了制作图标字库用于液晶屏显示的想法,字库可不可以编辑修改,制作自己要求的图标呢?网上搜索果然有这样软件,下载字库编辑 FontCreator如下图:该软件非常容易上手,几分钟就可以熟练使用,十分方便。
    1、我选择的是修改WEBDINGS字库,先备份WINDOWS\FONTS\WEBDINGS.TTF文件、然后删除该文件,用备份的文件复制一个取名为:WEB.TTF(因Webdings.ttf文件是WINDOWS系统管理的文件,无论你取什么名,最后复制粘贴安装的时候都会默认为Webdings.ttf名字)。
    2、图标准备:可以选择任何后缀的图像文件,ICO、JPG、png等文件,用Photoshop等软件做去色处理,转换成黑白图像,转存为jpg后缀的文件,或者用矢量图制作软件CorelDraw、图标制作软件 IconWorkshop,无论什么图像只要是黑白的即可。用FontCreator软件开始每个字的修改,调整尺寸不超边界即可,FontCreator的任何设置不要修改,保持默认,你只要做插入图像、调整尺寸的排版工作。
    3、特别说明:ASCII码的后128个图标,因为键盘无法输入(包括ALT+小键盘数字组合),不必修改,可以把你喜欢的复制到94个ASCII码的区域里。“””和“\”对应的图标可以不用修改,因为C编译器认为在输出字符串的时候为非法字符。
      三、字库更新
    说实话,刚转入STM32才接触到无处不在的结构体C语句,目前还不会使用,只好按照自己的想法,采用笨办法来更新字库,好在字库更新只做1、2次而已。用ULTRAEDIT打开字库文件,依次追加其他字库文件,需记住追加字库的名称和起始地址,如:宋体16×16的地址是0002DD90H------0006DBCFH那么把起始地址0002DD90H转换到10进制为:187792,后追加的字库如果不占整行,用00补齐。4.3寸的液晶屏的FLASH是W25Q16换成8M字节的W25Q64,SD卡的FATFS文件系统打不开大于2M字节的文件,因此制作了5个字库文件,每个大约1-1.7M左右,用开发板带的更新字库函数,分5次刷入FLASH中,注意:第二次以后刷入的时候,要修改文件名,屏蔽擦除整片FLASH的语句,修改写入地址即可。
      四、汉字显示的实现
    既然是单片机控制彩屏,那么单一的16×16的汉字显示,在界面设计上就显得力不从心了。尤其的4.3寸以上的彩屏,蝇头小字显得比例失调,因此就需要大字体来做显示,那末,如何实现大字体显示呢?且看板商提供的显示一个16×16汉字的部份程序:
       pusMsk = (uint16_t *)pucMsk;
      for(i=0; i<16; i++)                                    /* 保存当前汉字点阵式字模 */
    {   mod = *pusMsk++;                                /* 取得当前字模,半字对齐访问*/
        mod = ((mod & 0xff00) >> 8) | ((mod & 0x00ff) << 8);/* 字模交换高低字节(为了显示  需要  */
    }
    y0 = y;
    for(i=0; i<16; i++)                                    /* 16行 */
    {                                                                     /* 直接显示 */        //准备写GRAM
        for(j=0; j<16; j++)                                /* 16列       */
        {    if((mod << j)& 0x8000)                     /* 显示字模  */
            { LCD_SetPoint(x+j,y0,0x0); // 字符颜色
            }         else         {
                LCD_SetPoint(x+j,y0,0xffff); // 字符颜色                    /* 用读方式跳过写空白点的像素*/
                }
        }
        y0++;
    }
      从程序上看,意图很明显,就是要取一个汉字的16行,16列去显示,可这并不是遵循取模原理去显示的,为了兼顾显示问题,只好在一个大循环中做高低字节的交换,一个无为的字节交换。开始移植24×24汉字的时候,就被这无为的字节交换逼近死胡同里了。于是,回头看看汉字的取模原理,原来取模是分横向和竖向,分高位在前和地位在前的,所以回显也必须遵循这个原则。以横向取模高位在前为例,是按行取,每次取1个字节,所以就存在这样的关系:
      16×16  每行2个字节,24×24 每行3个字节,32×32 每行4个字节 ,40×40 每行5个字节,依次类推。每个字所占容量是:SIZE×SIZE/BYTE
     明白这个关系,剩下的就是如何读取这些点到数组,如何从这个数组中取数,送到什么位置显示的问题了,解决了1个字号的显示,其他任何字号的汉字显示迎刃而解。
     实现显示1个汉字的程序如下:

u16 LCD_Show_Word(u16 x,u16 y,u8 FONT,u8 SIZE,u8 MODE,u16 CharColor,u16 bkColor,u8 *Str)
{
        u8 k,i,j,qh,wh,EN_BUF,HZ_BUF; 
        u8 NEXT=2,H;//,QH
        u32 offset, HZ_OFFSET,EN_OFFSET;
        char buffer[200];        /*汉字缓存,取最大的40×40字体,备忘2013-5-22数组的长度不能用变量*/
        H = SIZE/BYT;       //汉字行占字节个数  备忘2013-5-22使用预编译#if等语句时,变量必须是个确定值
    switch (SIZE)   //字体大小判断
        {    
         case  16:  EN_BUF=EN_16BUF, HZ_BUF=HZ_16BUF, NEXT--, EN_OFFSET = EN_ADD_ST16 ; 
             switch (FONT)
                 {
                      case 0: HZ_OFFSET = HZ_ADD_ST16 ;   break;//汉字16×16地址
                 case 1: HZ_OFFSET = HZ_ADD_KT16 ;   break;
                 case 2: HZ_OFFSET = HZ_ADD_HT16 ;   break;
                 case 3: HZ_OFFSET = HZ_ADD_YH16 ;   break;                
                 case 4: HZ_OFFSET = HZ_ADD_XK16  ;  break;
                 case 5: HZ_OFFSET = HZ_ADD_CY16 ;   break;        
                 case 6: HZ_OFFSET = WEB_ADD_16;     break;
                 case 7: HZ_OFFSET = WEB_DINGS_16;   break;
                 case 8: HZ_OFFSET = WING_DINGS_16;  break;
                 case 9: HZ_OFFSET = WING_DINGS2_16; break;
                default: break;                                                 
                }
           break;
          case  24: EN_BUF=EN_24BUF, HZ_BUF=HZ_24BUF, EN_OFFSET = EN_ADD_ST24; 
                switch (FONT)
                 {
                 case 0: HZ_OFFSET = HZ_ADD_ST24 ;   break;
                 case 1: HZ_OFFSET = HZ_ADD_KT24 ;   break;
                 case 2: HZ_OFFSET = HZ_ADD_HT24 ;   break;
                 case 3: HZ_OFFSET = HZ_ADD_YH24 ;   break;                
                 case 4: HZ_OFFSET = HZ_ADD_XK24 ;   break;
                 case 5: HZ_OFFSET = HZ_ADD_CY24 ;   break;        
                 case 6: HZ_OFFSET = WEB_ADD_24  ;   break;
                 case 7: HZ_OFFSET = WEB_DINGS_24 ;  break;
                 case 8: HZ_OFFSET = WING_DINGS_24;  break;
                 case 9: HZ_OFFSET = WING_DINGS2_24; break; 
                default:  break;                                                 
                }
            break;
        case  32:         EN_BUF = EN_32BUF, HZ_BUF=HZ_32BUF,         EN_OFFSET = EN_ADD_ST32;  
                 switch (FONT)
                 {
                 case 0: HZ_OFFSET = HZ_ADD_ST32 ;   break;
                 case 1: HZ_OFFSET = HZ_ADD_KT32 ;   break;
                 case 2: HZ_OFFSET = HZ_ADD_HT32 ;   break;
                 case 3: HZ_OFFSET = HZ_ADD_YH32 ;   break;                
                 case 4: HZ_OFFSET = HZ_ADD_XK32 ;   break;
                 case 5: HZ_OFFSET = HZ_ADD_CY32  ;  break;        
                 case 6: HZ_OFFSET = WEB_ADD_32  ;   break;
                 case 7: HZ_OFFSET = WEB_DINGS_32 ;  break;
                 case 8: HZ_OFFSET = WING_DINGS_32;  break;
                 case 9: HZ_OFFSET = WING_DINGS2_32; break;
                default:  break;                                                 
                  }
             break;
        case  40: EN_BUF = EN_40BUF,HZ_BUF=HZ_40BUF, EN_OFFSET = EN_ADD_ST40;  
                 switch (FONT)  
                 {
                 case 0: HZ_OFFSET = HZ_ADD_ST40 ;   break;    //宋体40×40字库未安装不能使用
                 case 1: HZ_OFFSET = HZ_ADD_KT40 ;   break;    //楷体40×40字库未安装不能使用
                 case 2: HZ_OFFSET = HZ_ADD_HT40 ;   break;    //黑体40×40字库未安装不能使用
                 case 3: HZ_OFFSET = HZ_ADD_YH40 ;   break;           //雅黑40×40字库未安装不能使用        
                 case 4: HZ_OFFSET = HZ_ADD_XK40 ;   break;    //行楷40×40字库未安装不能使用
                 case 5: HZ_OFFSET = HZ_ADD_CY40 ;   break;           //彩云40×40字库未安装不能使用
                 case 6: HZ_OFFSET = WEB_ADD_40 ;    break;    
                 case 7: HZ_OFFSET = WEB_DINGS_40;   break;
                 case 8: HZ_OFFSET = WING_DINGS_40;  break;
                 case 9: HZ_OFFSET = WING_DINGS2_40; break;
                default:  break;                                                 
                  }
          break;
                default:          break;
  }

  while(*Str)
    { 
        if((*Str<0x80)&&(FONT<CODE))   //判断ASCII码,图标按汉字显示
        {
        qh=*Str-0X20;;/*取ASCII码(2013-5-29原是offset=qh * EN_BUF,字库地址-1,改成下面,字库地址就不用-1了*/
        offset=qh * EN_BUF-1 ;/*计算该ASCII码字库中偏移量*/
        SPI_Flash_Read((u8*)buffer,offset+EN_OFFSET,EN_BUF);        //从Ascii码偏移地址,读SPI_FLASH到缓存
        if (MODE==0)          //打印字符颜色2013-6-3增加模式开关
        {
        for(i=0; i<SIZE; i++)                                    
           for(j=0; j<NEXT; j++)                                
              for(k=0;k<BYT;k++)
                if((buffer[i*NEXT+j] << k) & 0x80)                  
                LCD_SetPoint(x+k+j*BYT,y+i,CharColor);
                }else {                        //打印字符与背景颜色
                for(i=0; i<SIZE; i++)                                    
                  for(j=0; j<NEXT; j++)                                
                    for(k=0;k<BYT;k++)
                        if((buffer[i*NEXT+j] << k) & 0x80)                     
                        {
                        LCD_SetPoint(x+k+j*BYT,y+i,CharColor);
                        }else        {
                        LCD_SetPoint(x+k+j*BYT,y+i,bkColor);
                        }
                        }
        } else {     //是汉字
                 
                if(FONT<CODE)//是中文字体
                {
                qh=*(Str)- TH -1 ;/*汉字区位码qh=*(Str)- QH*/
                wh=*(Str+1)- WH -1;        //        wh=*(Str+1)- WH  2013-5-29 原下载的24、32字库偏移问题,并不支持中文符号
                offset=((qh * 94+ wh ) * HZ_BUF) - 1 ;/*计算该汉字在字库中偏移量原offset=((qh-1)* 94+(wh-1))* HZ_BUF;*/
                                                        /*2013-5-29统一地址在宏定义调整*/
                }else {  //是图标字体按汉字显示
                qh=*Str-0X20;
                offset=qh * HZ_BUF - 1;/**/
                }
                 SPI_Flash_Read((u8*)buffer,offset+HZ_OFFSET,HZ_BUF);        
                                
                 if( MODE==0)     //只打印字符颜色2013-6-3增加模式开关,方便图标字库套打选择用
                {
                 for(i=0; i<SIZE; i++)                                    
                        for(j=0; j<H; j++)                                
                        for(k=0;k<BYT;k++)
                           if((buffer[i*H+j] << k) & 0x80)
                                 LCD_SetPoint(x+k+j*BYT,y+i,CharColor);// 汉字显示
                                }else{      //打印字符和背景颜色
                        for(i=0; i<SIZE; i++)                                    
                             for(j=0; j<H; j++)                                
                                for(k=0;k<BYT;k++)
                                if((buffer[i*H+j] << k) & 0x80) {
                                 LCD_SetPoint(x+k+j*BYT,y+i,CharColor);// 汉字显示
                                }else{
                                 LCD_SetPoint(x+k+j*BYT,y+i,bkColor);//背景颜色
                                    }
                                }
                 }break;
         }
return 0;
}
    五、初试打印界面
      手机拍摄,效果不好。


六、程序及附件

ziku.zip

75.59 KB, 下载次数: 4310

汉字显示程序.zip

4.91 KB, 下载次数: 3512

ASCII对照图标表.pdf

583.95 KB, 下载次数: 4089

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-8 15:40:48 | 显示全部楼层
回复【楼主位】dalianlwd:
---------------------------------
不错啊.
付出就有回报.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2013-6-8 22:51:57 | 显示全部楼层
这个好有技术哦。好好学习学习
回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2013-6-8 23:48:36 | 显示全部楼层
回复【楼主位】dalianlwd:
---------------------------------
能否更详细点
感觉应该很好玩
回复 支持 反对

使用道具 举报

8

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-12-17
在线时间
0 小时
发表于 2013-6-9 01:46:08 | 显示全部楼层
零基础的C语言能搞出这样,不知是否真的是零基础,如果是,我表示羡慕嫉妒恨,哈哈。
个人博客:http://blog.sina.com.cn/u/2539869495
回复 支持 反对

使用道具 举报

4

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
351
金钱
351
注册时间
2013-4-23
在线时间
98 小时
 楼主| 发表于 2013-6-9 09:30:19 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子置酷,折杀老夫了。原本想用你的代码,我没理解用UNICODE字库的必要性和重叠与非重叠的意思,所以放弃了。开始没选战舰版,只是因为战舰版没有NAND FLASH,而且那些多媒体、网络的一些东西,对我来说没有用。板子到手我意思到,NADN FLASH没有必要,完全可以由板载的SD代替,将来直接把SD卡做成芯片封装焊在板上,就可以取代NAND FLASH了,不但体积减少,也没必要用144脚的芯片了,而且还好控制。也不知道这种做法有没有产品先例。
    你的程序代码非常好,思路清晰、代码规范,很值得学习。
回复 支持 反对

使用道具 举报

4

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
351
金钱
351
注册时间
2013-4-23
在线时间
98 小时
 楼主| 发表于 2013-6-9 09:40:02 | 显示全部楼层
回复【4楼】grant:
---------------------------------
实际上已经很详细了。比如照片上的图就可以用如下代码输出:
 LCD_Show_String(0,0,6,32,1,WHITE,LIGHTBLUE,"! ");
 LCD_Show_String(31,0,6,32,2,WHITE,LIGHTBLUE,"- - - - - - - - - - - ");
 LCD_Show_String(383,0,6,32,5,WHITE,LIGHTBLUE,"' ) ");
 LCD_Show_String(447,0,6,32,2,WHITE,RED,"* ");
 LCD_Show_String(447,31,6,32,1,WHITE,DARKBLUE,"l ");
 LCD_Show_String(447,62,6,32,3,WHITE,GREEN,"% ");
 LCD_Show_String(447,93,6,32,5,WHITE,GRAY,"% ");
 LCD_Show_String(447,124,6,32,3,WHITE,GRAY,"% ");
 LCD_Show_String(447,155,6,32,2,WHITE,GRAY,"% ");
 LCD_Show_String(447,186,6,32,1,WHITE,GRAY,"% ");
 LCD_Show_String(447,208,6,32,1,WHITE,GRAY,"% ");
 LCD_Show_String(447,240,6,32,1,WHITE,DARKBLUE,"m ");
 LCD_Show_String(0,240,6,32,1,WHITE,DARKBLUE,"k ");
 LCD_Show_String(31,240,6,32,1,WHITE,GREEN,"% ");
 LCD_Show_String(62,240,6,32,1,WHITE,GRAY,"- - - - - - - - - - - - ");
 LCD_Show_String(416,240,6,32,0,WHITE,DARKBLUE,"j ");
 LCD_Show_String(0,40,6,40,1,RED,GREEN,"p ");
 LCD_Show_String(50,40,6,40,1,RED,BLUE,"o ");
 LCD_Show_String(3,103,6,40,5,BLUE,WHITE,"X Y Z [ ] ^ _ ` a b d ");
 LCD_Show_String(0,160,6,40,3,GBLUE,RED,"y z ");
 LCD_Show_String(8,163,0,32,0,GREEN,RED,"开始");
 LCD_Show_String(120,160,6,40,4,GBLUE,BLACK,"y z ");
 LCD_Show_String(128,163,1,32,0,GREEN,BLACK,"停止");
 LCD_Show_String(240,160,6,40,2,MAGENTA,BLUE,"! # ");
 LCD_Show_String(248,163,2,32,0,WHITE,BLUE,"确认");
 LCD_Show_String(360,160,6,40,4,MAGENTA,BLUE,"! # ");
 LCD_Show_String(368,163,3,32,0,BLACK,BLUE,"取消");
 LCD_Show_String(5,8,0,16,0,WHITE,LIGHTBLUE,"使用16×16字体");
 LCD_Show_String(150,3,4,24,0,YELLOW,LIGHTBLUE,"主程序");
 LCD_Show_String(225,3,5,24,0,BLACK,LIGHTBLUE,"24×24字体");
 LCD_Show_String(0,90,6,32,0,WHITE,LIGHTBLUE,"} } } } } } } } } } } } } } "); 
 LCD_Show_String(95,40,6,32,0,YELLOW,LIGHTBLUE,"H I J K L M N O  A B "); 
 LCD_Show_String(5,210,8,24,0,WHITE,LIGHTBLUE,"1 2 3 4 5 6 7 8 9: ; < = > J K L ( "); 

   具体有没有实用意义,我还没验证,因为触摸屏的部份,到现在还没有调通。切换页面,刷新速度等不清楚,感觉有点慢。
回复 支持 反对

使用道具 举报

4

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
351
金钱
351
注册时间
2013-4-23
在线时间
98 小时
 楼主| 发表于 2013-6-9 09:50:12 | 显示全部楼层
回复【5楼】Stone_up:
---------------------------------
感谢你的回复和疑虑。
去年想学单片机的时候,是跳过51,直接用Protues学的AVR,C语言也是通过学别人的代码理解的。到现在结构体和指针还是一头雾水。只是现在意识到AVR无法满足我的想法要求,只能是32位单片机来完成的情况下,才改学STM32的。
回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2013-6-9 10:49:57 | 显示全部楼层
回复【7楼】dalianlwd:
---------------------------------
这部分能否更详细点,还有每个字库放的位置是如何计算的

二、图标字库的制作
 
    在选择字体制作的时候,偶然选择了WINDOWS自带的WEBDINGS等4个字体,打开看到是一些图标字库,于是产生了制作图标字库用于液晶屏显示的想法,字库可不可以编辑修改,制作自己要求的图标呢?网上搜索果然有这样软件,下载字库编辑 FontCreator如下图:该软件非常容易上手,几分钟就可以熟练使用,十分方便。
 
    1、我选择的是修改WEBDINGS字库,先备份WINDOWS\FONTS\WEBDINGS.TTF文件、然后删除该文件,用备份的文件复制一个取名为:WEB.TTF(因Webdings.ttf文件是WINDOWS系统管理的文件,无论你取什么名,最后复制粘贴安装的时候都会默认为Webdings.ttf名字)。
 
    2、图标准备:可以选择任何后缀的图像文件,ICO、JPG、png等文件,用Photoshop等软件做去色处理,转换成黑白图像,转存为jpg后缀的文件,或者用矢量图制作软件CorelDraw、图标制作软件 IconWorkshop,无论什么图像只要是黑白的即可。用FontCreator软件开始每个字的修改,调整尺寸不超边界即可,FontCreator的任何设置不要修改,保持默认,你只要做插入图像、调整尺寸的排版工作。
 
    3、特别说明:ASCII码的后128个图标,因为键盘无法输入(包括ALT+小键盘数字组合),不必修改,可以把你喜欢的复制到94个ASCII码的区域里。“””和“\”对应的图标可以不用修改,因为C编译器认为在输出字符串的时候为非法字符。
回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2013-6-9 11:05:49 | 显示全部楼层
            


怎么设置?怎么制作字库
回复 支持 反对

使用道具 举报

8

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-12-17
在线时间
0 小时
发表于 2013-6-9 11:32:05 | 显示全部楼层
回复【8楼】dalianlwd:
---------------------------------
加油吧。支持你。
个人博客:http://blog.sina.com.cn/u/2539869495
回复 支持 反对

使用道具 举报

53

主题

324

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2012-6-18
在线时间
7 小时
发表于 2013-6-9 11:45:00 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

4

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
351
金钱
351
注册时间
2013-4-23
在线时间
98 小时
 楼主| 发表于 2013-6-9 11:49:01 | 显示全部楼层
设置不要动,只改你要改的字,插入图片,调整,就可以了。别超过上下左右红线。




回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2013-6-9 12:13:10 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2013-6-9 13:41:39 | 显示全部楼层
回复【13楼】dalianlwd:
---------------------------------
有的很窄啊 上下左右不大
有的却很大。如果不改他们的参数那么大的太大小的很小
这样也可以?
回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2013-6-9 14:30:32 | 显示全部楼层

回复【楼主位】dalianlwd:
---------------------------------
请解释一下地址位如何算
你这么多字体是分段放的么
都是16+。。。。
晕了 不知道怎么来的呢

我选择的是修改WEBDINGS字库,先备份WINDOWS\FONTS\WEBDINGS.TTF文件、然后删除该文件,用备份的文件复制一个取名为:WEB.TTF(因Webdings.ttf文件是WINDOWS系统管理的文件,无论你取什么名,最后复制粘贴安装的时候都会默认为Webdings.ttf名字)。

用备份的文件复制一个 取名为:WEB.TTF .是不是复制一个文件命名为WEB.TTF? 目的是干嘛?

 




                                        

还有这个软件把图片一个个倒进去保存就是字库了?
怎么取模?一个图片一个图片的弄?
请大侠详细点你那跳跃太大了 我真的不明白 

回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2013-6-9 14:41:54 | 显示全部楼层

u16 LCD_Show_Word(u16 x,u16 y,u8 FONT,u8 SIZE,u8 MODE,u16 CharColor,u16 bkColor,u8 *Str)
{
 u8 k,i,j,qh,wh,EN_BUF,HZ_BUF;
  u8 NEXT=2,H;//,QH   这个是干嘛用的
 u32 offset, HZ_OFFSET,EN_OFFSET;
 char buffer[200]; /*汉字缓存,取最大的40×40字体,备忘2013-5-22数组的长度不能用变量*/
  H = SIZE/BYT;       //汉字行占字节个数  备忘2013-5-22使用预编译#if等语句时,变量必须是个确定值

    switch (SIZE)   //字体大小判断
 {   
         case  16:  EN_BUF=EN_16BUF, HZ_BUF=HZ_16BUF, NEXT--, EN_OFFSET = EN_ADD_ST16 ;
      switch (FONT)
          {
               case 0: HZ_OFFSET = HZ_ADD_ST16 ;   break;//汉字16×16地址
          case 1: HZ_OFFSET = HZ_ADD_KT16 ;   break;
          case 2: HZ_OFFSET = HZ_ADD_HT16 ;   break;
   case 3: HZ_OFFSET = HZ_ADD_YH16 ;   break;  
   case 4: HZ_OFFSET = HZ_ADD_XK16  ;  break;
   case 5: HZ_OFFSET = HZ_ADD_CY16 ;   break; 
   case 6: HZ_OFFSET = WEB_ADD_16;     break;
   case 7: HZ_OFFSET = WEB_DINGS_16;   break;
   case 8: HZ_OFFSET = WING_DINGS_16;  break;
   case 9: HZ_OFFSET = WING_DINGS2_16; break;
  default: break;      
         }
    break;
   case  24: EN_BUF=EN_24BUF, HZ_BUF=HZ_24BUF, EN_OFFSET = EN_ADD_ST24;
  switch (FONT)
   {
   case 0: HZ_OFFSET = HZ_ADD_ST24 ;   break;
   case 1: HZ_OFFSET = HZ_ADD_KT24 ;   break;
   case 2: HZ_OFFSET = HZ_ADD_HT24 ;   break;
   case 3: HZ_OFFSET = HZ_ADD_YH24 ;   break;  
   case 4: HZ_OFFSET = HZ_ADD_XK24 ;   break;
   case 5: HZ_OFFSET = HZ_ADD_CY24 ;   break; 
   case 6: HZ_OFFSET = WEB_ADD_24  ;   break;
   case 7: HZ_OFFSET = WEB_DINGS_24 ;  break;
   case 8: HZ_OFFSET = WING_DINGS_24;  break;
   case 9: HZ_OFFSET = WING_DINGS2_24; break;
  default:  break;      
  }
     break;
 case  32:  EN_BUF = EN_32BUF, HZ_BUF=HZ_32BUF,  EN_OFFSET = EN_ADD_ST32; 
   switch (FONT)
   {
   case 0: HZ_OFFSET = HZ_ADD_ST32 ;   break;
   case 1: HZ_OFFSET = HZ_ADD_KT32 ;   break;
   case 2: HZ_OFFSET = HZ_ADD_HT32 ;   break;
   case 3: HZ_OFFSET = HZ_ADD_YH32 ;   break;  
   case 4: HZ_OFFSET = HZ_ADD_XK32 ;   break;
   case 5: HZ_OFFSET = HZ_ADD_CY32  ;  break; 
   case 6: HZ_OFFSET = WEB_ADD_32  ;   break;
   case 7: HZ_OFFSET = WEB_DINGS_32 ;  break;
   case 8: HZ_OFFSET = WING_DINGS_32;  break;
   case 9: HZ_OFFSET = WING_DINGS2_32; break;
  default:  break;      
    }
      break;
 case  40: EN_BUF = EN_40BUF,HZ_BUF=HZ_40BUF, EN_OFFSET = EN_ADD_ST40; 
   switch (FONT) 
   {
   case 0: HZ_OFFSET = HZ_ADD_ST40 ;   break;    //宋体40×40字库未安装不能使用
   case 1: HZ_OFFSET = HZ_ADD_KT40 ;   break;    //楷体40×40字库未安装不能使用
   case 2: HZ_OFFSET = HZ_ADD_HT40 ;   break;    //黑体40×40字库未安装不能使用
   case 3: HZ_OFFSET = HZ_ADD_YH40 ;   break;    //雅黑40×40字库未安装不能使用 
   case 4: HZ_OFFSET = HZ_ADD_XK40 ;   break;    //行楷40×40字库未安装不能使用
   case 5: HZ_OFFSET = HZ_ADD_CY40 ;   break;    //彩云40×40字库未安装不能使用
   case 6: HZ_OFFSET = WEB_ADD_40 ;    break;   
   case 7: HZ_OFFSET = WEB_DINGS_40;   break;
   case 8: HZ_OFFSET = WING_DINGS_40;  break;
   case 9: HZ_OFFSET = WING_DINGS2_40; break;
  default:  break;      
    }
   break;
  default:   break;
  }

  while(*Str)
    {
 if((*Str<0x80)&&(FONT<CODE))   //判断ASCII码,图标按汉字显示
 {
 qh=*Str-0X20;;/*取ASCII码(2013-5-29原是offset=qh * EN_BUF,字库地址-1,改成下面,字库地址就不用-1了*/
 offset=qh * EN_BUF-1 ;/*计算该ASCII码字库中偏移量*/
 SPI_Flash_Read((u8*)buffer,offset+EN_OFFSET,EN_BUF); //从Ascii码偏移地址,读SPI_FLASH到缓存
  
 if (MODE==0)   //打印字符颜色2013-6-3增加模式开关
 {
 for(i=0; i<SIZE; i++)                                   
    for(j=0; j<NEXT; j++)                               
       for(k=0;k<BYT;k++)
  if((buffer[i*NEXT+j] << k) & 0x80)                 
  LCD_SetPoint(x+k+j*BYT,y+i,CharColor);
  }else {   //打印字符与背景颜色
  for(i=0; i<SIZE; i++)                                   
    for(j=0; j<NEXT; j++)                               
      for(k=0;k<BYT;k++)
   if((buffer[i*NEXT+j] << k) & 0x80)                    
   {
   LCD_SetPoint(x+k+j*BYT,y+i,CharColor);
   }else {
   LCD_SetPoint(x+k+j*BYT,y+i,bkColor);
   }
   }
 } else {     //是汉字
  
  if(FONT<CODE)//是中文字体
  {
  qh=*(Str)- TH -1 ;/*汉字区位码qh=*(Str)- QH*/
  wh=*(Str+1)- WH -1; // wh=*(Str+1)- WH  2013-5-29 原下载的24、32字库偏移问题,并不支持中文符号
  offset=((qh * 94+ wh ) * HZ_BUF) - 1 ;/*计算该汉字在字库中偏移量原offset=((qh-1)* 94+(wh-1))* HZ_BUF;*/
       /*2013-5-29统一地址在宏定义调整*/
  }else {  //是图标字体按汉字显示
  qh=*Str-0X20;
  offset=qh * HZ_BUF - 1;/**/
  }
       
  SPI_Flash_Read((u8*)buffer,offset+HZ_OFFSET,HZ_BUF); 
    
   if( MODE==0)     //只打印字符颜色2013-6-3增加模式开关,方便图标字库套打选择用
  {
   for(i=0; i<SIZE; i++)                                   
          for(j=0; j<H; j++)                               
   for(k=0;k<BYT;k++)
             if((buffer[i*H+j] << k) & 0x80)
     LCD_SetPoint(x+k+j*BYT,y+i,CharColor);// 汉字显示
    }else{      //打印字符和背景颜色
   for(i=0; i<SIZE; i++)                                   
               for(j=0; j<H; j++)                               
    for(k=0;k<BYT;k++)
    if((buffer[i*H+j] << k) & 0x80) {
     LCD_SetPoint(x+k+j*BYT,y+i,CharColor);// 汉字显示
    }else{
     LCD_SetPoint(x+k+j*BYT,y+i,bkColor);//背景颜色
        }
    }
   }break;
  }
return 0;
}

回复 支持 反对

使用道具 举报

4

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
351
金钱
351
注册时间
2013-4-23
在线时间
98 小时
 楼主| 发表于 2013-6-9 15:13:53 | 显示全部楼层
回复【15楼】grant:
---------------------------------
1、应学会按自我的意识思维,理解意图,才能明白。下图的4条红线是字体的最大界限,不能超过,一般在内部2个格,你看看字库就明白了。
2、16是我写入SPI_FLASH 的首地址0x10,转10进制就是16,其他地址,是我合成字库的时候的绝对地址,我为了便于记忆统一加上16的。
3、NEXT是ASCII码的循环条件,你仔细看一下在哪有变化,你也可以设置为0,单你要在开关语句中16×16的地方提前+1.而24×24和32×32的地方+2,为了统一,所以提前设置为2.
回复 支持 反对

使用道具 举报

4

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
351
金钱
351
注册时间
2013-4-23
在线时间
98 小时
 楼主| 发表于 2013-6-9 15:15:08 | 显示全部楼层


回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2013-6-9 15:26:34 | 显示全部楼层

回复【18楼】dalianlwd:
---------------------------------
能否提供完整的例程.下的字库也是一对数字看不懂.
我疑惑的是图标字库怎么做出来并转化成一对数字的.
图标字库对应ASCII码对吧。
假如前面94个ASCII区域已经把图片弄进去了 后面部分图不管了
那接下来软件如何操作?
                                        

给个电话我想详细问问呢 

回复 支持 反对

使用道具 举报

4

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
351
金钱
351
注册时间
2013-4-23
在线时间
98 小时
 楼主| 发表于 2013-6-9 15:41:54 | 显示全部楼层
帖子已经说的很清楚了,因字库文件不能压缩,所以我提供的C文件,你可以网上下载C转BIN的软件,转成字库就行了。后面的ASCII因为键盘没法输入,你做了也没用。取模的软件网上也有,我只是提供思路,其他要自己琢磨了,不明白的网上搜索,如何取模,如何C转BIN,如何BIN转C,只要你能想到的,网上都可以搜索的,鱼和渔的关系你要明白。
回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2013-6-9 17:13:38 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
用该软件可以制作任何字体和不大于32×32字号的汉字库
那么大字库是用什么软件做的
回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2013-6-9 17:26:14 | 显示全部楼层
回复【21楼】dalianlwd:
---------------------------------
windows的字体是TTF的格式。用FONTCREATOR改动了里边图片。保存应该还是TTF格式吧
最关键的如何使得TTF格式变点阵的字库?
高手要点拨下才想的通啊。基础太差没办法
原子哥哥有必要做个详细的讲解,哈哈
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-9 18:52:34 | 显示全部楼层
回复【23楼】grant:
---------------------------------
这我也不懂.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2012-9-14
在线时间
61 小时
发表于 2013-8-14 19:58:37 | 显示全部楼层
回复【楼主位】dalianlwd:
---------------------------------
okokokokoko
回复 支持 反对

使用道具 举报

20

主题

187

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2011-12-14
在线时间
0 小时
发表于 2013-8-17 17:14:42 | 显示全部楼层
好贴,学习!
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-8-3
在线时间
0 小时
发表于 2013-8-19 14:14:46 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-8-31
在线时间
0 小时
发表于 2013-8-22 16:20:35 | 显示全部楼层
好贴,收藏一下
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
发表于 2013-8-23 08:24:31 | 显示全部楼层
支持!
回复 支持 反对

使用道具 举报

48

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2013-6-26
在线时间
0 小时
发表于 2013-8-23 09:11:40 | 显示全部楼层
回复【楼主位】dalianlwd:
---------------------------------
前辈,你说0.8的能仿真stm32,请问怎么查找啊,,英文查找用哪个单词?
回复 支持 反对

使用道具 举报

17

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2012-9-15
在线时间
33 小时
发表于 2013-8-27 11:01:27 | 显示全部楼层
太好了!学习了!经过修改后!为我所用了!谢谢啦!
生活无需多虑
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-5-15
在线时间
6 小时
发表于 2013-10-16 13:57:07 | 显示全部楼层
收藏一下!!!!!
回复 支持 反对

使用道具 举报

17

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2013-3-20
在线时间
0 小时
发表于 2014-1-8 20:50:03 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
发表于 2014-7-19 09:37:31 | 显示全部楼层
现在在学习..
回复 支持 反对

使用道具 举报

17

主题

142

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2013-6-27
在线时间
0 小时
发表于 2014-7-19 13:08:39 | 显示全部楼层
这是高手。。。
回复 支持 反对

使用道具 举报

头像被屏蔽

83

主题

134

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
392
金钱
392
注册时间
2011-8-6
在线时间
10 小时
发表于 2014-8-19 15:37:18 | 显示全部楼层
看来很多次,虽然没看懂,顶
回复 支持 反对

使用道具 举报

5

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2014-7-27
在线时间
1 小时
发表于 2014-8-21 17:53:48 | 显示全部楼层
谢谢分享~ 楼主好厉害~!辛苦了~!
灯下黑
回复 支持 反对

使用道具 举报

8

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2014-2-25
在线时间
16 小时
发表于 2014-8-27 16:04:37 | 显示全部楼层
你这图形界面是用什么做的呀?复杂吗?
ST华南代理,做新项目的网友,如果有用到ST的单片机可向我申请免费样品,QQ:945689011
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-11-16 09:57:52 | 显示全部楼层
厉害啊,佩服佩服
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-11-16 22:02:45 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,单片机调用字库显示汉字必须得加FATFS文件系统吗?除了这个条件外,我要把生成的.DZK字库烧到Flash中,并调用这个文件还需要那些函数啊
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-11-16 22:10:23 | 显示全部楼层
回复【7楼】dalianlwd:
---------------------------
我现在已经生成了一个16乘16.DZK的字库,请问我要向您一样把它烧到SPI Flash中,还需要做什么,另外,还需要哪些函数来实现汉字的调用,具体的流程是什么,希望楼主解答啊
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-16 22:14:16 | 显示全部楼层
回复【40楼】LIUYABO:
---------------------------------
不一定要fatfs,看你自己需求。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-11-16 22:27:48 | 显示全部楼层
如果我要简单显示字库中的汉字,具体都需要哪些函数?
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-11-17 13:34:21 | 显示全部楼层
回复【42楼】正点原子:
---------------------------------
原子哥,怎么把.DZK字库文件烧写到SPI  Flash中,这个文件怎么通过编程烧写啊
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-17 20:21:54 | 显示全部楼层
回复【44楼】LIUYABO:
---------------------------------
我们是通过从SD卡拷贝过去实现的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-11-17 21:00:44 | 显示全部楼层
回复【45楼】正点原子:
-------------------------------
哦哦,谢谢了 。  我在试着弄吧
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-3-21 17:13:46 | 显示全部楼层
界面做的很nice,备份一下,有时间再研究
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

7

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-6-14
在线时间
1 小时
发表于 2015-6-23 16:16:56 | 显示全部楼层
保存备用  很漂亮
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-3-17
在线时间
7 小时
发表于 2016-3-24 14:46:15 | 显示全部楼层
厉害
回复 支持 反对

使用道具 举报

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2015-6-2
在线时间
22 小时
发表于 2016-3-24 17:54:11 | 显示全部楼层
太帅了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 05:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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