fk2011 发表于 2012-3-30 10:35:11

成功!用SPI_Flash做中文字库。

本帖最后由 fk2011 于 2012-3-30 22:23 编辑

工程文件:
采用的是W25X16 2Mf存储芯片
字库文件: GB2312汉字库横向取模16*16,共6768个中文字符
注:1、采用的是串口接收中断,每次接收两个字符,然后合并这两个字符为一个十六进制字符,最后写入FLAH。
2、串口采用发生文件方式,波特率设置9600,不能设高,否则会乱。
3、开始试了一个串口软件始终不行,因此成功与否与软件也关系。串口软件
3、感觉方法比较笨,不过能用就行。
取模软件(另附中文字符库,共6768个中文字符):,用该软件将中文字符转换成字模,然后稍加整理按照上面所示就可以用了,各种字体和字号。
通过上面取模软件得到的字库文件不能直接使用,需要整理成串口发送的格式,弄了个小软件可以快速得到(含源码):

yueqia1988 发表于 2012-3-30 10:39:02

不错,不错,谢谢分享

bluefeel 发表于 2012-3-30 10:47:06

不错,用什么软件取模的?

fk2011 发表于 2012-3-30 10:50:17

bluefeel 发表于 2012-3-30 10:47 static/image/common/back.gif
不错,用什么软件取模的?

用的是别人已经取好模生成C文件,然后自己编辑了下而已。

wsm80828 发表于 2012-3-30 10:53:01

看起来还不错

kap 发表于 2012-3-30 11:48:55

不错,正好有需要

smry 发表于 2012-3-30 11:56:24

我也是用这个方法。

xue_pic 发表于 2012-3-30 11:58:08

这个文库好,收藏了下次用

fk2011 发表于 2012-3-30 12:47:51

应2楼所问,在网上找了一个取模软件,感觉不错

Excellence 发表于 2012-3-30 12:58:50

不错,谢谢楼主。

banyai 发表于 2012-3-30 13:06:16

我用这个串口软件,文件发送方式,STM32用串口DMA方式,波特率做到115200,没有问题。

lkl10800139 发表于 2012-3-30 13:15:40

楼主不错。用的谁的开发板啊?

lwg998 发表于 2012-3-30 13:16:48

标记一下,谢谢楼主

coding2011 发表于 2012-3-30 13:25:44

9600波特率,速度有点慢,发大点的字库需要好半天,115200有解决办法没

TROYWINDON 发表于 2012-3-30 13:31:07

mark先留着以后慢慢研究

guangzhu 发表于 2012-3-30 13:33:47

不错,想过做这个功能的!

knliao 发表于 2012-3-30 13:40:33

以前搞过,用MINIGUI的工具来取模。

abuffalo 发表于 2012-3-30 13:50:17

附件下载有问题,1.62kb

fk2011 发表于 2012-3-30 13:55:07

lkl10800139 发表于 2012-3-30 13:15 static/image/common/back.gif
楼主不错。用的谁的开发板啊?

sz的。
1、主要是便宜
2、并且例程比较水,然后自己写例程,达到加强锻炼的目的。

fk2011 发表于 2012-3-30 13:57:14

coding2011 发表于 2012-3-30 13:25 static/image/common/back.gif
9600波特率,速度有点慢,发大点的字库需要好半天,115200有解决办法没

确实。主要是,写FLASH比较耗时。与串口软件也有关,楼上有个可以达到115200可以试试

fk2011 发表于 2012-3-30 14:01:08

banyai 发表于 2012-3-30 13:06 static/image/common/back.gif
我用这个串口软件,文件发送方式,STM32用串口DMA方式,波特率做到115200,没有问题。 ...

谢谢,看了下,确实不错,果断收藏啊!{:lol:}

cemi 发表于 2012-3-30 17:29:41

顶楼主,不过文件总是下载不成功。

jeffwei 发表于 2012-3-30 18:01:42

我用的TF卡做字库,因为字库太大了,12 16 24 32 64几种大小的加起来flash装不下。

