极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 37826|回复: 12

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

[复制链接]
发表于 2013-6-1 23:26:59 | 显示全部楼层 |阅读模式
本帖最后由 飞雪非血 于 2013-6-2 00:12 编辑

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

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

就是下面这个货

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

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

[pre lang="51" 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  fontaddr=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,"   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);
        }
}

[/code]
回复

使用道具 举报

发表于 2013-12-7 20:34:29 | 显示全部楼层
本帖最后由 hmjack2008 于 2013-12-7 20:35 编辑

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

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


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


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


  14. #define uchar unsigned char
  15. #define uint unsigned int
  16. #define ulong unsigned long


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


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



  25. /*写指令到LCD模块*/
  26. void transfer_command_lcd(int data1)   
  27. {
  28.         uchar i;

  29.         digitalWrite(lcd_rs, LOW);
  30.         for(i=0;i<8;i++)
  31.                    {
  32.                 digitalWrite(lcd_sclk, LOW);
  33.                 digitalWrite(lcd_sid, (data1&0x80));
  34.                 digitalWrite(lcd_sclk, HIGH);
  35.                 data1=data1<<=1;
  36.                            }
  37. }
  38. /*写数据到LCD模块*/
  39. void transfer_data_lcd(int data1)
  40. {
  41.         uchar i;

  42.         digitalWrite(lcd_rs, HIGH);
  43.         for(i=0;i<8;i++)
  44.                            {
  45.                 digitalWrite(lcd_sclk, LOW);
  46.                 digitalWrite(lcd_sid, (data1&0x80));
  47.                 digitalWrite(lcd_sclk, HIGH);
  48.                 data1=data1<<=1;
  49.                            }
  50. }
  51. /*LCD模块初始化*/
  52. void initial_lcd()
  53. {

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

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


  63.       digitalWrite(Rom_CS, HIGH);

  64.           digitalWrite(lcd_cs, LOW);
  65.           digitalWrite(lcd_reset, LOW);  
  66.           delay(200);
  67.           digitalWrite(lcd_reset, HIGH);
  68.           delay(1000);       
  69.           transfer_command_lcd(0xe2);//system reset
  70.           delay(200);

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

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

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

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

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

  84.       digitalWrite(lcd_cs, HIGH);

  85. }
  86. /*设置 页地址 列地址*/
  87. void lcd_address(uint page,uint column)
  88. {
  89.         transfer_command_lcd(0xB0+page);        /*设置页地址*/
  90.         transfer_command_lcd(0x10+(column>>4 & 0x0F));        /*设置列地址的高4位*/
  91.         transfer_command_lcd(column & 0x0F);        /*设置列地址的低4位*/        
  92. }
  93. /*全屏清屏*/
  94. void clear_screen()
  95. {
  96.         uchar i,j;

  97.         digitalWrite(Rom_CS, HIGH);
  98.         digitalWrite(lcd_cs, LOW);

  99.         for(i=0;i<9;i++)
  100.         {
  101.                 transfer_command_lcd(0xb0+i);
  102.                 transfer_command_lcd(0x10);
  103.                 transfer_command_lcd(0x00);
  104.                 for(j=0;j<132;j++) transfer_data_lcd(0x00);
  105.         }
  106.         digitalWrite(lcd_cs, HIGH);
  107. }
  108. /*显示16x16点阵图像、汉字、生僻字或16x16点阵的其他图标*/
  109. void display_graphic_16x16(uint page,uint column,uchar *dp)
  110. {
  111.         uchar i,j;

  112.         digitalWrite(Rom_CS, HIGH);   
  113.         digitalWrite(lcd_cs, LOW);

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

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

  145.         digitalWrite(lcd_cs, LOW);
  146.         lcd_address(page,column);

  147.         for (col_cnt=0;col_cnt<8;col_cnt++) // 显示8*8点阵图像
  148.         {        
  149.                 transfer_data_lcd(*dp);
  150.                 dp++;
  151.         }
  152.         digitalWrite(lcd_cs, HIGH);
  153. }
  154. /*显示5*7点阵图像、ASCII, 或5x7点阵的自造字符、其他图标*/
  155. void display_graphic_5x7(uint page,uchar column,uchar *dp)
  156. {
  157.         uchar col_cnt;

  158.         digitalWrite(lcd_cs, LOW);
  159.         lcd_address(page,column);

  160.         for (col_cnt=0;col_cnt<5;col_cnt++) // 显示5*8点阵图像
  161.         {        
  162.                 transfer_data_lcd(*dp); // 显示列:8点
  163.                 dp++;
  164.         }
  165.         digitalWrite(lcd_cs, HIGH);
  166. }


  167. /****送指令到字库IC***/
  168. void send_command_to_ROM(uchar datu)
  169. {
  170.         uchar i;

  171.         for(i=0;i<8;i++)
  172.         {
  173.                         digitalWrite(Rom_SCK, LOW);
  174.                 digitalWrite(Rom_IN, (datu&0x80));
  175.                 datu = datu<<1;
  176.                 // digitalWrite(Rom_SCK, LOW);
  177.                 digitalWrite(Rom_SCK, HIGH);
  178.         }
  179. }
  180. /****从字库IC中取汉字或字符数据(1个字节)***/
  181. static uchar get_data_from_ROM( )
  182. {
  183.         uchar i;
  184.         uchar ret_data=0;

  185.         digitalWrite(Rom_SCK, HIGH);
  186.         for(i=0;i<8;i++)
  187.         {
  188.                 // pinMode(Rom_OUT,INPUT_PULLUP); // pull high
  189.                 digitalWrite(Rom_SCK, LOW);
  190.                 ret_data = ret_data<<1;
  191.                 if(digitalRead(Rom_OUT)) ret_data++;
  192.                 digitalWrite(Rom_SCK, HIGH);
  193.         }
  194.         return(ret_data);
  195. }
  196. /*
  197.   从相关地址
  198.         addrHigh :地址高字节
  199.         addrMid  :地址中字节
  200.         addrLow  :地址低字节
  201.   中连续读出DataLen个字节的数据到 pBuff的地址
  202. */
  203. /*连续读取*/
  204. void get_n_bytes_data_from_ROM(uchar addrHigh,uchar addrMid,uchar addrLow,uchar *pBuff,uchar DataLen )
  205. {
  206.         uchar i;

  207.         digitalWrite(lcd_cs, HIGH);

  208.         digitalWrite(Rom_CS, LOW);
  209.         digitalWrite(Rom_SCK, LOW);
  210.         send_command_to_ROM(0x03);
  211.         send_command_to_ROM(addrHigh);
  212.         send_command_to_ROM(addrMid);
  213.         send_command_to_ROM(addrLow);
  214.         for(i = 0; i < DataLen; i++ )
  215.              *(pBuff+i) = get_data_from_ROM();
  216.         digitalWrite(Rom_CS, HIGH);
  217. }
  218. /******************************************************************/


  219. unsigned long fontaddr=0;

  220. void display_GB2312_string(uchar y,uchar x,const char *text)
  221. {
  222.         uchar i= 0;
  223.         uchar addrHigh,addrMid,addrLow;
  224.         uchar fontbuf[32];
  225.         byte *gb_code = (byte *)text;      

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

  233.                                                 fontaddr = (gb_code[i]-0xB0)*94;
  234.                                                 fontaddr += (gb_code[i+1]-0xA1)+846;
  235.                                                 fontaddr = (unsigned long)(fontaddr*32);

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

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

  251.                         fontaddr = (gb_code[i]-0xA1)*94;
  252.                         fontaddr += (gb_code[i+1]-0xA1);
  253.                         fontaddr = (unsigned long)(fontaddr*32);

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

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

  267.                         fontaddr = (gb_code[i]-0x20);
  268.                         fontaddr = (unsigned long)(fontaddr*16);
  269.                         fontaddr = (unsigned long)(fontaddr+0x3B7C0); // +0x3CF80);

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

  273.                         // 取16个字节的数据,存到"fontbuf[32]"
  274.                         get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,16 );
  275.                         // 显示8x16的ASCII字到LCD上,y为页地址,x为列地址,fontbuf[]为数据
  276.                         display_graphic_8x16(y,x,fontbuf);
  277.                         i+=1;
  278.                         x+=8;
  279.                 }
  280.                 else
  281.                         i++;        
  282.         }
  283. }


  284. void display_5x7_string(uchar y,uchar x,const char *text)
  285. {
  286.         uchar i= 0;
  287.         uchar addrHigh,addrMid,addrLow ;
  288.         byte *gb_code = (byte *)text;

  289.         while((gb_code[i]>0x00))
  290.         {
  291.                 if((gb_code[i]>=0x20) &&(gb_code[i]<=0x7E))
  292.                 {                                                
  293.                         uchar fontbuf[8];

  294.                         fontaddr = (gb_code[i]-0x20);
  295.                         fontaddr = (unsigned long)(fontaddr*8);
  296.                         fontaddr = (unsigned long)(fontaddr+0x3BFC0);

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

  300.                         // 取8个字节的数据,存到"fontbuf[32]"
  301.                         get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,8);
  302.                         // 显示5x7的ASCII字到LCD上,y为页地址,x为列地址,fontbuf[]为数据
  303.                         display_graphic_5x7(y,x,fontbuf);
  304.                         i+=1;
  305.                         x+=6;
  306.                 }
  307.                 else
  308.                                 i++;
  309.         }
  310. }


  311. //===============main program===================
  312. void setup()
  313. {
  314.     initial_lcd();
  315.     clear_screen();        //clear all dots   

  316.         delay(1000);
  317. }

  318. void loop()
  319. {  

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

  323.                 clear_screen();
  324.                 display_GB2312_string(0,0,(const char*)str0);
  325.                 /***
  326.                 display_GB2312_string(0,0,"12864 带中文字库");
  327.                 display_GB2312_string(2,0,"16X16 简体汉字库");
  328.                 display_GB2312_string(4,0,"8X16   点阵ASCII");
  329.                 display_GB2312_string(6,0,"5X7  点阵ASCII码");
  330.                 ***/
  331.                 delay(3000);

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

  337.                 clear_screen();
  338.                 display_GB2312_string(0,0,"8x16 ASCII :");
  339.                 display_GB2312_string(2,0," !"#$%$'()*+,-./");
  340.                 display_GB2312_string(4,0,"0123456789:;<=>?");
  341.                 display_GB2312_string(6,0,"@ABCDEFGHIJKLMNO");
  342.                 delay(3000);
  343.                 clear_screen();
  344.                 display_GB2312_string(0,0,"8x16 ASCII :");
  345.                 display_GB2312_string(2,0,"PQRSTUVWXYZ[\\]^_");
  346.                 display_GB2312_string(4,0,"`abcdefghijklmno");
  347.                 display_GB2312_string(6,0,"pqrstuvwxyz{|}~ ");
  348.                 delay(5000);
  349.               
  350.                 clear_screen();
  351.                 display_5x7_string(0,0,"5x7 font :");
  352.                 display_5x7_string(2,0," !"#$%$'()*+,-./");
  353.                 display_5x7_string(3,0,"0123456789:;<=>?");
  354.                 display_5x7_string(4,0,"@ABCDEFGHIJKLMNO");
  355.                 display_5x7_string(5,0,"PQRSTUVWXYZ[\\]^_");
  356.                 display_5x7_string(6,0,"`abcdefghijklmno");
  357.                 display_5x7_string(7,0,"pqrstuvwxyz{|}~ ");
  358.                 delay(5000);
  359. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-12-17 21:15:16 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

发表于 2014-4-26 13:27:44 | 显示全部楼层
hmjack2008 发表于 2013-12-7 20:34
手上刚好有这个mini12864带GT20L16S1Y的字库芯片, 写成 Arduino程序不难, 但Arduino编译器却是Unicode(UTF- ...

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

使用道具 举报

发表于 2014-4-26 13:33:57 | 显示全部楼层
#include <SPI.h>
#include "U8glib.h"

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

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[i*2+1]=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);
}
回复 支持 反对

使用道具 举报

发表于 2014-6-8 07:08:14 | 显示全部楼层
utf8真的让用汉字的人很无语。。。
回复 支持 反对

使用道具 举报

发表于 2014-7-6 01:01:59 | 显示全部楼层
hmjack2008 发表于 2013-12-7 20:34
手上刚好有这个mini12864带GT20L16S1Y的字库芯片, 写成 Arduino程序不难, 但Arduino编译器却是Unicode(UTF- ...

高人,明天细细研究。
回复 支持 反对

使用道具 举报

发表于 2016-1-6 14:37:27 | 显示全部楼层
那结论是什么呢?16s1y这个字库芯片能不能用?
回复 支持 反对

使用道具 举报

发表于 2016-2-8 02:48:55 | 显示全部楼层
也在找这方面的资料。怎么样呢?
回复 支持 反对

使用道具 举报

发表于 2016-2-15 10:14:59 | 显示全部楼层
s1213 发表于 2014-4-26 13:33
#include
#include "U8glib.h"

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

  1. if(MSB ==0xA9 && LSB >=0xA1)  
  2.   Address =  (282 + (LSB - 0xA1 ))*32+BaseAdd;
  3. else if(MSB >=0xA1 && MSB <= 0xA3 && LSB >=0xA1)  
  4.   Address =( (MSB - 0xA1) * 94 + (LSB - 0xA1))*32+ BaseAdd;
  5. else if(MSB >=0xB0 && MSB <= 0xF7 && LSB >=0xA1)   
  6.   Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2016-2-19 16:06:33 | 显示全部楼层
janeasy 发表于 2016-2-15 10:14
我按照手册的公式获得点阵数据,只有 B0和B1 这两段内的文字可以正常显示,其他均对不上。
不知道是不是 ...

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

使用道具 举报

发表于 2016-2-21 23:16:59 | 显示全部楼层
s1213 发表于 2016-2-19 16:06
技术手册的公式抄对了的话一定没有问题,注意多检查自身,还有既然有对的了,看看为什么这两个对,别的为 ...

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

使用道具 举报

发表于 2016-8-16 11:43:08 | 显示全部楼层
janeasy 发表于 2016-2-21 23:16
问题解决了,Arduino 的数字计算结果并不能自动提高类型,导致溢出。

你好 我现在也是在弄这个问题,我的总是显示一整块亮点,你能方便留个联系方式吗,我想请教一下
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-4 13:10 , Processed in 0.051003 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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