飞雪非血 发表于 2013-6-1 23:26:59

谁能提供字库芯片的使用方法啊

本帖最后由 飞雪非血 于 2013-6-2 00:12 编辑

小白我有块带GT20L16S1Y的字库芯片的mini12864,哪位大神能提供字库使用方法,来个范例啊。

论坛貌似没什么字库芯片的使用方法啊

就是下面这个货

http://wenku.baidu.com/view/99e3cd0f581b6bd97f19ea15.html

提供一个51的代码,共大神参考:

/* 针对液晶模块型号:mini12864
   串行接口,
   带中文字库IC:竖置横排
   驱动IC是:ST7565R(or compatible)
*/
#include <reg52.H>
#include <intrins.h>

sbit lcd_sclk=P0^0;/*接口定义:lcd_sclk就是LCD的sclk*/
sbit lcd_sid=P0^1;   /*接口定义:lcd_sid就是LCD的sid*/
sbit lcd_rs=P2^6;    /*接口定义:lcd_rs就是LCD的A0*/
sbit lcd_reset=P2^5; /*接口定义:lcd_reset就是LCD的reset*/
sbit lcd_cs1=P2^4;   /*接口定义:lcd_cs1就是LCD的cs1*/

sbit Rom_IN=P0^3;    /*字库IC接口定义:Rom_IN就是字库IC的SI*/
sbit Rom_OUT=P0^2;   /*字库IC接口定义:Rom_OUT就是字库IC的SO*/
sbit Rom_SCK=P0^4;   /*字库IC接口定义:Rom_SCK就是字库IC的SCK*/
sbit Rom_CS=P0^5;    /*字库IC接口定义Rom_CS就是字库IC的CS#*/


#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long