nomsg 发表于 2012-3-30 18:16:36

恭喜了   

fk2011 发表于 2012-3-30 19:53:14

jeffwei 发表于 2012-3-30 18:01 static/image/common/back.gif
我用的TF卡做字库,因为字库太大了,12 16 24 32 64几种大小的加起来flash装不下。 ...

刚刚做32*32的字库,花了好久,你这么大的字库做好了得耗费多长时间啊?大神也提供个思路。

fk2011 发表于 2012-3-30 19:54:13

cemi 发表于 2012-3-30 17:29 static/image/common/back.gif
顶楼主,不过文件总是下载不成功。

刚式了下,可以下载啊,不过很慢。。

skynet 发表于 2012-3-30 20:02:07

下载失败,唉...........

xizi 发表于 2012-3-30 20:17:07

串口波特率115200也不算高,还能再高不?cy7c68013单片机的串口波特率为230400。

yc21 发表于 2012-3-30 20:24:24

速率太高,容易出错,加之写FLASH较耗时本来就满,还是慢些好

kakarotto 发表于 2012-3-30 20:26:15

本帖最后由 kakarotto 于 2012-3-30 20:26 编辑

我用的GB2312汉字库都是256K的,直接存在stm32的flash里

下载的文件打不开,不知道怎么回事。

abuffalo 发表于 2012-3-30 20:53:58

字库占了多少空间?

lixupeng 发表于 2012-3-30 21:14:46

现在下载不了先收藏{:sad:}

li20030505 发表于 2012-3-30 21:19:01

电子白菜的有个不错的例程 可以去参考下

jeffwei 发表于 2012-3-30 21:26:31

fk2011 发表于 2012-3-30 19:53 static/image/common/back.gif
刚刚做32*32的字库,花了好久,你这么大的字库做好了得耗费多长时间啊?大神也提供个思路。 ...

用字模软件生成标准字库的二进制文件

