开发平台: Tiva C 系列 EK-TM4C123GXL LaunchPad
MCU型号:TM4C123GH6PM ,80MHz 32-bit ARM Cortex-M4F CPU
液晶驱动芯片:UC1701
字库芯片:GT20L16S1Y
注意事项:使用3.3V供电,标的+5V有误

第一部分:液晶模块介绍(摘自网络)
STN图形COG液晶模块广泛应用于手持设备、金融机具、MP3歌词显示、DAB收音机等诸多场合。然而使用液晶模块的整机制造厂商一般都要在主控板上安装含字库数据的存储芯片,两者组合才能实现液晶模块的文字显示功能。鉴于汉字库标准化、专业化要求的特殊性,整机制造厂商均希望LCM厂商提供字库一体化液晶模块以省去字库开发工作。之前带中外文字库的COB液晶驱动芯片已应运而生,如ST7920、RA8816等。可是COG驱动芯片限于裸片尺寸,无法将字库整合到单芯片中,致使字库+液晶显示一体化COG模块迄今仍是一项市场空白。
本文介绍了一种整合
STN液晶显示驱动芯片UC1701和上海高通半导体的
标准字库芯片GT2X系列为一体的液晶显示模块方案。这两种芯片均采用SPI标准串行接口总线。UC1701是典型的128×64点阵COG液晶驱动芯片。GT2X系列字库芯片含有简、繁体中文,各类字符集;12点至32点阵多种大小字库以及170多国外文字库等多款规格。该方案可填补字库液晶模块市场的空白,大大提高整机文字显示软硬件设计的简便性和文字专业性,并可明显降低模块成本。此外,本文还就该方案替代16字符×3行的字符式COB和COG液晶显示模块以及替代中日韩文COB液晶显示模块的实现方案进行了说明。
字库COG图形显示模块实现原理:字库COG一体化模块的实现得益于专业字库芯片厂商上海高通半导体公司最新推出的微型封装的
标准字库芯片GT20L16S1Y(2.9mm×1.6 mm),可以像阻容元器件一样贴片在FPC软板上,从而可以和典型的COG驱动芯片(本方案采用的是UC1701)整合为一体化字库COG模块。其实现原理和产品化实物照片见图1。
图1:字库COG一体化模块实现原理和产品化实物图
图1中COG驱动芯片UC1701和字库芯片GT20X系列均采用SPI总线,为了少用CPU的I/O接口,对应CPU内的SPI接口总线可以简化为只需CPU的一个SPI接口(3线)辅以#1和#2两根CS片选线,只需增加一个I/O接口,因此原有主控板只需做增加一根#2片选线的微小改动。为简化FPC字库芯片布线,实际产品中GT20的SPI接口未在FPC上与COG驱动芯片UC1701的SPI #1接口直接复联,而是将字库芯片的4根接口总线和2根电源线直接通过FPC与CPU连接,从而只用单面FPC即可实现本方案。本方案采用现有的COG图形模块,无需改动原玻璃设计,只需新开FPC软板即可实现,这是由于字库芯片虽然被安装为一体化模块中,但在电气上与COG驱动芯片并无直接联接,两者同时连向CPU总线上进行工作。对于没有SPI硬件接口的MCU,可利用通用GPIO接口实现软件模拟SPI接口。图1中电容C1是用于提高干扰性能的退耦电容,是否安装视FPC引线长短而定。
COG驱动芯片UC1701为典型的128×64点阵STN液晶驱动芯片,可显示16×16点阵汉字,8字×4行共32个汉字,相同功能的芯片还有ST756S和SPL502等。
字库芯片为GT20L16S1Y,芯片内已经固化了GB2312国家标准字库集I、II级6763汉字和846个国际全角字库以及96个ASCII英文、数字字符。COG驱动芯片UC1701 内置字符点阵为国家标准GB5199 15×16标准点阵字形。该方案同时也可以适用于3寸以内的汉字COB方案。
以上模块中的字库芯片换用GT20L16P1Y后,片内含有Unicode常用字库和GBK常用简繁体字库可以分别满足MP3的歌名显示和歌词显示的不同字符集内码。外文字库芯片GT20L24F6Y内置173国外文字库,单芯片即可满足外销产品的几乎所有文字,并且除5×7基本点阵外,还有16点阵和24点阵等大点阵外文字库。
显示流程:MCU将所需显示汉字的双字节内码转换成3字节字库芯片存储总线中对应地址码;从字库芯片中读出对应的32字节(15×16点阵)的字形数据通过MCU送往COG液晶显示屏,即完成一个汉字的显示。
图2:字库COG一体化液晶模块显示流程
以上字库COG一体化液晶模块具有以下特点: 1.字库芯片安装在FPC软板上,无需改动原有玻璃设计;
2.单一规格COG同时支持全球各国外文;
3.汉字点阵为GB5199国标正版字形数据;
字符式LCM模块+字库实现原理:
图3:图形COG替代方案
图4:字符式COG传统方案
图5:字符式COB传统方案
针对字符式COG(图4)和字符式COB(图5)液晶模块,对应的字库模块替代方案见图3,由UC1701驱动芯片和GT20L24F6Y两片组成,其原理同图1。利用图3中128×64图形显示模块可以同时支持16字符×1行直到 16字符×8行显示。字符是由8×8显示像素组成,因此对于128×64图形屏,16字符×1行占用128×8,2行占用128×16,3行占用128×24,8行占用128×64。采用图形显示方案替换传统字符式COB和COG的特点如下:
1.同时支持173国外文,而传统方案的驱动芯片针对小语种需要另开字库掩膜;
2.除了支持传统字符COB和COG的8套外文之外,还支持ISO8859编码的全部14套5×7字符。此外还支持Unicode编码的173国5×7字符;
3.改变的传统方案只能显示5×7字符的单一字号。同时支持5×7、7×8、8×16、6×18、12×24 五种字号以及16点和24点不等宽字符
4.驱动芯片无需因字符行数增加而升级,显示多行时,成本降低更明显。
汉字COB方案实现原理
图6:字库COB替代方案
图7:字库COB传统方案
采用图形式COB(控制芯片0107)加上字库芯片实现192×64的汉字COB模块(见图6),与传统COB字库模块(控制芯片7920)相比(见图7),除了芯片成本降低近一半以外,还具有传统方案无法实现的特点:
1、多点阵(11×12、15×16、24×24)大中小字显示;
2、图形和文字可以混合排放;
3、单芯片同时支持中日韩及173国外文;无需针对日文或韩文另外定制字库掩膜;
4、打印机可以共享COB字库;
5、 汉字点阵为GB5199和GB5007国际正版字型,字形规范、美观。
128×64的汉字COB模块方案与上述图6的COB模块方案原理相同。
表1:字库一体化液晶模块适用字库
第二部分:源码
oled.h文件
#ifndef _OLED_H
#define _OLED_H
#include <stdint.h>
#include <stdbool.h>
#include "inc/tm4c123gh6pm.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#define uchar uint8_t
#define uint uint16_t
#define ulong uint32_t
/*************************************************/
#define OLED_GPIO_BASE GPIO_PORTA_BASE
#define OLED_SYSCTL_PERIPH SYSCTL_PERIPH_GPIOA
#define OLED_SCLK GPIO_PIN_2 //A2
#define OLED_SID GPIO_PIN_3 //A3
#define OLED_RS GPIO_PIN_4 //A4
#define OLED_RESET GPIO_PIN_5 //A5
#define OLED_CS GPIO_PIN_6 //A6
/**********************************************/
#define LCDSCLK_1 GPIOPinWrite(OLED_GPIO_BASE, OLED_SCLK, OLED_SCLK)
#define LCDSCLK_0 GPIOPinWrite(OLED_GPIO_BASE, OLED_SCLK, 0)
#define LCDSID_1 GPIOPinWrite(OLED_GPIO_BASE, OLED_SID, OLED_SID)
#define LCDSID_0 GPIOPinWrite(OLED_GPIO_BASE, OLED_SID, 0)
#define LCDRS_1 GPIOPinWrite(OLED_GPIO_BASE, OLED_RS, OLED_RS)
#define LCDRS_0 GPIOPinWrite(OLED_GPIO_BASE, OLED_RS, 0)
#define LCDRESET_1 GPIOPinWrite(OLED_GPIO_BASE, OLED_RESET, OLED_RESET)
#define LCDRESET_0 GPIOPinWrite(OLED_GPIO_BASE, OLED_RESET, 0)
#define LCDCS_1 GPIOPinWrite(OLED_GPIO_BASE, OLED_CS, OLED_CS)
#define LCDCS_0 GPIOPinWrite(OLED_GPIO_BASE, OLED_CS, 0)
/********************字库IC*****************************/
#define OLEDROM_GPIO_BASE GPIO_PORTB_BASE
#define OLEDROM_SYSCTL_PERIPH SYSCTL_PERIPH_GPIOB
#define OLED_ROMIN GPIO_PIN_0 //B0
#define OLED_ROMOUT GPIO_PIN_1 //B1
#define OLED_ROMSCK GPIO_PIN_2 //B2
#define OLED_ROMCS GPIO_PIN_3 //B3
/**********************************************/
#define ROMIN_1 GPIOPinWrite(OLEDROM_GPIO_BASE, OLED_ROMIN, OLED_ROMIN)
#define ROMIN_0 GPIOPinWrite(OLEDROM_GPIO_BASE, OLED_ROMIN, 0)
#define ROMOUT_1 GPIOPinWrite(OLEDROM_GPIO_BASE, OLED_ROMOUT, OLED_ROMOUT)
#define ROMOUT_0 GPIOPinWrite(OLEDROM_GPIO_BASE, OLED_ROMOUT, 0)
#define ROMSCK_1 GPIOPinWrite(OLEDROM_GPIO_BASE, OLED_ROMSCK, OLED_ROMSCK)
#define ROMSCK_0 GPIOPinWrite(OLEDROM_GPIO_BASE, OLED_ROMSCK, 0)
#define ROMCS_1 GPIOPinWrite(OLEDROM_GPIO_BASE, OLED_ROMCS, OLED_ROMCS)
#define ROMCS_0 GPIOPinWrite(OLEDROM_GPIO_BASE, OLED_ROMCS, 0)
void LCD_Init();
void clear_screen();
void lcd_address(uint8_t page,uint8_t column);
void transfer_command_lcd(uint8_t data1);
void transfer_data_lcd(uint8_t data1);
void display_graphic_8x16(uint8_t page,uint8_t column,uint8_t *dp);
void display_string_8x16(uint8_t y,uint8_t x,uint8_t type,uint8_t *text);
void display_graphic_16x16(uint8_t page,uint8_t column,uint8_t *dp);
void display_GB2312_string(uint8_t y,uint8_t x,uint8_t *text);
//显示连续的字符时,页地址可为1-8列地址x必须为1+5*n形式,否则缺码
void display_graphic_5x7(uint8_t page,uint8_t column,uint8_t *dp);/*自造*/
void display_string_5x7(uint8_t y,uint8_t x,uint8_t *text);
//显示连续的字符时,页地址可为1-列地址x必须为1+7*n形式,否则缺码
void display_graphic_7x8(uint8_t page,uint8_t column,uint8_t *dp);/*自造*/
void display_string_7x8(uint8_t y,uint8_t x,uint8_t *text);
void OLED_Fill(uint8_t dat);
uint8_t OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t color);
void OLED_Refresh_Gram();
#endif
oled.c文件
#include "oled.h"
void transfer_command_lcd(uint8_t data1)
{
char i;
LCDRS_0;
for(i=0;i<8;i++)
{
LCDSCLK_0;
if(data1&0x80)
LCDSID_1;
else
LCDSID_0;
LCDSCLK_1;
data1=data1<<=1;
}
}
void transfer_data_lcd(uint8_t data1)
{
char i;
LCDRS_1;
for(i=0;i<8;i++)
{
LCDSCLK_0;
if(data1&0x80) LCDSID_1;
else LCDSID_0;
LCDSCLK_1;
data1=data1<<=1;
}
}
void lcd_delay(uint8_t n_ms)
{
uint8_t j,k;
for(j=0;j<n_ms;j++)
for(k=0;k<10;k++);
}
/*
page :1~8
column:1~128
*/
void lcd_address(uint8_t page,uint8_t column)
{
column=column-0x01;
transfer_command_lcd(0xb0+page-1);
transfer_command_lcd(0x10+(column>>4&0x0f));
transfer_command_lcd(column&0x0f);
}
void clear_screen()
{
uint8_t i,j;
LCDCS_0;
ROMCS_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);
}
}
LCDCS_1;
}
void LCD_Init()
{
ROM_SysCtlPeripheralEnable(OLED_SYSCTL_PERIPH | OLEDROM_SYSCTL_PERIPH );
//turn all control GPIO output mode
ROM_GPIOPinTypeGPIOOutput(OLED_GPIO_BASE , OLED_SCLK|OLED_SID|OLED_RS|OLED_RESET|OLED_CS );
ROM_GPIOPinTypeGPIOOutput(OLEDROM_GPIO_BASE , OLED_ROMIN|OLED_ROMOUT|OLED_ROMSCK|OLED_ROMCS);
// turn all control GPIO low
GPIOPinWrite(OLED_GPIO_BASE , OLED_SCLK|OLED_SID|OLED_RS|OLED_RESET|OLED_CS , 0 );
GPIOPinWrite(OLEDROM_GPIO_BASE , OLED_ROMIN|OLED_ROMOUT|OLED_ROMSCK|OLED_ROMCS , 0);
LCDCS_0;
ROMCS_1;
LCDRESET_0;
lcd_delay(20);
LCDRESET_1;
lcd_delay(20);
transfer_command_lcd(0xe2); /*???*/
lcd_delay(5);
transfer_command_lcd(0x2c); /*????1*/
lcd_delay(5);
transfer_command_lcd(0x2e); /*????2*/
lcd_delay(5);
transfer_command_lcd(0x2f); /*????3*/
lcd_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); /*???*/
LCDCS_1;
}
/*5*7μãÕó£¬ASCII£¬5*7×ÔÔì*/
void display_graphic_5x7(uint8_t page,uint8_t column,uint8_t *dp)
{
uint col_cnt;
uchar page_address;
uchar column_address_L,column_address_H;
page_address = 0xb0+page-1;
LCDCS_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<5;col_cnt++)
{
transfer_data_lcd(*dp);
dp++;
}
LCDCS_1;
}
/*7*8μãÕó£¬ASCII,×ÔÔì*/
void display_graphic_7x8(uint8_t page,uint8_t column,uint8_t *dp)
{
uint col_cnt;
uchar page_address;
uchar column_address_L,column_address_H;
page_address = 0xb0+page-1;
LCDCS_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<7;col_cnt++)
{
transfer_data_lcd(*dp);
dp++;
}
LCDCS_1;
}
void display_graphic_8x16(uint8_t page,uint8_t column,uint8_t *dp)
{
uint8_t i,j;
LCDCS_0;
for(j=0;j<2;j++)
{
lcd_address(page+j,column);
for (i=0;i<8;i++)
{
transfer_data_lcd(*dp);
dp++;
}
}
LCDCS_1;
}
void display_graphic_16x16(uint8_t page,uint8_t column,uint8_t *dp)
{
uint8_t i,j;
LCDCS_0;
ROMCS_1;
for(j=0;j<2;j++)
{
lcd_address(page+j,column);
for (i=0;i<16;i++)
{
transfer_data_lcd(*dp);
dp++;
}
}
LCDCS_1;
}
/****×Ö¿aICÇy¶ˉ£¬D′Ö¸áî***/
void send_command_to_ROM( uint8_t datu )
{
uint8_t i;
for(i=0;i<8;i++ )
{
if(datu&0x80)//¸ßλÔúÇ°
ROMIN_1;
else
ROMIN_0;
datu = datu<<1;
ROMSCK_0;//éÏéyÑØòÆèë
ROMSCK_1;
}
}
/****×Ö¿aICÇy¶ˉ£¬¶áêy¾Y***/
static uint8_t get_data_from_ROM( )
{
uint8_t i;
uint8_t ret_data=0;
ROMSCK_1;
for(i=0;i<8;i++)
{
//ROM_GPIOPinTypeGPIOOutput(OLEDROM_GPIO_BASE, OLED_ROMOUT);//éèÖÃROMOUTÎaêä3öÄ£ê½
ROMOUT_1;
ROMSCK_0;
ret_data=ret_data<<1;//Ïè¶á¸ßλ
GPIOPinTypeGPIOInput(OLEDROM_GPIO_BASE, OLED_ROMOUT);//éèÖÃᬽóROMOUTμÄ1ü½ÅÎaêäèë
if(GPIOPinRead(OLEDROM_GPIO_BASE, OLED_ROMOUT)==OLED_ROMOUT)//¶áOLED×Ö¿aICμÄROMOUT
ret_data=ret_data+1;
else
ret_data=ret_data+0;
ROMSCK_1;
}
ROM_GPIOPinTypeGPIOOutput(OLEDROM_GPIO_BASE, OLED_ROMOUT);//óÖ°ÑéèÖÃROMOUTÎaêä3öÄ£ê½
return(ret_data);
}
/************************************************
*24bit address data
¶áè¡′æ·ÅÔú×Ö¿aICàïμÄμãÕóDÅÏ¢
***************************************************/
void ReadDataBytes(uint8_t addrHigh,uint8_t addrMid,uint8_t addrLow,uint8_t *pBuff,uint8_t DataLen )
{
uint8_t i;
ROMCS_0;
LCDCS_1;
//ROMSCK_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();
}
ROMCS_1;
}
/************************************************
*24bit address data
***************************************************/
void display_string_5x7(uchar y,uchar x,uchar *text)
{
uint8_t i= 0;
uint32_t fontaddr=0;
uint32_t BaseAdd=0x3bfc0;
uint8_t addrHigh,addrMid,addrLow;
while((text>0x00))
{
if((text>=0x20) &&(text<=0x7e)) //è·±£ÔúÂëλ·¶Î§
{
uint8_t fontbuf[8]; //′æ·Å¶áè¡μÄμãÕóDÅÏ¢
fontaddr = (text- 0x20);
fontaddr = (uint32_t)(fontaddr*8);
fontaddr = (uint32_t)(fontaddr+BaseAdd);
addrHigh = (fontaddr&0xff0000)>>16;
addrMid = (fontaddr&0xff00)>>8;
addrLow = fontaddr&0xff;
ReadDataBytes(addrHigh,addrMid,addrLow,fontbuf,8);
display_graphic_5x7(y,x,fontbuf);//àûóöáè¡μÄμãÕóDÅÏ¢»æÖÆ£¬ò2¿éòÔ×Ô¼oóÃ×ÖÄ£èí¼tè¡Ä£
i++;
x+=8;//¿é¸Ä±äò»DDÏÔê¾êèÃü
}
else
i++;
}
}
void display_string_7x8(uint8_t y,uint8_t x,uint8_t *text)
{
uint8_t i= 0;
uint32_t fontaddr=0;
uint8_t addrHigh,addrMid,addrLow ;
while((text>0x00))
{
if((text>=0x20) &&(text<=0x7e))
{
uint8_t fontbuf[8];
fontaddr = (text- 0x20);
fontaddr = (unsigned long)(fontaddr*8);
fontaddr = (unsigned long)(fontaddr+0x66c0);
addrHigh = (fontaddr&0xff0000)>>16;
addrMid = (fontaddr&0xff00)>>8;
addrLow = fontaddr&0xff;
ReadDataBytes(addrHigh,addrMid,addrLow,fontbuf,8);
display_graphic_7x8(y,x,fontbuf);
i+=1;
x+=8;//¿é¸Ä±äÿDDÏÔê¾êèÃü
}
else
i++;
}
}
/*
8*16óDèyÖÖ
@1ú±êà©Õ1×Ö·û
@ASCII×Ö·û
@ASCII′Öìå×Ö·û
*/
void display_string_8x16(uint8_t y,uint8_t x,uint8_t type,uint8_t *text)
{
uint8_t i= 0;
uint32_t fontaddr=0;
uint32_t BaseAdd=0;
uint8_t addrHigh,addrMid,addrLow ;
if(type==0)//@1ú±êà©Õ1×Ö.GB2312
{
BaseAdd=0x3b7d0;
if((text>=0x20) &&(text<=0x7e))
{
unsigned char fontbuf[16];
fontaddr = (text- 0x20);
fontaddr = (unsigned long)(fontaddr*16);
fontaddr = (unsigned long)(fontaddr+BaseAdd);
addrHigh = (fontaddr&0xff0000)>>16;
addrMid = (fontaddr&0xff00)>>8;
addrLow = fontaddr&0xff;
ReadDataBytes(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++;
}
if(type==1)//@ASCII×Ö·û
{
BaseAdd=0x3b7c0;
while((text>0x00))
{
if((text>=0x20) &&(text<=0x7e))
{
uint8_t fontbuf[16];
fontaddr = (text- 0x20);
fontaddr = (unsigned long)(fontaddr*16);
fontaddr = (unsigned long)(fontaddr+BaseAdd);
addrHigh = (fontaddr&0xff0000)>>16;
addrMid = (fontaddr&0xff00)>>8;
addrLow = fontaddr&0xff;
ReadDataBytes(addrHigh,addrMid,addrLow,fontbuf,16);
display_graphic_8x16(y,x,fontbuf);
i+=1;
x+=8;//¿é¸Ä±äÿDDÏÔê¾êèÃü
}
else
i++;
}
}
if(type==2)//@ASCII×Ö·û′Öìå
{
BaseAdd=0x3cf80;
while((text>0x00))
{
if((text>=0x20) &&(text<=0x7e))
{
uint8_t fontbuf[16];
fontaddr = (text- 0x20);
fontaddr = (unsigned long)(fontaddr*16);
fontaddr = (unsigned long)(fontaddr+BaseAdd);
addrHigh = (fontaddr&0xff0000)>>16;
addrMid = (fontaddr&0xff00)>>8;
addrLow = fontaddr&0xff;
ReadDataBytes(addrHigh,addrMid,addrLow,fontbuf,16);
display_graphic_8x16(y,x,fontbuf);
i+=1;
x+=8;//¿é¸Ä±äÿDDÏÔê¾êèÃü
}
else
i++;
}
}
}
void display_GB2312_string(uint8_t y,uint8_t x,uint8_t *text)
{
uint8_t i= 0;
uint32_t fontaddr=0;
uint8_t addrHigh,addrMid,addrLow ;
uint8_t 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?*/
ReadDataBytes(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?*/
ReadDataBytes(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;
ReadDataBytes(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 OLED_Fill(uint8_t dat)
{
uint8_t i,j;
LCDCS_0;
ROMCS_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(dat);
}
}
LCDCS_1;
}
/*
x Ö¸¶¨μãËùÔúáDμÄλÖÃ
y Ö¸¶¨μãËùÔúDDμÄλÖÃ
color ÏÔê¾ÑÕé«(¶Ôóúoú°×é«LCM£¬Îa0ê±Ãe£¬Îa1ê±ÏÔê¾)
return 0 error£¬1 success
*/
#ifndef GUI_LCM_XMAX
#define GUI_LCM_XMAX 128
#endif
#ifndef GUI_LCM_YMAX
#define GUI_LCM_YMAX 64
#endif
uint8_t OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t color)//μúËÄ′|£
{
uint8_t bak;
LCDCS_0;
ROMCS_1;
//x=x-0x01;
//transfer_command_lcd(0xb0+y-1); /*?????*/
//transfer_command_lcd(0x10+(x>>4&0x0f)); /*???????4?*/
//transfer_command_lcd(x&0x0f); /*???????4?*/
//transfer_data_lcd(color);
// ????
if(x>=GUI_LCM_XMAX) return(0);
if(y>=GUI_LCM_YMAX) return(0);
LCDCS_1;
}
void OLED_Refresh_Gram()//μúáù′|£
{
}
在主函数调用的测试函数
uchar my5_7[]=
{
0x7F,0x0f,0x7f,0x55,0x7F
};
uchar my7_8[]=
{
0xFF,0xAA,0x0F,0xF0,0x7F,0xFE,0x7E
};
uchar my8_16[]=
{
0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0xFF,0x00,0xAA,0xFF
};
#if 0
display_graphic_5x7(1,1,my5_7);
display_string_5x7(2,1,"QQ1303428517");
display_string_5x7(3,2,"helABC~!@");
display_string_5x7(4,1,"`#$%^&*()_+");
display_string_5x7(5,3,"-=\|':;,.,.?");
display_string_5x7(6,1,"1234567890ABCDEF");
display_string_5x7(7,1,"ABCdef hij");
display_string_5x7(8,1,"TRWEQ");
#endif
#if 0
display_graphic_7x8(1,1,my5_7);
display_string_7x8(2,1,"QQ1303428517");
display_string_7x8(3,2,"helABC~!@");
display_string_7x8(4,1,"`#$%^&*()_+");
display_string_7x8(5,3,"-=\|':;,.,.?");
display_string_7x8(6,1,"1234567890ABCDEF");
display_string_7x8(7,1,"ABCdef hij");
display_string_7x8(8,1,"TRWEQ");
#endif
#if 0
display_string_5x7(1,1,"1234567890ABCDEF");
display_string_7x8(2,1,"1234567890ABCDEF");
display_GB2312_string(3,1,"1234567890ABCDEF");
display_GB2312_string(5,1,"1234567890ABCDEF");
display_GB2312_string(7,1,"128*64μãÕóòo¾§");
display_graphic_16x16(7,112,my16_16);
#endif
#if 1
// display_graphic_8x16(1,1,my8_16);
//display_string_8x16(1,1,0,"A2b?");
display_GB2312_string(3,1,"A2b?");
display_GB2312_string(5,1,"êà½çHM12*&");
display_GB2312_string(7,1,"34bT#@Ãà1ú");
// display_string_8x16(3,1,2,"1234567890ABCDEF");
// display_string_8x16(5,1,1,"cd?#%,.*()");
// display_string_8x16(7,1,2,"cd?#%,.*()");
#endif
第三部分:说明


file:///C:/Users/ADMINI~1.A-2/AppData/Local/Temp/enhtmlclip/%E6%8D%95%E8%8E%B757.JPG
最后三列补0x00即可,每一列8bit数据,最高位bit7为0


最后一列补0x00即可,每一列8bit数据。
本文来自论坛,点击查看完整帖子内容。