在前两天的撸一堆板子上面,发现一款汉字字库芯片
高通gotop的gt32l24m01
一看手册发现这玩意儿支持的字库相当多
汉字支持12*12 16*16 241*24三种大小的GB18030标准的27484个汉字和1038个汉字标点字符
然后呢一大堆各种大小样式的ascii字符
再仔细一读手册发现这玩意儿操作指令居然和25系列的flash一模一样
直接上编程器,发现是个4MB的,直接就给他整片拷贝下来了。
其中0-0x7ffff为空白区域512KB,用户可以自行使用。
那么就是说后面3.5MB的内容就是字库内容了
支持的字库列表和地址
手册上面的样张 一部分截图
拷贝下来的bin有4MB。找个4m的flash烧录进去
mini板上面找个现成的 实验30 汉字显示实验,简单一改就可以用了
效果如下:
专门试了下,支持中文标点符号没有问题~
汉字内码解析程序 手册上的个地方有错
[mw_shl_code=c,true]#include "sys.h"
#include "flash.h"
#include "lcd.h"
#include "text.h"
#include "string.h"
//////////////////////////////////////////////////////////////////////////////////
//GT32L24M0140
//////////////////////////////////////////////////////////////////////////////////
//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 c1,c2,c3,c4;
unsigned char i;
unsigned long foffset;
unsigned long h=0;
u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数
c1=*code;
c2=*(++code);
c3=*(++code);
c4=*(++code);
if(c2==0x7f)
{
for(i=0;i<csize;i++)*mat++=0x00;//填充满格
return; //结束访问
}
if(size==12)
{
if(c1 >= 0xA1 && c1 <= 0xa9 && c2 >= 0xa1) //Section 1
h = (c1 - 0xA1) * 94 + (c2 - 0xA1);
else if(c1 >= 0xa8 && c1 <= 0xa9 && c2 < 0xa1) //Section 5
{
if(c2 > 0x7f)
c2--;
h = (c1 - 0xa8) * 96 + (c2 - 0x40) + 846;
}
if(c1 >= 0xb0 && c1 <= 0xf7 && c2 >= 0xa1) //Section 2
h = (c1 - 0xB0) * 94 + (c2 - 0xA1) + 1038;
else if(c1 < 0xa1 && c1 >= 0x81 && c2 >= 0x40 ) //Section 3
{
if(c2 > 0x7f)
c2--;
h=(c1-0x81)*190 + (c2-0x40) + 1038 +6768;
}
else if(c1>=0xaa && c2<0xa1) //Section 4
{
if(c2>0x7f)
c2--;
h=(c1-0xaa)*96 + (c2-0x40) + 1038 +12848;
}
foffset=h*24;
SPI_Flash_Read(mat,foffset+0x093D0E,24);
}
else if(size==16)
{
if(c1 <= 0xA1 && c1 >= 0xA0 && c2 >= 0xa1) //Section 1 标点
h = (c1 - 0xA1) * 94 + (c2 - 0xA1);
else if(c1 >= 0xa8 && c1 <= 0xa9 && c2 < 0xa1) //Section 5
{
if(c2 > 0x7f)
c2--;
h = (c1 - 0xa8) * 96 + (c2 - 0x40) + 846;
}
if(c1 >= 0xb0 && c1 <= 0xf7 && c2 >= 0xa1) //Section 2
h = (c1 - 0xB0) * 94 + (c2 - 0xA1) + 1038;
else if(c1 < 0xa1 && c1 >= 0x81 && c2 >= 0x40 ) //Section 3
{
if(c2 > 0x7f)
c2--;
h = (c1 - 0x81) * 190 + (c2 - 0x40) + 1038 + 6768;
}
else if(c1 >= 0xaa && c2 < 0xa1) //Section 4
{
if(c2 > 0x7f)
c2--;
h = (c1 - 0xaa) * 96 + (c2 - 0x40) + 1038 + 12848;
}
else if(c1 == 0x81 && c2 >= 0x39) //四字节区 1
{
h = 1038 + 21008 + (c3 - 0xEE) * 10 + c4 - 0x39;
}
else if(c1 == 0x82) //四字节区 2
{
h = 1038 + 21008 + 161 + (c2 - 0x30) * 1260 + (c3 - 0x81) * 10 + c4 - 0x30;
}
foffset=h*32;
SPI_Flash_Read(mat,foffset+0x114FDE,32);
}
if(size==24)
{
if(c1 >= 0xA1 && c1 <= 0xAB && c2 >= 0xa1) //Section 1
h = (c1 - 0xA1) * 94 + (c2 - 0xA1);
else if(c1 >= 0xa8 && c1 <= 0xa9 && c2 < 0xa1) //Section 5
{
if(c2 > 0x7f)
c2--;
h = (c1 - 0xa8) * 96 + (c2 - 0x40) + 846;
}
if(c1 >= 0xb0 && c1 <= 0xf7 && c2 >= 0xa1) //Section 2
h = (c1 - 0xB0) * 94 + (c2 - 0xA1) + 1038;
else if(c1 < 0xa1 && c1 >= 0x81 && c2 >= 0x40) //Section 3
{
if(c2 > 0x7f)
c2--;
h = (c1 - 0x81) * 190 + (c2 - 0x40) + 1038 + 6768;
}
else if(c1 >= 0xaa && c2 < 0xa1) //Section 4
{
if(c2 > 0x7f)
c2--;
h = (c1 - 0xaa) * 96 + (c2 - 0x40) + 1038 + 12848;
}
else if(c1 == 0x81 && c2 >= 0x39) //四字节区 1
{
h = 1038 + 21008 + (c3 - 0xEE) * 10 + c4 - 0x39;
}
else if(c1 == 0x82) //四字节区 2
{
h = 1038 + 21008 + 161 + (c2 - 0x30) * 1260 + (c3 - 0x81) * 10 + c4 - 0x30;
}
foffset=h*72;
SPI_Flash_Read(mat,foffset+0x1F43DE,72);
}
}
//显示一个指定大小的汉字
//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 x0=x;
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;
x++;
if((x-x0)==size)
{
x=x0;
y++;
break;
}
}
}
}
//在指定位置显示一个字符 从字库中取
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16/24
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowChar_ZK(u16 x,u16 y,u8 num,u8 size,u8 mode)
{
u8 temp,t1,t;
u16 x0=x;
u8 cache[48];
u8 csize=(size/8+((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数 24号字最大用48
num=num-0x20;//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
if(size==12)SPI_Flash_Read(cache,num*12+0x080900,12); //调用1206字体
else if(size==16)SPI_Flash_Read(cache,num*16+0x080D80,16); //调用1608字体
else if(size==24){SPI_Flash_Read(cache,num*48+0x081B80,48);csize=48;} //调用2412字体
else return; //没有的字库
for(t=0;t<csize;t++)
{
temp=cache[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;
x++;
//if(x>=lcddev.width)return; //超区域了
if((x-x0)==size/2)
{
x=x0;
y++;
//if(y>=lcddev.height)return; //超区域了
break;
}
}
}
}
//在指定位置开始显示一个字符串
//支持自动换行
//(x,y):起始坐标
//width,height:区域
//str :字符串
//size :字体大小
//mode:0,非叠加方式;1,叠加方式
void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode)
{
u16 x0=x;
u16 y0=y;
u8 bHz=0; //字符或者中文
while(*str!=0)//数据未结束
{
if(!bHz)
{
if(*str>0x80)bHz=1;//中文
else //字符
{
if(x>(x0+width-size/2))//换行
{
y+=size;
x=x0;
}
if(y>(y0+height-size))break;//越界返回
if(*str==13)//换行符号
{
y+=size;
x=x0;
str++;
}
else LCD_ShowChar_ZK(x,y,*str,size,mode);//有效部分写入 外部字库
// else LCD_ShowChar(x,y,*str,size,mode);//有效部分写入 内部字库
str++;
x+=size/2; //字符,为全字的一半
}
}else//中文
{
bHz=0;//有汉字库
if(x>(x0+width-size))//换行
{
y+=size;
x=x0;
}
if(y>(y0+height-size))break;//越界返回
Show_Font(x,y,str,size,mode); //显示这个汉字,空心显示
str+=2;
x+=size;//下一个汉字偏移
}
}
} [/mw_shl_code]
东西丢 {MOD}了
内容包含 字库bin文件 芯片手册和完整的mini板子的程序
链接:http://pan.baidu.com/s/1cKVLsM 密码:h1i1
一周热门 更多>