unsigned char region   = *p-0xa0;//得到区号gb2312
unsigned char location = *(p+1)-0xa0;//得到位号void LCD_CN(rt_uint16_t x,rt_uint16_t y,const rt_uint8_t *p,rt_uint8_t fon, rt_uint16_t charColor,rt_uint16_t bkColor)
{
int fd;

unsigned char region   = *p-0xa0;//得到区号gb2312
unsigned char location = *(p+1)-0xa0;//得到位号
uint32_t index;//地址偏移量
uint16_t i,n,end_x;


switch(fon)
{
case 12:
    {
      index = (94*(region-1)+location-1)*24;//地址偏移量
      end_x=x+11;
      fd = open("/Chinese12.FON", O_RDONLY, 0);//打开在根目录的字库
      lseek(fd,index,DFS_SEEK_SET);//设置偏移量
      read(fd, buffer, 24);
      
      LCD_WriteReg(CUR_X,x); // .............. CUR_x
      LCD_WriteReg(CUR_Y,y); // .............. CUR_y
      LCD_WriteReg(END_X,end_x); // ............ END_X
      LCD_WriteRAM_Prepare(); // .............. PIXELS
      for(n=0;n<24;n++)
      {
      for (i = 0; i < 8; i++)//
      {
          if (buffer & (0x01<<i))
          {
            LCD_WriteRAM(charColor);//写有效点
          }
          else
          {
            LCD_WriteRAM(bkColor);//写底色
          }
      }
      for (i = 0; i < 4; i++)//
      {
          if (buffer & (0x01<<i))
          {
            LCD_WriteRAM(charColor);//写有效点
          }
          else
          {
            LCD_WriteRAM(bkColor);//写底色
          }
      }
      n+=1;
      }
    }
    break;
case 16:
    {
      index = (94*(region-1)+location-1)*32;//地址偏移量
      end_x=x+15;
      
      fd = open("/Chinese16.FON", O_RDONLY, 0);//打开在根目录的字库
      if (fd < 0)
        {
                rt_kprintf("check: open file for read failed\n");
                return;
        }
      lseek(fd,index,DFS_SEEK_SET);//设置偏移量
      read(fd, buffer, 32);
      
      
      
      LCD_WriteReg(CUR_X,x); // .............. CUR_x
      LCD_WriteReg(CUR_Y,y); // .............. CUR_y
      LCD_WriteReg(END_X,end_x); // ............ END_X
      LCD_WriteRAM_Prepare(); // .............. PIXELS
      for(n=0;n<32;n++)
      {
      for (i = 0; i < 8; i++)//
      {
          if (buffer & (0x01<<i))
          {
            LCD_WriteRAM(charColor);//写有效点
          }
          else
          {
            LCD_WriteRAM(bkColor);//写底色
          }
      }
      }
    }
    break;
case 24:
    {
      index = (94*(region-1)+location-1)*72;//地址偏移量
      end_x=x+23;
      
      fd = open("/Chinese24.FON", O_RDONLY, 0);//打开在根目录的字库
      lseek(fd,index,DFS_SEEK_SET);//设置偏移量
      read(fd, buffer, 72);
      
      LCD_WriteReg(CUR_X,x); // .............. CUR_x
      LCD_WriteReg(CUR_Y,y); // .............. CUR_y
      LCD_WriteReg(END_X,end_x); // ............ END_X
      LCD_WriteRAM_Prepare(); // .............. PIXELS
      for(n=0;n<72;n++)
      {
      for (i = 0; i < 8; i++)//
      {
          if (buffer & (0x01<<i))
          {
            LCD_WriteRAM(charColor);//写有效点
          }
          else
          {
            LCD_WriteRAM(bkColor);//写底色
          }
      }      
      }
    }
    break;
case 32:
    {
      index = (94*(region-1)+location-1)*128;//地址偏移量
      end_x=x+31;
      fd = open("/Chinese32.FON", O_RDONLY, 0);//打开在根目录的字库
      lseek(fd,index,DFS_SEEK_SET);//设置偏移量
      read(fd, buffer, 128);
      LCD_WriteReg(CUR_X,x); // .............. CUR_x
      LCD_WriteReg(CUR_Y,y); // .............. CUR_y
      LCD_WriteReg(END_X,end_x); // ............ END_X
      LCD_WriteRAM_Prepare(); // .............. PIXELS
      for(n=0;n<128;n++)
      {
      for (i = 0; i < 8; i++)//
      {
          if (buffer & (0x01<<i))
          {
            LCD_WriteRAM(charColor);//写有效点
          }
          else
          {
            LCD_WriteRAM(bkColor);//写底色
          }
      }
      }
    }
    break;
    case 64:
    {
      index = (94*(region-1)+location-1)*448;//地址偏移量
      end_x=x+63;
      fd = open("/Chinese64.FON", O_RDONLY, 0);//打开在根目录的字库
      lseek(fd,index,DFS_SEEK_SET);//设置偏移量
      read(fd, buffer, 448);
      LCD_WriteReg(CUR_X,x); // .............. CUR_x
      LCD_WriteReg(CUR_Y,y); // .............. CUR_y
      LCD_WriteReg(END_X,end_x); // ............ END_X
      LCD_WriteRAM_Prepare(); // .............. PIXELS
      for(n=0;n<448;n++)
      {
      for (i = 0; i < 8; i++)//
      {
          if (buffer & (0x01<<i))
          {
            LCD_WriteRAM(charColor);//写有效点
          }
          else
          {
            LCD_WriteRAM(bkColor);//写底色
          }
      }
      }
    }
    break;
default:break;
}

close(fd);
}

airfex 发表于 2012-3-30 21:30:27

这个字库不错,收藏了,谢谢楼主

ljt80158015 发表于 2012-3-30 21:40:49

这种方式挺好,不用带字库的LCD屏,成本降低了。

danceman_uk 发表于 2012-3-30 21:42:19

THX 好代码!

weixinal 发表于 2012-3-30 21:47:09

估计字模以后能用到,先感谢楼主了

fk2011 发表于 2012-3-30 22:38:37

