【恳求帮忙】有没人会用点阵字库芯片(GT21H16S2Y)?
本人在做一个利用点阵字库芯片(GT21H16S2Y),来在LED上显示汉字。不知程序怎么写,望大神指点。
请问在单片机中,unsigned char readbyte(unsigned long addr),这个函数该怎么写呢?
附件里面是驱动程序,包括了汉字地址的算法和程序使用的例子,但是从芯片地址ADDR中读取一个BYTE的数据这个函数没有给出来。望用过此芯片的大神们能够帮下忙。谢谢了 这颗芯片什么价格? win2kddk 发表于 2013-7-14 22:47 static/image/common/back.gif
这颗芯片什么价格?
汉字是有版权的,他这个IC 是上海高通科技产的,已经交了版权税、保护费、赞助金等众多的开销。
所以IC 不便宜的,应该要3元以上。
搞了好几年的汉字显示,一直都用5毛钱 Flash做字库。 同好奇价格 kation122 发表于 2013-7-14 23:02 static/image/common/back.gif
汉字是有版权的,他这个IC 是上海高通科技产的,已经交了版权税、保护费、赞助金等众多的开销。
所以IC ...
请问您用的芯片是? def_2 发表于 2013-7-15 00:07 static/image/common/back.gif
请问您用的芯片是?
用4M or8M flash 做GB2312字库啊。目前做产品的绝大部分都是这样弄的。
你这个是做出产品,还是自己习玩耍的呢。 不是出产品啊,还有其他高手用过此芯片吗?
这个,因单片机而异吧。。楼主可以找找25系列flash的程序,这个应该有很多。gt21和25系列flash的读指令是兼容的 大致的思路是,
1. 先从汉字的编码,算成汉字点阵所在的flash地址
2.从地址中,读出汉字的点阵数据
3.显示点阵。
/********************************************************************/
/*函数名称:void HighSpeed_Read_Cont(unsigned long Dst, */
/* unsigned long no_bytes) */
/*函数功能:快速从GT21L系列芯片读出所要的汉字点阵数据 */
/* 存于数组upperfont_32中 */
/*参 数:Dst :数据在GT21L系列芯片中的地址 */
/* no_bytes:从GT21L芯片读出所要的汉字点阵数据的个数 */
/*全局变量:upperfont_32:用于快速读取汉字点阵数据 */
/*说 明:由于用于快速读取汉字点阵数据的upperfont_32全局变量*/
/* 为32字节,请用户根据实际情况自行修改数组长度 */
/********************************************************************/
void HighSpeed_Read_Cont(unsigned long Dst, unsigned long no_bytes,unsigned char *buffer)
{
unsigned long i = 0;
GT21L_HOLDH();
GT21L_CSL(); // enable device
spiTransferByte(0x0B); // read command
spiTransferByte(((Dst & 0xFFFFFF) >> 16));// send 3 address bytes
spiTransferByte(((Dst & 0xFFFF) >> 8));
spiTransferByte(Dst & 0xFF);
spiTransferByte(0xFF); //dummy byte
for (i = 0; i < no_bytes; i++) // read until no_bytes is reached
{
buffer = spiTransferByte(0xff); // receive byte and store at address 80H - FFH
}
GT21L_CSH(); // disable device
}
lisn3188 发表于 2013-7-15 08:29 static/image/common/back.gif
大致的思路是,
1. 先从汉字的编码,算成汉字点阵所在的flash地址
2.从地址中,读出汉字的点阵数据 ...
非常感谢,请问如果是unicode码,要怎么转换成GB2312码呢?用字库芯片可以吗? mark
kation122 发表于 2013-7-14 23:02 static/image/common/back.gif
汉字是有版权的,他这个IC 是上海高通科技产的,已经交了版权税、保护费、赞助金等众多的开销。
所以IC ...
想问一下几毛钱的flash芯片可否推荐一两个常用的型号? 可以直接用吗! 本帖最后由 lihw2@ 于 2013-10-31 00:16 编辑
我这个是gt20l16s1y的
可以参考一下 通过文档例程改一下寻址算法就能用
void wrcom_zk( uchar datu ) //发送命令到字库
{
SPI_RW(datu);
// uchar idata i;
//
//
// for(i=0;i<8;i++ )
// {
//
// Rom_SCK=0;
// _nop_();
// _nop_();
//
// _nop_();
// if(datu&0x80)
// {
// Rom_IN = 1;
// _nop_();
// _nop_();
// }
// else
// {
// Rom_IN = 0;
// nop_();
// _nop_();
// }
//
//
//
//
// Rom_SCK=1;
// _nop_();
// _nop_();
// _nop_();
// datu = datu<<1;
//
// }
}
/****字库IC中取汉字或字符数据(1个字节)***/
static uchar rddata_zk( )
{
uchar temp;
temp=SPI_RW(0xff);
return(temp);
// uchar idata i;
// uchar idata ret_data=0;
// Rom_SCK=1;
// _nop_();
// _nop_();
// _nop_();
//
// for(i=0;i<8;i++)
// {
// Rom_OUT=1;
// _nop_();
// _nop_();
// _nop_();
//
// Rom_SCK=0;
// _nop_();
// _nop_();
// _nop_();
//
// ret_data=ret_data<<1;
// if( Rom_OUT==1)
// ret_data=ret_data+1;
// else
// ret_data=ret_data+0;
// _nop_();
// _nop_();
// _nop_();
//
// Rom_SCK=1;
// _nop_();
// _nop_();
// _nop_();
//
// }
// return(ret_data);
}
*从相关地址(addrHigh:地址高字节,addrMid:地址中字节,addrLow:地址低字节)中连续读出DataLen个字节的数据到 pBuff的地址*/
/*连续读取*/
void get_n_bytes_data_from_zk(uchar addrHigh,uchar addrMid,uchar addrLow,uchar *pBuff,uchar DataLen )
{
uchar idatai;
SPI_Init(); /////////////////////////////////
Rom_CS = 0;
lcd_cs1=1;
_nop_();
_nop_();
_nop_();
// Rom_SCK=0;
// _nop_();
// _nop_();
// _nop_();
wrcom_zk(0x03);
wrcom_zk(addrHigh);
wrcom_zk(addrMid);
wrcom_zk(addrLow);
for(i = 0; i < DataLen; i++ )
*(pBuff+i) =rddata_zk();
Rom_CS = 1;
}
/******************************************************************/
ulong idatafontaddr=0;
void display_GBzk(uchar y,uchar x,uchar *text)
{
uchar idata i= 0;
uchar idata addrHigh,addrMid,addrLow ;
uchar idata fontbuf;
while((text>0x00))
{
if(((text>=0xb0) &&(text<0xf7))&&(text>=0xa1))
{
/*国标简体(GB2312)汉字在高通字库IC中的地址由以下公式来计算:*/
/*Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0*/
/*由于担心8位单片机有乘法溢出问题,所以分三部取地址*/
fontaddr = (text- 0xb0)*94;
fontaddr += (text-0xa1)+846;
fontaddr = (ulong)(fontaddr*32);
addrHigh = (fontaddr&0xff0000)>>16;/*地址的高8位,共24位*/
addrMid = (fontaddr&0xff00)>>8; /*地址的中8位,共24位*/
addrLow = fontaddr&0xff; /*地址的低8位,共24位*/
get_n_bytes_data_from_zk(addrHigh,addrMid,addrLow,fontbuf,32 );/*取32个字节的数据,存到"fontbuf"*/
wr_16x16bmp(y,x,fontbuf);/*显示汉字到LCD上,y为页地址,x为列地址,fontbuf[]为数据*/
i+=2;
x+=16;
}
else if((text>=0x20) &&(text<=0x7e))
{
unsigned char fontbuf;
fontaddr = (text- 0x20);
fontaddr = (unsigned long)(fontaddr*16);
fontaddr = (unsigned long)(fontaddr+0x3b7c0);
addrHigh = (fontaddr&0xff0000)>>16;
addrMid = (fontaddr&0xff00)>>8;
addrLow = fontaddr&0xff;
get_n_bytes_data_from_zk(addrHigh,addrMid,addrLow,fontbuf,16 );/*取16个字节的数据,存到"fontbuf"*/
wr_8x16bmp(y,x,fontbuf);/*显示8x16的ASCII字到LCD上,y为页地址,x为列地址,fontbuf[]为数据*/
i+=1;
x+=8;
}
else
i++;
}
}
页:
[1]