uchar code jiong1[]={/*--文字:囧--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xFE,0x82,0x42,0xA2,0x9E,0x8A,0x82,0x86,0x8A,0xB2,0x62,0x02,0xFE,0x00,0x00,
0x00,0x7F,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x7F,0x00,0x00};

uchar code lei1[]={/*--文字:畾--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x80,0x80,0x80,0xBF,0xA5,0xA5,0xA5,0x3F,0xA5,0xA5,0xA5,0xBF,0x80,0x80,0x80,0x00,
0x7F,0x24,0x24,0x3F,0x24,0x24,0x7F,0x00,0x7F,0x24,0x24,0x3F,0x24,0x24,0x7F,0x00};


/*写指令到LCD模块*/
void transfer_command_lcd(int data1)   
{
        char i;
        lcd_rs=0;
        for(i=0;i<8;i++)
   {
                lcd_sclk=0;
                if(data1&0x80) lcd_sid=1;
                else lcd_sid=0;
                lcd_sclk=1;
               data1=data1<<=1;
   }
}

/*写数据到LCD模块*/
void transfer_data_lcd(int data1)
{
        char i;
        lcd_rs=1;
        for(i=0;i<8;i++)
   {
                lcd_sclk=0;
                if(data1&0x80) lcd_sid=1;
                else lcd_sid=0;
                lcd_sclk=1;
               data1=data1<<=1;
   }
}

/*延时*/
void delay(int n_ms)               
{
int j,k;
for(j=0;j<n_ms;j++)
for(k=0;k<110;k++);
}


/*LCD模块初始化*/
void initial_lcd()
{
        lcd_cs1=0;
        Rom_CS = 1;
        lcd_reset=0;      /*低电平复位*/
        delay(20);
        lcd_reset=1;                  /*复位完毕*/
        delay(20);      
        transfer_command_lcd(0xe2);       /*软复位*/
        delay(5);
        transfer_command_lcd(0x2c);/*升压步聚1*/
        delay(5);       
        transfer_command_lcd(0x2e);/*升压步聚2*/
        delay(5);
        transfer_command_lcd(0x2f);/*升压步聚3*/
        delay(5);
        transfer_command_lcd(0x23);/*粗调对比度,可设置范围0x20~0x27*/
        transfer_command_lcd(0x81);/*微调对比度*/
        transfer_command_lcd(0x2f);/*0x28,微调对比度的值,可设置范围0x00~0x3f*/
        transfer_command_lcd(0xa2);/*1/9偏压比(bias)*/
        transfer_command_lcd(0xc8);/*行扫描顺序:从上到下*/
        transfer_command_lcd(0xa0);/*列扫描顺序:从左到右*/
        transfer_command_lcd(0x40);/*起始行:第一行开始*/
        transfer_command_lcd(0xaf);/*开显示*/
        lcd_cs1=1;
}

void lcd_address(uint page,uint column)
{

        column=column-0x01;
        transfer_command_lcd(0xb0+page-1);   /*设置页地址*/
        transfer_command_lcd(0x10+(column>>4&0x0f));        /*设置列地址的高4位*/
        transfer_command_lcd(column&0x0f);        /*设置列地址的低4位*/       
}

/*全屏清屏*/
void clear_screen()
{
        unsigned char i,j;
        lcd_cs1=0;
        Rom_CS = 1;       
        for(i=0;i<9;i++)
        {
                transfer_command_lcd(0xb0+i);
                transfer_command_lcd(0x10);
                transfer_command_lcd(0x00);
                for(j=0;j<132;j++)
                {
                          transfer_data_lcd(0x00);
                }
        }
        lcd_cs1=1;
}



/*显示16x16点阵图像、汉字、生僻字或16x16点阵的其他图标*/
void display_graphic_16x16(uint page,uint column,uchar *dp)
{
        uint i,j;
        lcd_cs1=0;
        Rom_CS = 1;        
        for(j=0;j<2;j++)
        {
                lcd_address(page+j,column);
                for (i=0;i<16;i++)
                {       
                        transfer_data_lcd(*dp);                                        /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
                        dp++;
                }
        }
        lcd_cs1=1;
}


/*显示8x16点阵图像、ASCII, 或8x16点阵的自造字符、其他图标*/
void display_graphic_8x16(uint page,uchar column,uchar *dp)
{
        uint i,j;
        lcd_cs1=0;       
        for(j=0;j<2;j++)
        {
                lcd_address(page+j,column);
                for (i=0;i<8;i++)
                {       
                        transfer_data_lcd(*dp);                                        /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
                        dp++;
                }
        }
        lcd_cs1=1;
}


/*显示5*7点阵图像、ASCII, 或5x7点阵的自造字符、其他图标*/
void display_graphic_5x7(uint page,uchar column,uchar *dp)
{
        uint col_cnt;
        uchar page_address;
        uchar column_address_L,column_address_H;
        page_address = 0xb0+page-1;
       
        lcd_cs1=0;       
       
        column_address_L =(column&0x0f)-1;
        column_address_H =((column>>4)&0x0f)+0x10;
       
        transfer_command_lcd(page_address);                 /*Set Page Address*/
        transfer_command_lcd(column_address_H);        /*Set MSB of column Address*/
        transfer_command_lcd(column_address_L);        /*Set LSB of column Address*/
       
        for (col_cnt=0;col_cnt<6;col_cnt++)
        {       
                transfer_data_lcd(*dp);
                dp++;
        }
        lcd_cs1=1;
}

/****送指令到字库IC***/
void send_command_to_ROM( uchar datu )
{
        uchar i;
        for(i=0;i<8;i++ )
        {
                if(datu&0x80)
                        Rom_IN = 1;
                else
                        Rom_IN = 0;
                        datu = datu<<1;
                        Rom_SCK=0;
                        Rom_SCK=1;
        }
}

/****从字库IC中取汉字或字符数据(1个字节)***/
static uchar get_data_from_ROM( )
{
       
        uchar i;
        uchar ret_data=0;
        Rom_SCK=1;
        for(i=0;i<8;i++)
        {
                Rom_OUT=1;
                Rom_SCK=0;
                ret_data=ret_data<<1;
                if( Rom_OUT )
                        ret_data=ret_data+1;
                else
                        ret_data=ret_data+0;
                Rom_SCK=1;
        }
        return(ret_data);
}



/*从相关地址(addrHigh:地址高字节,addrMid:地址中字节,addrLow:地址低字节)中连续读出DataLen个字节的数据到 pBuff的地址*/
/*连续读取*/
void get_n_bytes_data_from_ROM(uchar addrHigh,uchar addrMid,uchar addrLow,uchar *pBuff,uchar DataLen )
{
        uchar i;
        Rom_CS = 0;
        lcd_cs1=1;       
        Rom_SCK=0;
        send_command_to_ROM(0x03);
        send_command_to_ROM(addrHigh);
        send_command_to_ROM(addrMid);
        send_command_to_ROM(addrLow);
        for(i = 0; i < DataLen; i++ )
             *(pBuff+i) =get_data_from_ROM();
        Rom_CS = 1;
}


/******************************************************************/

ulongfontaddr=0;
void display_GB2312_string(uchar y,uchar x,uchar *text)
{
        uchar i= 0;
        uchar addrHigh,addrMid,addrLow ;
        uchar 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_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取32个字节的数据,存到"fontbuf"*/
                        display_graphic_16x16(y,x,fontbuf);/*显示汉字到LCD上,y为页地址,x为列地址,fontbuf[]为数据*/
                        i+=2;
                        x+=16;
                }
                else if(((text>=0xa1) &&(text<=0xa3))&&(text>=0xa1))
                {                                               
                        /*国标简体(GB2312)15x16点的字符在字库IC中的地址由以下公式来计算:*/
                        /*Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0*/
                        /*由于担心8位单片机有乘法溢出问题,所以分三部取地址*/
                        fontaddr = (text- 0xa1)*94;
                        fontaddr += (text-0xa1);
                        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_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取32个字节的数据,存到"fontbuf"*/
                        display_graphic_16x16(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+0x3cf80);                       
                        addrHigh = (fontaddr&0xff0000)>>16;
                        addrMid = (fontaddr&0xff00)>>8;
                        addrLow = fontaddr&0xff;

                        get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,16 );/*取16个字节的数据,存到"fontbuf"*/
                       
                        display_graphic_8x16(y,x,fontbuf);/*显示8x16的ASCII字到LCD上,y为页地址,x为列地址,fontbuf[]为数据*/
                        i+=1;
                        x+=8;
                }
                else
                        i++;       
        }
       
}