本帖最后由 fk2011 于 2012-3-30 22:42 编辑

32*32楷体也行。
注意:如果使用32*32的中文字符,工程文件中需要修改void GetGBKCode(unsigned char* pBuffer,unsigned char * c)和
void PutChinese(uint16_t Xpos,uint16_t Ypos,uint8_t *str,uint16_t Color,uint16_t bkColor)void GetGBKCode(unsigned char* pBuffer,unsigned char * c)
{
   unsigned char High8bit,Low8bit;
   High8bit=*c;   /* 取高8位数据 */
   Low8bit=*(c+1);/* 取低8位数据 */

   W25X_Read_Bytes(((High8bit-0xb0)*94+Low8bit-0xa1)*128,pBuffer,128);        //32*32        横向取模 高位在左
}


void PutChinese(uint16_t Xpos,uint16_t Ypos,uint8_t *str,uint16_t Color,uint16_t bkColor)
{
uint8_t i,j;
uint8_t buffer;
uint32_t tmp_char=0;
   

GetGBKCode(buffer,str);/* 取字模数据 32*32点阵*/

for (i=0;i<32;i++)
{
    tmp_char=buffer;
        tmp_char=(tmp_char)<<24;
        tmp_char|=((u32)buffer)<<16;
        tmp_char|=((u32)buffer)<<8;
        tmp_char|=((u32)buffer);

    for (j=0;j<32;j++)
    {
      if ( (tmp_char >>31 - j) & 0x01 == 0x01)
      {
          LCD_SetPoint(Xpos+j,Ypos+i,Color);/* 字符颜色 */
      }
      else
      {
          LCD_SetPoint(Xpos+j,Ypos+i,bkColor);/* 背景颜色 */
      }
    }
}
}

jlhgold 发表于 2012-3-30 22:46:53

以前吧字库放在SD卡里 读取速度那叫一个慢啊后来用了SPI flash就是快 但是字库下进去后盖起来麻烦 {:smile:}

nongxiaoming 发表于 2012-3-31 02:01:31

不错啊,支持~~有空也做一个~~

allenjwb 发表于 2012-3-31 10:34:33

不错。{:smile:}

astute11 发表于 2012-3-31 10:45:17

不错,正好需要,帮顶{:smile:}

esdart 发表于 2012-3-31 10:48:47

有空试一下。

jetimchen 发表于 2012-3-31 11:19:46

收藏了先

cunlingwang 发表于 2012-3-31 13:35:24

以前做MP3都是用SD存储字库,还没有用过flash。

kakarotto 发表于 2012-3-31 19:37:58

首次发现新论坛比老论坛好的地方,看代码方便多了。

zhxzhx 发表于 2012-3-31 22:25:56

我也贡献一个字库,是16X16的结构,但字模点阵是14X14的,这样显示的时候,字上下左右都有间距,看之比较不拥挤,结构和UCDOS的HZK16一样.

airfex 发表于 2012-3-31 22:33:50

楼主发了个更新的,大家去看看吧
http://www.ourdev.cn/forum.php?mod=viewthread&tid=5463766&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline

ShawnLinson 发表于 2012-3-31 22:45:53

Zimo21是一个经典的取模软件啊

Excellence 发表于 2012-4-1 13:03:30

谢谢楼主,可惜下载不了,每次都报错。

xlwq 发表于 2012-4-1 13:44:12

组织点人手,志愿参加,每人写点字库,人多力量大

liangws201 发表于 2012-4-1 14:49:15

厉害,学习ing

won 发表于 2012-4-1 17:24:19

{:loveliness:}{:loveliness:}{:loveliness:}

qinshi1208 发表于 2012-4-1 17:29:27

jeffwei 发表于 2012-3-30 18:01 static/image/common/back.gif
我用的TF卡做字库,因为字库太大了,12 16 24 32 64几种大小的加起来flash装不下。 ...

用NandFlash做字库也不错,容量大,显示大字体的LED字库控制卡,就有用NandFlash做

won 发表于 2012-4-1 17:37:46

