成功!用SPI_Flash做中文字库。
本帖最后由 fk2011 于 2012-3-30 22:23 编辑工程文件:
采用的是W25X16 2Mf存储芯片
字库文件: GB2312汉字库横向取模16*16,共6768个中文字符
注:1、采用的是串口接收中断,每次接收两个字符,然后合并这两个字符为一个十六进制字符,最后写入FLAH。
2、串口采用发生文件方式,波特率设置9600,不能设高,否则会乱。
3、开始试了一个串口软件始终不行,因此成功与否与软件也关系。串口软件
3、感觉方法比较笨,不过能用就行。
取模软件(另附中文字符库,共6768个中文字符):,用该软件将中文字符转换成字模,然后稍加整理按照上面所示就可以用了,各种字体和字号。
通过上面取模软件得到的字库文件不能直接使用,需要整理成串口发送的格式,弄了个小软件可以快速得到(含源码): 不错,不错,谢谢分享 不错,用什么软件取模的? bluefeel 发表于 2012-3-30 10:47 static/image/common/back.gif
不错,用什么软件取模的?
用的是别人已经取好模生成C文件,然后自己编辑了下而已。 看起来还不错 不错,正好有需要 我也是用这个方法。 这个文库好,收藏了下次用 应2楼所问,在网上找了一个取模软件,感觉不错 不错,谢谢楼主。 我用这个串口软件,文件发送方式,STM32用串口DMA方式,波特率做到115200,没有问题。 楼主不错。用的谁的开发板啊? 标记一下,谢谢楼主 9600波特率,速度有点慢,发大点的字库需要好半天,115200有解决办法没 mark先留着以后慢慢研究 不错,想过做这个功能的! 以前搞过,用MINIGUI的工具来取模。 附件下载有问题,1.62kb lkl10800139 发表于 2012-3-30 13:15 static/image/common/back.gif
楼主不错。用的谁的开发板啊?
sz的。
1、主要是便宜
2、并且例程比较水,然后自己写例程,达到加强锻炼的目的。 coding2011 发表于 2012-3-30 13:25 static/image/common/back.gif
9600波特率,速度有点慢,发大点的字库需要好半天,115200有解决办法没
确实。主要是,写FLASH比较耗时。与串口软件也有关,楼上有个可以达到115200可以试试 banyai 发表于 2012-3-30 13:06 static/image/common/back.gif
我用这个串口软件,文件发送方式,STM32用串口DMA方式,波特率做到115200,没有问题。 ...
谢谢,看了下,确实不错,果断收藏啊!{:lol:} 顶楼主,不过文件总是下载不成功。 我用的TF卡做字库,因为字库太大了,12 16 24 32 64几种大小的加起来flash装不下。 恭喜了 jeffwei 发表于 2012-3-30 18:01 static/image/common/back.gif
我用的TF卡做字库,因为字库太大了,12 16 24 32 64几种大小的加起来flash装不下。 ...
刚刚做32*32的字库,花了好久,你这么大的字库做好了得耗费多长时间啊?大神也提供个思路。 cemi 发表于 2012-3-30 17:29 static/image/common/back.gif
顶楼主,不过文件总是下载不成功。
刚式了下,可以下载啊,不过很慢。。 下载失败,唉........... 串口波特率115200也不算高,还能再高不?cy7c68013单片机的串口波特率为230400。 速率太高,容易出错,加之写FLASH较耗时本来就满,还是慢些好 本帖最后由 kakarotto 于 2012-3-30 20:26 编辑
我用的GB2312汉字库都是256K的,直接存在stm32的flash里
下载的文件打不开,不知道怎么回事。 字库占了多少空间? 现在下载不了先收藏{:sad:} 电子白菜的有个不错的例程 可以去参考下 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);
} 这个字库不错,收藏了,谢谢楼主 这种方式挺好,不用带字库的LCD屏,成本降低了。 THX 好代码! 估计字模以后能用到,先感谢楼主了 本帖最后由 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);/* 背景颜色 */
}
}
}
}
以前吧字库放在SD卡里 读取速度那叫一个慢啊后来用了SPI flash就是快 但是字库下进去后盖起来麻烦 {:smile:} 不错啊,支持~~有空也做一个~~ 不错。{:smile:} 不错,正好需要,帮顶{:smile:} 有空试一下。 收藏了先 以前做MP3都是用SD存储字库,还没有用过flash。 首次发现新论坛比老论坛好的地方,看代码方便多了。 我也贡献一个字库,是16X16的结构,但字模点阵是14X14的,这样显示的时候,字上下左右都有间距,看之比较不拥挤,结构和UCDOS的HZK16一样.
楼主发了个更新的,大家去看看吧
http://www.ourdev.cn/forum.php?mod=viewthread&tid=5463766&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline Zimo21是一个经典的取模软件啊 谢谢楼主,可惜下载不了,每次都报错。 组织点人手,志愿参加,每人写点字库,人多力量大 厉害,学习ing {:loveliness:}{:loveliness:}{:loveliness:} jeffwei 发表于 2012-3-30 18:01 static/image/common/back.gif
我用的TF卡做字库,因为字库太大了,12 16 24 32 64几种大小的加起来flash装不下。 ...
用NandFlash做字库也不错,容量大,显示大字体的LED字库控制卡,就有用NandFlash做 两个帖子的资料都无法下载····lz用心了!!!! {:victory:} 果断mark 不错,谢谢分享 遗憾。只能先收藏了。 不错不错! 谢谢分享mark {:biggrin:}赞一个 很强大,多谢楼主!! 估计以后能用到,感谢楼主 赞一个~不能下载{:mad:} spiflash W25X16 速度有点慢......在加上9600的串口,速度是上不去的吧. 今天刚写了代码,字库合并的。#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);
}
正需要这个软件。。。但这服务器。。。。下不了。。。。。。。。 不错,太好了 本帖最后由 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 weixinal 发表于 2012-3-30 21:47 static/image/common/back.gif
估计字模以后能用到,先感谢楼主了
{:tongue:} 好思路,顶起来!!! 谢谢楼主,可惜下载不了,每次都报错。 当时做的时候直接把字库分三次写到M25P16里边去的。 mark {:lol:}{:lol:} 先存着,以后肯定用得到。 支持下,呵呵 怎么感觉换了论坛啥都下载不了,是网速问题? 谢谢楼主分享!!! 估计字模以后能用到,先感谢楼主了 很好,以后用得着,收藏先。 STM32串口+DMA
开两个缓冲区,设置好标志位,用乒乓方式,一个缓冲区满了就换到另外一个缓冲区,同时对FLASH编程
速度可以快很多
我之前就是这么干的 20061002838 发表于 2012-4-14 22:35 static/image/common/back.gif
STM32串口+DMA
开两个缓冲区,设置好标志位,用乒乓方式,一个缓冲区满了就换到另外一个缓冲区,同时对FL ...
好方法。开始试过,没想到STM32的DMA,但是因为串口中断干扰SPI,结果失败了。 fk2011 发表于 2012-4-15 11:08 static/image/common/back.gif
好方法。开始试过,没想到STM32的DMA,但是因为串口中断干扰SPI,结果失败了。 ...
用了DMA就不用开串口中断了,直接用DMA中断就行了。 真正有用! 很有用的东西,另外楼主,你的头像很搞笑啊。 好东西要顶。 好东西,学习了 本帖最后由 fk2011 于 2012-4-17 18:56 编辑
网友反映似乎下载不了,这里再打包传个!不包含工程文件。详细制作过程见贴:http://www.ourdev.cn/thread-5463766-1-1.html
好东东. 继续关注 mark, 不能下载 MARK
谢谢分享 这个不错,收藏了 wsm80828 发表于 2012-3-30 10:53 static/image/common/back.gif
看起来还不错
看起来真不错{:lol:} STM32供应商 发表于 2012-4-18 11:18 static/image/common/back.gif
同问..............
16x16大约二百多KB吧,占空间大小还与字模大小有关. 前面几个软件好像都不能下载……
mark 谢谢分享 先收下,这需要这个东东。 mark,以后用 强
谢谢分享!