void display_string_5x7(uchar y,uchar x,uchar *text)
{
        unsigned char i= 0;
        unsigned char addrHigh,addrMid,addrLow ;
        while((text>0x00))
        {
               
                if((text>=0x20) &&(text<=0x7e))       
                {                                               
                        unsigned char fontbuf;                       
                        fontaddr = (text- 0x20);
                        fontaddr = (unsigned long)(fontaddr*8);
                        fontaddr = (unsigned long)(fontaddr+0x3bfc0);                       
                        addrHigh = (fontaddr&0xff0000)>>16;
                        addrMid = (fontaddr&0xff00)>>8;
                        addrLow = fontaddr&0xff;

                        get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,8);/*取8个字节的数据,存到"fontbuf"*/
                       
                        display_graphic_5x7(y,x,fontbuf);/*显示5x7的ASCII字到LCD上,y为页地址,x为列地址,fontbuf[]为数据*/
                        i+=1;
                        x+=6;
                }
                else
                i++;       
        }
       
}
//===============main program===================
void main(void)
{   
        while(1)
        {
                Rom_CS=1;
                lcd_cs1=0;
                initial_lcd();       
                clear_screen();    //clear all dots               
                display_GB2312_string(1,1,"12864,带中文字库");        /*在第1页,第1列,显示一串16x16点阵汉字或8x16的ASCII字*/
                display_GB2312_string(3,1,"16X16简体汉字库,");/*显示一串16x16点阵汉字或8x16的ASCII字.以下雷同*/
                display_GB2312_string(5,1,"或8X16点阵ASCII,");
                display_GB2312_string(7,1,"或5X7点阵ASCII码");                        
                delay(3000);
                clear_screen();       
                display_GB2312_string(1,1,"朗译电子科技成立");       
                display_GB2312_string(3,1,"二零零六年。旗下");       
                display_GB2312_string(5,1,"七星虫品牌专注于");       
                display_GB2312_string(7,1,"教育设备研发设备");       
                delay(3000);                       
                display_GB2312_string(1,1,"GB2312简体字库及");       
                display_GB2312_string(3,1,"有图型功能,可自");       
                display_GB2312_string(5,1,"编大字或图像或生");       
                display_GB2312_string(7,1,"僻字,例如:    ");
                display_graphic_16x16(7,97,jiong1);                                        /*在第7页,第81列显示单个自编生僻汉字“囧”*/
                display_graphic_16x16(7,113,lei1);                                        /*显示单个自编生僻汉字"畾“*/
                delay(3000);               
                clear_screen();                       
                display_GB2312_string(1,1,"<!@#$%^&*()_-+]/");        /*在第1页,第1列,显示一串16x16点阵汉字或8*16的ASCII字*/
                display_string_5x7(3,1,"<!@#$%^&*()_-+]/;.,?[");/*在第3页,第1列,显示一串5x7点阵的ASCII字*/
                display_string_5x7(4,1,"    I Love My job    ");/*显示一串5x7点阵的ASCII字*/
                display_string_5x7(5,1,"    qixingchong      ");/*显示一串5x7点阵的ASCII字*/       
                display_string_5x7(6,1,"   www.doflye.net    ");/*显示一串5x7点阵的ASCII字*/
                display_string_5x7(7,1,"TEL:025-52158963   ");/*显示一串5x7点阵的ASCII字*/
                display_string_5x7(8,1,"E-mail:[email protected]");/*显示一串5x7点阵的ASCII字*/
                delay(3000);
                display_GB2312_string(1,1,"啊阿埃挨哎唉哀皑");        /*在第1页,第1列,显示一串16x16点阵汉字或8x16的ASCII字*/
                display_GB2312_string(3,1,"癌蔼矮艾碍爱隘鞍");/*显示一串16x16点阵汉字或8x16的ASCII字.以下雷同*/
                display_GB2312_string(5,1,"氨安俺按暗岸胺案");
                display_GB2312_string(7,1,"肮昂盎凹敖熬翱袄");                        
                delay(3000);       
                display_GB2312_string(1,1,"鬟鬣麽麾縻麂麇麈");
                display_GB2312_string(3,1,"麋麒鏖麝麟黛黜黝");
                display_GB2312_string(5,1,"黠黟黢黩黧黥黪黯");
                display_GB2312_string(7,1,"鼢鼬鼯鼹鼷鼽鼾齄");                        
                delay(3000);
        }
}

