|
发表于 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[32];
- byte *gb_code = (byte *)text;
- while((gb_code[i]>0x00))
- {
- if(((gb_code[i]>=0xB0)&&(gb_code[i]<=0xF7))&&(gb_code[i+1]>=0xA1))
- {
- // 国标简体(GB2312)汉字在字库IC中的地址由以下公式来计算:
- // Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0
- // 由于担心8位单片机有乘法溢出问题,所以分三部取地址
- fontaddr = (gb_code[i]-0xB0)*94;
- fontaddr += (gb_code[i+1]-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[32]"
- 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[i]>=0xA1)&&(gb_code[i]<=0xA3))&&(gb_code[i+1]>=0xA1))
- {
- // 国标简体(GB2312)15x16点的字符在字库IC中的地址由以下公式来计算
- // Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0
- // 由于担心8位单片机有乘法溢出问题,所以分三部取地址
- fontaddr = (gb_code[i]-0xA1)*94;
- fontaddr += (gb_code[i+1]-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[32]"
- 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[i]>=0x20)&&(gb_code[i]<=0x7E))
- {
- // uchar fontbuf[16];
- fontaddr = (gb_code[i]-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[32]"
- 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[i]>0x00))
- {
- if((gb_code[i]>=0x20) &&(gb_code[i]<=0x7E))
- {
- uchar fontbuf[8];
- fontaddr = (gb_code[i]-0x20);
- fontaddr = (unsigned long)(fontaddr*8);
- fontaddr = (unsigned long)(fontaddr+0x3BFC0);
- addrHigh = (fontaddr&0xff0000)>>16;
- addrMid = (fontaddr&0xff00)>>8;
- addrLow = fontaddr&0xff;
- // 取8个字节的数据,存到"fontbuf[32]"
- 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[17] =
- {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);
- }
复制代码 |
|