OpenEdv-开源电子网

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

MINI STM32开发板 2.8寸TFT LCD 如何显示32*32的汉字呀?

[复制链接]

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2014-6-4 16:53:32 | 显示全部楼层 |阅读模式
5金钱
MINI STM32开发板  2.8寸TFT LCD    如何显示32*32的汉字呀?也通过KEY0更新了32尺寸的字库了,改了很多地方认为该改的,能显示32*16的ASCII码了,但是还是无法显示32*32的汉字

修改如下:
//显示一个指定大小的汉字
//x,y :汉字的坐标
//font:汉字GBK码
//size:字体大小
//mode:0,正常显示,1,叠加显示   
void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode)
{
u8 temp,t,t1;
u16 y0=y;
u8 dzk[128];   
u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数  
if(size!=12&&size!=16&&size!=24&&size!=32)return; //不支持的size
Get_HzMat(font,dzk,size); //得到相应大小的点阵数据 
for(t=0;t<csize;t++)
{     
temp=dzk[t]; //得到点阵数据                          
for(t1=0;t1<8;t1++)
{
if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR); 
temp<<=1;
y++;
if((y-y0)==size)
{
y=y0;
x++;
break;
}
}    
}  
}

//code 字符指针开始
//从字库中查找出字模
//code 字符串的开始地址,GBK码
//mat  数据存放地址 (size/8+((size%8)?1:0))*(size) bytes大小
//size:字体大小
void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)
{    
unsigned char qh,ql;
unsigned char i;  
unsigned long foffset; 
u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数  
qh=*code;
ql=*(++code);
if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非 常用汉字
{      
   for(i=0;i<csize;i++)*mat++=0x00;//填充满格
   return; //结束访问
}          
if(ql<0x7f)ql-=0x40;//注意!
else ql-=0x41;
qh-=0x81;   
foffset=((unsigned long)190*qh+ql)*csize; //得到字库中的字节偏移量    
switch(size)
{
case 12:
SPI_Flash_Read(mat,foffset+ftinfo.f12addr,24);
break;
case 16:
SPI_Flash_Read(mat,foffset+ftinfo.f16addr,32);
break;
case 24:
SPI_Flash_Read(mat,foffset+ftinfo.f24addr,72);
break;
case 32:
SPI_Flash_Read(mat,foffset+ftinfo.f32addr,128);
break;

}        
}


//字库信息结构体定义
//用来保存字库基本信息,地址,大小等
__packed typedef struct 
{
u8 fontok; //字库存在标志,0XAA,字库正常;其他,字库不存在
u32 ugbkaddr; //unigbk的地址
u32 ugbksize; //unigbk的大小  
u32 f12addr; //gbk12地址
u32 gbk12size; //gbk12的大小  
u32 f16addr; //gbk16地址
u32 gbk16size; //gbk16的大小  
u32 f24addr; //gbk24地址
u32 gkb24size; //gbk24的大小 
u32 f32addr; //gbk32地址
u32 gkb32size; //gbk32的大小
}_font_info;

最佳答案

