谁能提供字库芯片的使用方法啊
本帖最后由 飞雪非血 于 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: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);
}
学习一下:$:$:$:$:$ hmjack2008 发表于 2013-12-7 20:34 static/image/common/back.gif
手上刚好有这个mini12864带GT20L16S1Y的字库芯片, 写成 Arduino程序不难, 但Arduino编译器却是Unicode(UTF- ...
您好,我想使用adafruit的库,看着和您的那个u8g的库差不多,但是输出的字也是向右旋转90度的,您的那个旋转的方法我没有看的很明白,你能给详细的解释一下方法或者注释一下代码么?谢谢 #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);
} utf8真的让用汉字的人很无语。。。 hmjack2008 发表于 2013-12-7 20:34 static/image/common/back.gif
手上刚好有这个mini12864带GT20L16S1Y的字库芯片, 写成 Arduino程序不难, 但Arduino编译器却是Unicode(UTF- ...
高人,明天细细研究。 那结论是什么呢?16s1y这个字库芯片能不能用? 也在找这方面的资料。怎么样呢? 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;
janeasy 发表于 2016-2-15 10:14 static/image/common/back.gif
我按照手册的公式获得点阵数据,只有 B0和B1 这两段内的文字可以正常显示,其他均对不上。
不知道是不是 ...
技术手册的公式抄对了的话一定没有问题,注意多检查自身,还有既然有对的了,看看为什么这两个对,别的为什么不对,估计还是哪里有问题,把思路一点一点写下来,然后过几天再看,估计就能找到错误了
[email protected]我的邮箱不明白再联系! s1213 发表于 2016-2-19 16:06 static/image/common/back.gif
技术手册的公式抄对了的话一定没有问题,注意多检查自身,还有既然有对的了,看看为什么这两个对,别的为 ...
问题解决了,Arduino 的数字计算结果并不能自动提高类型,导致溢出。 janeasy 发表于 2016-2-21 23:16 static/image/common/back.gif
问题解决了,Arduino 的数字计算结果并不能自动提高类型,导致溢出。
你好 我现在也是在弄这个问题,我的总是显示一整块亮点,你能方便留个联系方式吗,我想请教一下
页:
[1]