hmjack2008 发表于 2013-12-7 20:34:29

本帖最后由 hmjack2008 于 2013-12-7 20:35 编辑

手上刚好有这个mini12864带GT20L16S1Y的字库芯片, 写成 Arduino程序不难, 但Arduino编译器却是Unicode(UTF-8)的, 芯片字库是GB2312 …

/* 针对液晶模块型号:mini12864
   串行接口,
   带中文字库IC:竖置横排
*/


#define lcd_sclk 13/*接口定义:lcd_sclk就是LCD的sclk*/
#define lcd_sid 11   /*接口定义:lcd_sid就是LCD的sid*/
#define lcd_rs 10    /*接口定义:lcd_rs就是LCD的A0*/
#define lcd_reset 9/*接口定义:lcd_reset就是LCD的reset*/
#define lcd_cs 8   /*接口定义:lcd_cs就是LCD的cs*/


#define Rom_IN 3    /*字库IC接口定义:Rom_IN就是字库IC的SI*/
#define Rom_OUT 2   /*字库IC接口定义:Rom_OUT就是字库IC的SO*/
#define Rom_SCK 4   /*字库IC接口定义:Rom_SCK就是字库IC的SCK*/
#define Rom_CS 5    /*字库IC接口定义Rom_CS就是字库IC的CS#*/


#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long


uchar jiong1[]={/*--文字:囧--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xFE,0x82,0x42,0xA2,0x9E,0x8A,0x82,0x86,0x8A,0xB2,0x62,0x02,0xFE,0x00,0x00,
0x00,0x7F,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x7F,0x00,0x00};


uchar lei1[]={/*--文字:畾--*/
/*--宋体12;此字体下对应的点阵为:宽x高=16x16   --*/
0x80,0x80,0x80,0xBF,0xA5,0xA5,0xA5,0x3F,0xA5,0xA5,0xA5,0xBF,0x80,0x80,0x80,0x00,
0x7F,0x24,0x24,0x3F,0x24,0x24,0x7F,0x00,0x7F,0x24,0x24,0x3F,0x24,0x24,0x7F,0x00};



