def_2 发表于 2013-7-14 21:31:48

【恳求帮忙】有没人会用点阵字库芯片(GT21H16S2Y)?

本人在做一个利用点阵字库芯片(GT21H16S2Y),来在LED上显示汉字。

不知程序怎么写,望大神指点。

请问在单片机中,unsigned char readbyte(unsigned long addr),这个函数该怎么写呢?


def_2 发表于 2013-7-14 21:35:03

附件里面是驱动程序,包括了汉字地址的算法和程序使用的例子,但是从芯片地址ADDR中读取一个BYTE的数据这个函数没有给出来。望用过此芯片的大神们能够帮下忙。谢谢了

win2kddk 发表于 2013-7-14 22:47:32

这颗芯片什么价格?

kation122 发表于 2013-7-14 23:02:59

win2kddk 发表于 2013-7-14 22:47 static/image/common/back.gif
这颗芯片什么价格?

汉字是有版权的,他这个IC 是上海高通科技产的,已经交了版权税、保护费、赞助金等众多的开销。
所以IC 不便宜的,应该要3元以上。
搞了好几年的汉字显示,一直都用5毛钱 Flash做字库。

dashashi 发表于 2013-7-15 00:04:18

同好奇价格

def_2 发表于 2013-7-15 00:07:05

kation122 发表于 2013-7-14 23:02 static/image/common/back.gif
汉字是有版权的,他这个IC 是上海高通科技产的,已经交了版权税、保护费、赞助金等众多的开销。
所以IC ...

请问您用的芯片是?

kation122 发表于 2013-7-15 00:10:41

def_2 发表于 2013-7-15 00:07 static/image/common/back.gif
请问您用的芯片是?

用4M or8M flash 做GB2312字库啊。目前做产品的绝大部分都是这样弄的。
你这个是做出产品,还是自己习玩耍的呢。

def_2 发表于 2013-7-15 06:58:20

不是出产品啊,还有其他高手用过此芯片吗?

wshtyr 发表于 2013-7-15 07:43:36

这个,因单片机而异吧。。楼主可以找找25系列flash的程序,这个应该有很多。gt21和25系列flash的读指令是兼容的

lisn3188 发表于 2013-7-15 08:29:58

大致的思路是,
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   
}

def_2 发表于 2013-7-15 14:16:37

lisn3188 发表于 2013-7-15 08:29 static/image/common/back.gif
大致的思路是,
1. 先从汉字的编码,算成汉字点阵所在的flash地址
2.从地址中,读出汉字的点阵数据 ...

非常感谢,请问如果是unicode码,要怎么转换成GB2312码呢?用字库芯片可以吗?

爱情转移 发表于 2013-8-6 14:28:33

mark                                       

hefanghua 发表于 2013-9-29 15:48:45

kation122 发表于 2013-7-14 23:02 static/image/common/back.gif
汉字是有版权的,他这个IC 是上海高通科技产的,已经交了版权税、保护费、赞助金等众多的开销。
所以IC ...

想问一下几毛钱的flash芯片可否推荐一两个常用的型号?

笑傲江湖 发表于 2013-10-30 21:36:56

可以直接用吗!                        

lihw2@ 发表于 2013-10-31 00:10:11

本帖最后由 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]
查看完整版本: 【恳求帮忙】有没人会用点阵字库芯片(GT21H16S2Y)?