极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23762|回复: 1

请教GT20L16S1Y的字库芯片使用

[复制链接]
发表于 2013-6-4 16:39:11 | 显示全部楼层 |阅读模式
小白我有块带GT20L16S1Y的字库芯片的mini12864,哪位大神能提供字库使用方法,来个范例啊。

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

就是下面这个货

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

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



[pre lang="C" line="1"]/* 针对液晶模块型号: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;

}



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


ulong昀漀渀琀愀搀搀爀=0;

void display_GB2312_string(uchar y,uchar x,uchar *text)

{

    uchar i= 0;

    uchar addrHigh,addrMid,addrLow ;

    uchar fontbuf[32];            

    while((text>0x00))

    {

        if(((text>=0xb0) &&(text<=0xf7))&&(text[i+1]>=0xa1))

        {                        

            /*国标简体(GB2312)汉字在字库IC中的地址由以下公式来计算:*/

            /*Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0*/

            /*由于担心8位单片机有乘法溢出问题,所以分三部取地址*/

            fontaddr = (text- 0xb0)*94;

            fontaddr += (text[i+1]-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[32]"*/

            display_graphic_16x16(y,x,fontbuf);/*显示汉字到LCD上,y为页地址,x为列地址,fontbuf[]为数据*/

            i+=2;

            x+=16;

        }

        else if(((text>=0xa1) &&(text<=0xa3))&&(text[i+1]>=0xa1))

        {                        

            /*国标简体(GB2312)15x16点的字符在字库IC中的地址由以下公式来计算:*/

            /*Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0*/

            /*由于担心8位单片机有乘法溢出问题,所以分三部取地址*/

            fontaddr = (text- 0xa1)*94;

            fontaddr += (text[i+1]-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[32]"*/

            display_graphic_16x16(y,x,fontbuf);/*显示汉字到LCD上,y为页地址,x为列地址,fontbuf[]为数据*/

            i+=2;

            x+=16;

        }

        else if((text>=0x20) &&(text<=0x7e))   

        {                        

            unsigned char fontbuf[16];            

            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[32]"*/


            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[8];            

            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[32]"*/


            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," 嬀甀爀氀崀眀眀眀.doflye.net[/url]  ");/*显示一串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);

    }

}[/code]
回复

使用道具 举报

发表于 2013-6-21 11:33:28 | 显示全部楼层
刚测试了一下,显示屏的驱动芯片是SSD1306,显示库用了u8glib,MINI12864也支持。
程序在屏幕左上和右下角各显示字库中从“嵌”开始的一系列字符,不断刷新。
字符是按BMP的方式打印的,由于GT20是竖排的,因此在u8g的DrawHBitmap基础上改出个DrawVBitmap。
  1. #include <SPI.h>
  2. #include "U8glib.h"

  3. U8GLIB_SSD1306_128X64 u8g(A3,A1,A2);
  4. byte gb[32];

  5. void DrawVBitmap(u8g_t *u8g, u8g_uint_t x, u8g_uint_t y, u8g_uint_t cnt, const uint8_t *bitmap)
  6. {
  7.   y += cnt*8;
  8.   while( cnt > 0 )
  9.   {
  10.     u8g_Draw8Pixel(u8g, x, y, 3, *bitmap);
  11.     bitmap++;
  12.     cnt--;
  13.     y-=8;
  14.   }
  15. }

  16. 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)
  17. {
  18.   if ( u8g_IsBBXIntersection(u8g, x, y, cnt*8, w) == 0 )
  19.     return;
  20.   while( w > 0 )
  21.   {
  22.     DrawVBitmap(u8g, x, y, cnt, bitmap);
  23.     bitmap += cnt;
  24.     x++;
  25.     w--;
  26.   }
  27. }

  28. long getAddress(int msb, int lsb)
  29. {
  30.   long address;
  31.   address = (msb - 0xB0) * 94;
  32.   address = address + (lsb - 0xA1)+ 846;
  33.   address = address*32;
  34.   return address;
  35. }

  36. void getBitmap(long address, byte* b)
  37. {
  38.   digitalWrite(10,LOW);
  39.   SPI.transfer(0x03);
  40.   SPI.transfer((address>>16)&0xff);
  41.   SPI.transfer((address>>8)&0xff);
  42.   SPI.transfer((address)&0xff);

  43.   for(int i=0;i<32;i++)
  44.   {
  45.     if(i>15)
  46.       b[(i-16)*2] = SPI.transfer(0);
  47.     else
  48.       b[i*2+1]=SPI.transfer(0);
  49.   }
  50.   digitalWrite(10,HIGH);  
  51. }

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

  57. long address;
  58. void setup(void) {

  59.   //LED VCC
  60.   pinMode(4,OUTPUT);
  61.   digitalWrite(4,HIGH);

  62.   //GT20 VCC  
  63.   pinMode(7,OUTPUT);
  64.   digitalWrite(7,HIGH);

  65.   //GT20 CS
  66.   pinMode(10,OUTPUT);

  67.   // assign default color value
  68.   if ( u8g.getMode() == U8G_MODE_R3G3B2 )
  69.     u8g.setColorIndex(255);     // white
  70.   else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
  71.     u8g.setColorIndex(3);         // max intensity
  72.   else if ( u8g.getMode() == U8G_MODE_BW )
  73.     u8g.setColorIndex(1);         // pixel on

  74.   SPI.begin();
  75.   SPI.setDataMode(SPI_MODE3);
  76.   SPI.setBitOrder(MSBFIRST);

  77.   //C7B6嵌
  78.   int msb = 0xc7;
  79.   int lsb = 0xb6;
  80.   address = getAddress(msb, lsb);
  81. }

  82. void loop(void) {
  83.   getBitmap(address, gb);
  84.   address+=32;
  85.   // picture loop
  86.   u8g.firstPage();  
  87.   do {
  88.     draw();
  89.   }
  90.   while( u8g.nextPage() );

  91.   // rebuild the picture after some delay
  92.   delay(500);
  93. }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 22:19 , Processed in 0.040903 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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