/*写指令到LCD模块*/
void transfer_command_lcd(int data1)   
{
      uchar i;

      digitalWrite(lcd_rs, LOW);
      for(i=0;i<8;i++)
                   {
                digitalWrite(lcd_sclk, LOW);
                digitalWrite(lcd_sid, (data1&0x80));
                digitalWrite(lcd_sclk, HIGH);
                data1=data1<<=1;
                           }
}
/*写数据到LCD模块*/
void transfer_data_lcd(int data1)
{
      uchar i;

      digitalWrite(lcd_rs, HIGH);
      for(i=0;i<8;i++)
                           {
                digitalWrite(lcd_sclk, LOW);
                digitalWrite(lcd_sid, (data1&0x80));
                digitalWrite(lcd_sclk, HIGH);
                data1=data1<<=1;
                           }
}
/*LCD模块初始化*/
void initial_lcd()
{

pinMode(lcd_sclk,OUTPUT);/*接口定义:lcd_sclk就是LCD的sclk*/
pinMode(lcd_sid,OUTPUT);   /*接口定义:lcd_sid就是LCD的sid*/
pinMode(lcd_rs,OUTPUT);    /*接口定义:lcd_rs就是LCD的A0*/
pinMode(lcd_reset,OUTPUT); /*接口定义:lcd_reset就是LCD的reset*/
pinMode(lcd_cs,OUTPUT);    /*接口定义:lcd_cs就是LCD的cs*/

pinMode(Rom_IN,OUTPUT);                        /*字库IC接口定义:Rom_IN就是字库IC的SI*/
pinMode(Rom_OUT,INPUT_PULLUP);        /*字库IC接口定义:Rom_OUT就是字库IC的SO*/
pinMode(Rom_SCK,OUTPUT);                        /*字库IC接口定义:Rom_SCK就是字库IC的SCK*/
pinMode(Rom_CS,OUTPUT);                        /*字库IC接口定义Rom_CS就是字库IC的CS#*/


      digitalWrite(Rom_CS, HIGH);

          digitalWrite(lcd_cs, LOW);
          digitalWrite(lcd_reset, LOW);
          delay(200);
          digitalWrite(lcd_reset, HIGH);
          delay(1000);       
          transfer_command_lcd(0xe2);//system reset
          delay(200);

          transfer_command_lcd(0x2c);//set power control : 2c ; 2e ; 2f
          transfer_command_lcd(0x2e);//set power control : 2c ; 2e ; 2f
          transfer_command_lcd(0x2f);//set power control : 2c ; 2e ; 2f

          transfer_command_lcd(0x24);//SET VLCD RESISTOR RATIO 粗调对比
          transfer_command_lcd(0x81);//SET ELECTRONIC VOLUME
          transfer_command_lcd(0x1D);//set pm: 通过改变这里的数值来改变电压 微调对比

          transfer_command_lcd(0xa2);//BR=1/9

          transfer_command_lcd(0xa0);//set seg direction : a0 ; a1
          transfer_command_lcd(0xc8);//set com direction : c0 ; c8
          transfer_command_lcd(0x40);//set scroll line

          // transfer_command_lcd(0xa6);//set inverse display           a6 off, a7 on
          // transfer_command_lcd(0xa4);//set all pixel on
          transfer_command_lcd(0xaf);//set display enable

      digitalWrite(lcd_cs, HIGH);

}
/*设置 页地址 列地址*/
void lcd_address(uint page,uint column)
{
      transfer_command_lcd(0xB0+page);        /*设置页地址*/
      transfer_command_lcd(0x10+(column>>4 & 0x0F));        /*设置列地址的高4位*/
      transfer_command_lcd(column & 0x0F);        /*设置列地址的低4位*/      
}
/*全屏清屏*/
void clear_screen()
{
      uchar i,j;

      digitalWrite(Rom_CS, HIGH);
      digitalWrite(lcd_cs, LOW);

      for(i=0;i<9;i++)
      {
                transfer_command_lcd(0xb0+i);
                transfer_command_lcd(0x10);
                transfer_command_lcd(0x00);
                for(j=0;j<132;j++) transfer_data_lcd(0x00);
      }
      digitalWrite(lcd_cs, HIGH);
}
/*显示16x16点阵图像、汉字、生僻字或16x16点阵的其他图标*/
void display_graphic_16x16(uint page,uint column,uchar *dp)
{
      uchar i,j;

      digitalWrite(Rom_CS, HIGH);   
      digitalWrite(lcd_cs, LOW);

      for(j=0;j<2;j++)
      {
                lcd_address(page+j,column);
                for (i=0;i<16;i++)
                {      
                        transfer_data_lcd(*dp);        /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
                        dp++;
                }
      }
      digitalWrite(lcd_cs, HIGH);
}
/*显示8x16点阵图像、ASCII, 或8x16点阵的自造字符、其他图标*/
void display_graphic_8x16(uint page,uchar column,uchar *dp)
{
      uchar i,j;

      digitalWrite(lcd_cs, LOW);      
      for(j=0;j<2;j++)
      {
                lcd_address(page+j,column);
                for (i=0;i<8;i++)
                {      
                        transfer_data_lcd(*dp);        /*写数据到LCD,每写完一个8位的数据后列地址自动加1*/
                        dp++;
                }
      }
      digitalWrite(lcd_cs, HIGH);
}
/*显示8*8点阵图像、ASCII, 5x7或7x8点阵的自造字符、其他图标*/
void display_graphic_8x8(uint page,uchar column,uchar *dp)
{
      uchar col_cnt;

      digitalWrite(lcd_cs, LOW);
      lcd_address(page,column);

      for (col_cnt=0;col_cnt<8;col_cnt++) // 显示8*8点阵图像
      {      
                transfer_data_lcd(*dp);
                dp++;
      }
      digitalWrite(lcd_cs, HIGH);
}
/*显示5*7点阵图像、ASCII, 或5x7点阵的自造字符、其他图标*/
void display_graphic_5x7(uint page,uchar column,uchar *dp)
{
      uchar col_cnt;

      digitalWrite(lcd_cs, LOW);
      lcd_address(page,column);

      for (col_cnt=0;col_cnt<5;col_cnt++) // 显示5*8点阵图像
      {      
                transfer_data_lcd(*dp); // 显示列:8点
                dp++;
      }
      digitalWrite(lcd_cs, HIGH);
}