两个帖子的资料都无法下载····lz用心了!!!!

hxh824 发表于 2012-4-1 22:56:13

{:victory:}

junmin414 发表于 2012-4-1 23:33:04

果断mark

wthzack 发表于 2012-4-1 23:41:46

不错,谢谢分享

jetli 发表于 2012-4-1 23:49:37

遗憾。只能先收藏了。

fenjinzhe 发表于 2012-4-2 00:33:03

不错不错!

stm8s 发表于 2012-4-2 00:42:50

谢谢分享mark

254278455 发表于 2012-4-2 14:17:10

{:biggrin:}赞一个

hopefly2 发表于 2012-4-2 14:40:42

很强大,多谢楼主!!

zhouhaiye 发表于 2012-4-2 15:48:48

估计以后能用到,感谢楼主

sky5566 发表于 2012-4-2 20:34:46

赞一个~不能下载{:mad:}

xiaoliusheng 发表于 2012-4-2 21:21:40

spiflash W25X16 速度有点慢......在加上9600的串口,速度是上不去的吧.

aureole 发表于 2012-4-2 22:02:48

今天刚写了代码,字库合并的。#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main(void)
{
        FILE *fall,
               *fhzk16,
               *fhzk16f,
               *fhzk12,
               *fhzk24h,
               *flogo;
        int i,j;
        int counter =0;

        unsigned char c;


        fhzk16 = fopen(".\\1_HZK16","rb");
        fhzk16f = fopen(".\\2_HZK16F","rb");
        fhzk12 = fopen(".\\3_HZK12","rb");
        fhzk24h = fopen(".\\4_HZK24H","rb");
        flogo = fopen(".\\5_LOGO.BIN","rb");

        fall = fopen(".\\all.bin","wb");


//hzk16
        while(!feof(fhzk16)){
                        c =(unsigned char)fgetc(fhzk16);
                        fputc(c,fall);
                        counter ++;
        }
       
        while(counter <1024*64*5){
                        fputc(0,fall);
                        counter ++;
        }
//hzk16f
        while(!feof(fhzk16f)){
                        c =(unsigned char)fgetc(fhzk16f);
                        fputc(c,fall);
                        counter ++;
        }
       
        while(counter <1024*64*10){
                        fputc(0,fall);
                        counter ++;
        }
//hzk12
        while(!feof(fhzk12)){
                        c =(unsigned char)fgetc(fhzk12);
                        fputc(c,fall);
                        counter ++;
        }
       
        while(counter <1024*64*15){
                        fputc(0,fall);
                        counter ++;
        }
//hzk24h
        while(!feof(fhzk24h)){
                        c =(unsigned char)fgetc(fhzk24h);
                        fputc(c,fall);
                        counter ++;
        }
       
        while(counter <1024*64*24){
                        fputc(0,fall);
                        counter ++;
        }
//logo
        while(!feof(flogo)){
                        c =(unsigned char)fgetc(flogo);
                        fputc(c,fall);
                        counter ++;
        }
       
        while(counter <1024*64*28){
                        fputc(0,fall);
                        counter ++;
        }


        fclose(fhzk16);
        fclose(fhzk16f);
        fclose(fhzk12);
        fclose(fhzk24h);
        fclose(flogo);
        fclose(fall);

}

stm32_xiaocai 发表于 2012-4-2 22:20:33

正需要这个软件。。。但这服务器。。。。下不了。。。。。。。。

leiyv 发表于 2012-4-2 22:27:57

不错,太好了

fk2011 发表于 2012-4-2 22:30:00

本帖最后由 fk2011 于 2012-4-2 22:38 编辑

xiaoliusheng 发表于 2012-4-2 21:21 static/image/common/back.gif
spiflash W25X16 速度有点慢......在加上9600的串口,速度是上不去的吧.

看此贴,修改了写入格式,速度提升一倍,另外baud提升到115200http://www.ourdev.cn/thread-5463766-1-1.html 写入速度仅仅受制与串口速度,实测210K字库写完呢耗费70s

eddia2200 发表于 2012-4-2 22:42:09