查看完整内容[请看2#楼]

楼主,你算过32*32的字体,要多大的flash么??? 你存放这么多字库,都存了?还是只放了几个? mini板V3.0的例程,是支持12*12,16*16和24*24字体的了,而且极易修改为支持更大的字体,不过需要你的外部flash得足够大才行. 这是代码: [mw_shl_code=c,true]//code 字符指针开始 //从字库中查找出字模 //code 字符串的开始地址,GBK码 //mat 数据存放地址 (size/8+((size%8)?1:0))*(size) bytes大小 //size:字体大小 void Get_HzM ...
合肥-文盲
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-4 16:53:33 | 显示全部楼层
楼主,你算过32*32的字体,要多大的flash么???
你存放这么多字库,都存了?还是只放了几个?

mini板V3.0的例程,是支持12*12,16*16和24*24字体的了,而且极易修改为支持更大的字体,不过需要你的外部flash得足够大才行.
这是代码:
[mw_shl_code=c,true]//code 字符指针开始 //从字库中查找出字模 //code 字符串的开始地址,GBK码 //mat 数据存放地址 (size/8+((size%8)?1:0))*(size) bytes大小 //size:字体大小 void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size) { unsigned char qh,ql; unsigned char i; unsigned long foffset; u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数 qh=*code; ql=*(++code); if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非 常用汉字 { for(i=0;i<csize;i++)*mat++=0x00;//填充满格 return; //结束访问 } if(ql<0x7f)ql-=0x40;//注意! else ql-=0x41; qh-=0x81; foffset=((unsigned long)190*qh+ql)*csize; //得到字库中的字节偏移量 switch(size) { case 12: SPI_Flash_Read(mat,foffset+ftinfo.f12addr,24); break; case 16: SPI_Flash_Read(mat,foffset+ftinfo.f16addr,32); break; case 24: SPI_Flash_Read(mat,foffset+ftinfo.f24addr,72); break; } } //显示一个指定大小的汉字 //x,y :汉字的坐标 //font:汉字GBK码 //size:字体大小 //mode:0,正常显示,1,叠加显示 void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode) { u8 temp,t,t1; u16 y0=y; u8 dzk[72]; u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数 if(size!=12&&size!=16&&size!=24)return; //不支持的size Get_HzMat(font,dzk,size); //得到相应大小的点阵数据 for(t=0;t<csize;t++) { temp=dzk[t]; //得到点阵数据 for(t1=0;t1<8;t1++) { if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR); else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR); temp<<=1; y++; if((y-y0)==size) { y=y0; x++; break; } } } }[/mw_shl_code]

ALIENTEK MiniSTM32 实验30 汉字显示实验.rar

844.06 KB, 下载次数: 1250

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2014-6-5 08:37:50 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我12*12  16*16  24*24 32*32都更新到flash里面了,估计可能越界了,我把24*24的去掉,换成32*32的,看看可行
合肥-文盲
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2014-6-5 09:59:59 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
可以显示32*32的汉字了,我把12*12  16*16  24*24 32*32都更新到flash里面了,但是显示的字不太全,比如开发板的“开”,一横就显示一些点,有些地方断了,这是字库的原因吗?要做成粗体吗?我试试
合肥-文盲
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-7-24
在线时间
0 小时
发表于 2014-8-5 13:50:10 | 显示全部楼层
回复【4楼】合肥-文盲:
---------------------------------
怎么改的?我最近也想改,不会改。。。。
回复

使用道具 举报

5

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-4-30
在线时间
2 小时
发表于 2015-5-7 20:34:26 | 显示全部楼层
回复【4楼】合肥-文盲:
---------------------------------
楼主,怎么改的???
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2015-5-7 22:02:46 | 显示全部楼层
回复【4楼】合肥-文盲:
---------------------------------
是不是取模的方向不对?
业余程序玩家。
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-5-8 09:09:03 | 显示全部楼层
回复【5楼】招招毙命1:
---------------------------------
对着改就行啊   把32*32的字体做好,放在SD卡相应的文件目录下面,然后把SD里面12  16  24的字体都删除了,然后再随便把程序里面的24*24的改成32*32的,12*12   16*16的程序部分删除即可
合肥-文盲
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-5-8 09:09:32 | 显示全部楼层
回复【6楼】吃咯:
---------------------------------
对着改就行啊   把32*32的字体做好,放在SD卡相应的文件目录下面,然后把SD里面12  16  24的字体都删除了,然后再随便把程序里面的24*24的改成32*32的,12*12   16*16的程序部分删除即可
合肥-文盲
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-5-8 09:10:10 | 显示全部楼层
回复【7楼】ofourme:
---------------------------------
已经好了   但记不得是什么原因了  可能开始的时候程序改的不对吧
合肥-文盲
回复

使用道具 举报

5

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-4-30
在线时间
2 小时
发表于 2015-5-8 09:40:21 | 显示全部楼层
楼主,我是更改的正点原子,汉字显示实验例程
把12*12给删除了,然后加上了24*24以及32*32。。。但是,我只做了16*16,32*32的字体库。。。更新字体库的时候,发现更新完16*16之后,就提示update failed。。。然后,我分析了一下代码,估计是我在16*16和32*32之间,需要更新24*24。。。。
if(rval==0)  
{
if(fx==0) //更新UNIGBK.BIN
{
ftinfo.ugbkaddr=FONTINFOADDR+sizeof(ftinfo);//信息头之后,紧跟UNIGBK转换码表
   ftinfo.ugbksize=fftemp->fsize; //UNIGBK大小
  flashaddr=ftinfo.ugbkaddr;
}else if(fx==1) //GBK24
{   
ftinfo.f24addr=ftinfo.ugbkaddr+ftinfo.ugbksize; //UNIGBK之后,紧跟GBK24字库
ftinfo.gbk24size=fftemp->fsize; //GBK24字库大小
flashaddr=ftinfo.f24addr; //GBK12的起始地址
}else //GBK32
{
ftinfo.f32addr=ftinfo.f24addr+ftinfo.gbk24size; //GBK24之后,紧跟GBK16字库
ftinfo.gkb32size=fftemp->fsize; //GBK32字库大小
flashaddr=ftinfo.f32addr; //GBK32的起始地址
}    
while(res==FR_OK)//死循环执行
{
  res=f_read(fftemp,tempbuf,4096,(UINT *)&bread); //读取数据  
if(res!=FR_OK)break; //执行错误
SPI_Flash_Write(tempbuf,offx+flashaddr,4096); //从0开始写入4096个数据  
   offx+=bread;   
fupd_prog(x,y,size,fftemp->fsize,offx);   //进度显示
if(bread!=4096)break; //读完了.
  } 
f_close(fftemp);
}  
myfree(SRAMIN,fftemp); //释放内存
myfree(SRAMIN,tempbuf); //释放内存
return res;
}


然后,我现在做一个24*24的字库,试一下。。。
回复

使用道具 举报

5

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-4-30
在线时间
2 小时
发表于 2015-5-8 09:40:59 | 显示全部楼层
回复【11楼】吃咯:
---------------------------------
我注释写的是错的,不要介意。。。
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-5-8 10:24:50 | 显示全部楼层
回复【11楼】吃咯:
---------------------------------
可以单独只更新32*32的字体的,可能有些地方你还没修改过来
合肥-文盲
回复

使用道具 举报

5

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-4-30
在线时间
2 小时
发表于 2015-5-8 21:13:51 | 显示全部楼层
回复【13楼】合肥-文盲:
---------------------------------
嗯。。。是的。。。我是想多测试几个字体。。。我现在是更新了16*16的字体,以及32*32的字体。。。32*32的字体,选的是黑体,在屏幕上,显示的是乱码,英文也不能正常显示。。。估计屏幕不能显示黑体吧。。。
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-5-11 09:09:13 | 显示全部楼层
回复【14楼】吃咯:
---------------------------------
可以显示黑体
合肥-文盲
回复

使用道具 举报

5

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-4-30
在线时间
2 小时
发表于 2015-5-16 10:11:13 | 显示全部楼层
回复【15楼】合肥-文盲:
---------------------------------
嗯。。。现在可以了
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-5-19 08:32:40 | 显示全部楼层
回复【16楼】吃咯:
---------------------------------
嗯 恭贺  哈哈
合肥-文盲
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 05:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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