/****送指令到字库IC***/
void send_command_to_ROM(uchar datu)
{
      uchar i;

      for(i=0;i<8;i++)
      {
                      digitalWrite(Rom_SCK, LOW);
                digitalWrite(Rom_IN, (datu&0x80));
                datu = datu<<1;
                // digitalWrite(Rom_SCK, LOW);
                digitalWrite(Rom_SCK, HIGH);
      }
}
/****从字库IC中取汉字或字符数据(1个字节)***/
static uchar get_data_from_ROM( )
{
      uchar i;
      uchar ret_data=0;

      digitalWrite(Rom_SCK, HIGH);
      for(i=0;i<8;i++)
      {
                // pinMode(Rom_OUT,INPUT_PULLUP); // pull high
                digitalWrite(Rom_SCK, LOW);
                ret_data = ret_data<<1;
                if(digitalRead(Rom_OUT)) ret_data++;
                digitalWrite(Rom_SCK, HIGH);
      }
      return(ret_data);
}
/*
从相关地址
        addrHigh :地址高字节
        addrMid:地址中字节
        addrLow:地址低字节
中连续读出DataLen个字节的数据到 pBuff的地址
*/
/*连续读取*/
void get_n_bytes_data_from_ROM(uchar addrHigh,uchar addrMid,uchar addrLow,uchar *pBuff,uchar DataLen )
{
      uchar i;

      digitalWrite(lcd_cs, HIGH);

      digitalWrite(Rom_CS, LOW);
      digitalWrite(Rom_SCK, LOW);
      send_command_to_ROM(0x03);
      send_command_to_ROM(addrHigh);
      send_command_to_ROM(addrMid);
      send_command_to_ROM(addrLow);
      for(i = 0; i < DataLen; i++ )
             *(pBuff+i) = get_data_from_ROM();
      digitalWrite(Rom_CS, HIGH);
}
/******************************************************************/


unsigned long fontaddr=0;

void display_GB2312_string(uchar y,uchar x,const char *text)
{
      uchar i= 0;
      uchar addrHigh,addrMid,addrLow;
      uchar fontbuf;
      byte *gb_code = (byte *)text;      

      while((gb_code>0x00))
      {
                if(((gb_code>=0xB0)&&(gb_code<=0xF7))&&(gb_code>=0xA1))
                {
                        // 国标简体(GB2312)汉字在字库IC中的地址由以下公式来计算:
                        // Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0
                        // 由于担心8位单片机有乘法溢出问题,所以分三部取地址

                                                fontaddr = (gb_code-0xB0)*94;
                                                fontaddr += (gb_code-0xA1)+846;
                                                fontaddr = (unsigned long)(fontaddr*32);

                                                addrHigh = (fontaddr&0xff0000)>>16;        // 地址的高8位,共24位
                                                addrMid = (fontaddr&0xff00)>>8;                // 地址的中8位,共24位
                                                addrLow = fontaddr&0xff;                        // 地址的低8位,共24位

                                                // 取32个字节的数据,存到"fontbuf"
                                                get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );
                                                // 显示汉字到LCD上,y为页地址,x为列地址,fontbuf[]为数据
                                                display_graphic_16x16(y,x,fontbuf);
                                                i+=2;
                                                x+=16;
                }
                else if(((gb_code>=0xA1)&&(gb_code<=0xA3))&&(gb_code>=0xA1))
                {
                        // 国标简体(GB2312)15x16点的字符在字库IC中的地址由以下公式来计算
                        // Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0
                        // 由于担心8位单片机有乘法溢出问题,所以分三部取地址

                        fontaddr = (gb_code-0xA1)*94;
                        fontaddr += (gb_code-0xA1);
                        fontaddr = (unsigned long)(fontaddr*32);

                        addrHigh = (fontaddr&0xff0000)>>16;// 地址的高8位,共24位
                        addrMid = (fontaddr&0xff00)>>8;      // 地址的中8位,共24位
                        addrLow = fontaddr&0xff;             // 地址的低8位,共24位

                        // 取32个字节的数据,存到"fontbuf"
                        get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );
                        // 显示汉字到LCD上,y为页地址,x为列地址,fontbuf[]为数据
                        display_graphic_16x16(y,x,fontbuf);
                        i+=2;
                        x+=16;
                }
                else if((gb_code>=0x20)&&(gb_code<=0x7E))
                {                                                
                        // uchar fontbuf;                        

                        fontaddr = (gb_code-0x20);
                        fontaddr = (unsigned long)(fontaddr*16);
                        fontaddr = (unsigned long)(fontaddr+0x3B7C0); // +0x3CF80);

                        addrHigh = (fontaddr&0xff0000)>>16;
                        addrMid = (fontaddr&0xff00)>>8;
                        addrLow = fontaddr&0xff;

                        // 取16个字节的数据,存到"fontbuf"
                        get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,16 );
                        // 显示8x16的ASCII字到LCD上,y为页地址,x为列地址,fontbuf[]为数据
                        display_graphic_8x16(y,x,fontbuf);
                        i+=1;
                        x+=8;
                }
                else
                        i++;      
      }
}