weixinal 发表于 2012-3-30 21:47 static/image/common/back.gif
估计字模以后能用到,先感谢楼主了

{:tongue:} 好思路,顶起来!!!

ioicn 发表于 2012-4-3 11:40:32

谢谢楼主,可惜下载不了,每次都报错。

mylinger 发表于 2012-4-3 11:54:56

当时做的时候直接把字库分三次写到M25P16里边去的。

nmzqdsg 发表于 2012-4-9 16:04:45

mark    {:lol:}{:lol:}

LOVE-DOVE 发表于 2012-4-9 16:55:07

先存着,以后肯定用得到。

dadongleilei 发表于 2012-4-9 17:00:28

支持下,呵呵

0520kuang 发表于 2012-4-10 21:42:08

怎么感觉换了论坛啥都下载不了,是网速问题?

oceanx 发表于 2012-4-12 12:19:00

谢谢楼主分享!!!

lu0718 发表于 2012-4-14 18:35:34

估计字模以后能用到,先感谢楼主了

randtian 发表于 2012-4-14 20:39:04

很好,以后用得着,收藏先。

20061002838 发表于 2012-4-14 22:35:26

STM32串口+DMA
开两个缓冲区,设置好标志位,用乒乓方式,一个缓冲区满了就换到另外一个缓冲区,同时对FLASH编程
速度可以快很多
我之前就是这么干的

fk2011 发表于 2012-4-15 11:08:06

20061002838 发表于 2012-4-14 22:35 static/image/common/back.gif
STM32串口+DMA
开两个缓冲区,设置好标志位,用乒乓方式,一个缓冲区满了就换到另外一个缓冲区,同时对FL ...

好方法。开始试过,没想到STM32的DMA,但是因为串口中断干扰SPI,结果失败了。

20061002838 发表于 2012-4-15 14:21:08

fk2011 发表于 2012-4-15 11:08 static/image/common/back.gif
好方法。开始试过,没想到STM32的DMA,但是因为串口中断干扰SPI,结果失败了。 ...

用了DMA就不用开串口中断了,直接用DMA中断就行了。

wyz.0413 发表于 2012-4-15 18:42:31

真正有用!

cemi 发表于 2012-4-15 18:49:08

很有用的东西,另外楼主,你的头像很搞笑啊。

ckvlhf 发表于 2012-4-15 19:37:24

好东西要顶。

edkaifa 发表于 2012-4-17 17:01:29

好东西,学习了

fk2011 发表于 2012-4-17 18:54:25

本帖最后由 fk2011 于 2012-4-17 18:56 编辑

网友反映似乎下载不了,这里再打包传个!不包含工程文件。详细制作过程见贴:http://www.ourdev.cn/thread-5463766-1-1.html

qiushui_007 发表于 2012-4-17 20:09:19

好东东. 继续关注

longyan993 发表于 2012-4-18 09:33:31

mark, 不能下载

joing2000 发表于 2012-4-18 10:52:08

MARK
谢谢分享

abnerle 发表于 2012-4-18 13:11:36

这个不错,收藏了

Ytu-xiaolizig 发表于 2012-4-18 14:01:40

wsm80828 发表于 2012-3-30 10:53 static/image/common/back.gif
看起来还不错

看起来真不错{:lol:}                  

fk2011 发表于 2012-4-18 18:38:51

STM32供应商 发表于 2012-4-18 11:18 static/image/common/back.gif
同问..............

16x16大约二百多KB吧,占空间大小还与字模大小有关.

longyan993 发表于 2012-4-18 19:37:54

前面几个软件好像都不能下载……

       mark

hamipeter 发表于 2012-4-19 00:42:12

谢谢分享

w3154 发表于 2012-4-19 19:40:55

先收下,这需要这个东东。

godfooker_back 发表于 2012-4-19 20:45:20

mark,以后用

xunke 发表于 2012-4-22 23:30:46


谢谢分享!
页: [1] 2 3
查看完整版本: 成功!用SPI_Flash做中文字库。