void display_5x7_string(uchar y,uchar x,const char *text)
{
      uchar i= 0;
      uchar addrHigh,addrMid,addrLow ;
      byte *gb_code = (byte *)text;

      while((gb_code>0x00))
      {
                if((gb_code>=0x20) &&(gb_code<=0x7E))
                {                                                
                        uchar fontbuf;

                        fontaddr = (gb_code-0x20);
                        fontaddr = (unsigned long)(fontaddr*8);
                        fontaddr = (unsigned long)(fontaddr+0x3BFC0);

                        addrHigh = (fontaddr&0xff0000)>>16;
                        addrMid = (fontaddr&0xff00)>>8;
                        addrLow = fontaddr&0xff;

                        // 取8个字节的数据,存到"fontbuf"
                        get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,8);
                        // 显示5x7的ASCII字到LCD上,y为页地址,x为列地址,fontbuf[]为数据
                        display_graphic_5x7(y,x,fontbuf);
                        i+=1;
                        x+=6;
                }
                else
                              i++;
      }
}


//===============main program===================
void setup()
{
    initial_lcd();
    clear_screen();        //clear all dots   

        delay(1000);
}

void loop()
{

    byte str0 =
    {0xB4,0xF8, 'G','B','2','3','1','2', 0xD6,0xD0, 0xCE,0xC4, 0xD7,0xD6, 0xBF,0xE2, 0x00};
    // "带GB2312中文字库";

                clear_screen();
                display_GB2312_string(0,0,(const char*)str0);
                /***
                display_GB2312_string(0,0,"12864 带中文字库");
                display_GB2312_string(2,0,"16X16 简体汉字库");
                display_GB2312_string(4,0,"8X16   点阵ASCII");
                display_GB2312_string(6,0,"5X7点阵ASCII码");
                ***/
                delay(3000);

                clear_screen();
                display_GB2312_string(0,0,"16x16 Graphic :");
                display_graphic_16x16(2,25,jiong1);        // 汉字“囧”
                display_graphic_16x16(5,100,lei1);        // 汉字"畾“
                delay(3000);

                clear_screen();
                display_GB2312_string(0,0,"8x16 ASCII :");
                display_GB2312_string(2,0," !\"#$%$'()*+,-./");
                display_GB2312_string(4,0,"0123456789:;<=>?");
                display_GB2312_string(6,0,"@ABCDEFGHIJKLMNO");
                delay(3000);
                clear_screen();
                display_GB2312_string(0,0,"8x16 ASCII :");
                display_GB2312_string(2,0,"PQRSTUVWXYZ[\\]^_");
                display_GB2312_string(4,0,"`abcdefghijklmno");
                display_GB2312_string(6,0,"pqrstuvwxyz{|}~ ");
                delay(5000);
            
                clear_screen();
                display_5x7_string(0,0,"5x7 font :");
                display_5x7_string(2,0," !\"#$%$'()*+,-./");
                display_5x7_string(3,0,"0123456789:;<=>?");
                display_5x7_string(4,0,"@ABCDEFGHIJKLMNO");
                display_5x7_string(5,0,"PQRSTUVWXYZ[\\]^_");
                display_5x7_string(6,0,"`abcdefghijklmno");
                display_5x7_string(7,0,"pqrstuvwxyz{|}~ ");
                delay(5000);
}

maxims 发表于 2013-12-17 21:15:16

学习一下:$:$:$:$:$

s1213 发表于 2014-4-26 13:27:44

hmjack2008 发表于 2013-12-7 20:34 static/image/common/back.gif
手上刚好有这个mini12864带GT20L16S1Y的字库芯片, 写成 Arduino程序不难, 但Arduino编译器却是Unicode(UTF- ...

您好,我想使用adafruit的库,看着和您的那个u8g的库差不多,但是输出的字也是向右旋转90度的,您的那个旋转的方法我没有看的很明白,你能给详细的解释一下方法或者注释一下代码么?谢谢

s1213 发表于 2014-4-26 13:33:57

#include <SPI.h>
#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(A3,A1,A2);
byte gb;

void DrawVBitmap(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t cnt, const uint8_t *bitmap)
{
y += cnt*8;
while( cnt > 0 )
{
    u8g_Draw8Pixel(u8g, x, y, 3, *bitmap);
    bitmap++;
    cnt--;
    y-=8;
}
}

void DrawBitmap(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t cnt, u8g_uint_t w, const uint8_t *bitmap)
{
if ( u8g_IsBBXIntersection(u8g, x, y, cnt*8, w) == 0 )
    return;
while( w > 0 )
{
    DrawVBitmap(u8g, x, y, cnt, bitmap);
    bitmap += cnt;
    x++;
    w--;
}
}

long getAddress(int msb, int lsb)
{
long address;
address = (msb - 0xB0) * 94;
address = address + (lsb - 0xA1)+ 846;
address = address*32;
return address;
}

void getBitmap(long address, byte* b)
{
digitalWrite(10,LOW);
SPI.transfer(0x03);
SPI.transfer((address>>16)&0xff);
SPI.transfer((address>>8)&0xff);
SPI.transfer((address)&0xff);

for(int i=0;i<32;i++)
{
    if(i>15)
      b[(i-16)*2] = SPI.transfer(0);
    else
      b=SPI.transfer(0);
}
digitalWrite(10,HIGH);
}

void draw(void) {
// graphic commands to redraw the complete screen should be placed here
DrawBitmap( u8g.getU8g(),0, -1, 2, 16, gb);
DrawBitmap( u8g.getU8g(),112, 48-1, 2, 16, gb);
}

long address;
void setup(void) {

//LED VCC
pinMode(4,OUTPUT);
digitalWrite(4,HIGH);

//GT20 VCC
pinMode(7,OUTPUT);
digitalWrite(7,HIGH);

//GT20 CS
pinMode(10,OUTPUT);

// assign default color value
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
    u8g.setColorIndex(255);   // white
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
    u8g.setColorIndex(3);         // max intensity
else if ( u8g.getMode() == U8G_MODE_BW )
    u8g.setColorIndex(1);         // pixel on

SPI.begin();
SPI.setDataMode(SPI_MODE3);
SPI.setBitOrder(MSBFIRST);

//C7B6嵌
int msb = 0xc7;
int lsb = 0xb6;
address = getAddress(msb, lsb);
}

void loop(void) {
getBitmap(address, gb);
address+=32;
// picture loop
u8g.firstPage();
do {
    draw();
}
while( u8g.nextPage() );

// rebuild the picture after some delay
delay(500);
}

bearway 发表于 2014-6-8 07:08:14

utf8真的让用汉字的人很无语。。。

clumsybird 发表于 2014-7-6 01:01:59

hmjack2008 发表于 2013-12-7 20:34 static/image/common/back.gif
手上刚好有这个mini12864带GT20L16S1Y的字库芯片, 写成 Arduino程序不难, 但Arduino编译器却是Unicode(UTF- ...

高人,明天细细研究。

lovezypj 发表于 2016-1-6 14:37:27

那结论是什么呢?16s1y这个字库芯片能不能用?

fsss007 发表于 2016-2-8 02:48:55

也在找这方面的资料。怎么样呢?

janeasy 发表于 2016-2-15 10:14:59

s1213 发表于 2014-4-26 13:33 static/image/common/back.gif
#include
#include "U8glib.h"



我按照手册的公式获得点阵数据,只有 B0和B1 这两段内的文字可以正常显示,其他均对不上。
不知道是不是公式错了,您那里获得点阵数据是否正常?

if(MSB ==0xA9 && LSB >=0xA1)
Address =(282 + (LSB - 0xA1 ))*32+BaseAdd;
else if(MSB >=0xA1 && MSB <= 0xA3 && LSB >=0xA1)
Address =( (MSB - 0xA1) * 94 + (LSB - 0xA1))*32+ BaseAdd;
else if(MSB >=0xB0 && MSB <= 0xF7 && LSB >=0xA1)   
Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;

s1213 发表于 2016-2-19 16:06:33

janeasy 发表于 2016-2-15 10:14 static/image/common/back.gif
我按照手册的公式获得点阵数据,只有 B0和B1 这两段内的文字可以正常显示,其他均对不上。
不知道是不是 ...

技术手册的公式抄对了的话一定没有问题,注意多检查自身,还有既然有对的了,看看为什么这两个对,别的为什么不对,估计还是哪里有问题,把思路一点一点写下来,然后过几天再看,估计就能找到错误了
[email protected]我的邮箱不明白再联系!

janeasy 发表于 2016-2-21 23:16:59

s1213 发表于 2016-2-19 16:06 static/image/common/back.gif
技术手册的公式抄对了的话一定没有问题,注意多检查自身,还有既然有对的了,看看为什么这两个对,别的为 ...

问题解决了,Arduino 的数字计算结果并不能自动提高类型,导致溢出。

小二郎a 发表于 2016-8-16 11:43:08

janeasy 发表于 2016-2-21 23:16 static/image/common/back.gif
问题解决了,Arduino 的数字计算结果并不能自动提高类型,导致溢出。

你好 我现在也是在弄这个问题,我的总是显示一整块亮点,你能方便留个联系方式吗,我想请教一下
页: [1]
查看完整版本: 谁能提供字库芯片的使用方法啊