1.3寸OLED 12864 sh1106带中文字库液晶屏介绍

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.3寸OLED 12864 sh1106带中文字库液晶屏介绍相关的知识,希望对你有一定的参考价值。

1.3寸OLED 12864 sh1106带中文字库液晶屏库简介


1.3寸OLED 12864 sh1106带中文字库SPI接口的液晶屏,这是一款来自中景园的屏幕。

屏幕技术资料介绍

链接:https://pan.baidu.com/s/1setO3KIlfqRFJ-utFWSKHQ   
提取码:8888 
  • 包含51单片机和STM32案例,满足不同单片机的应用开发需求。提供的案例相对来讲很齐全的。

相关参数介绍

  • 整体的屏幕参数:

  • 原理图

  • 外部引脚接口定义

  • 资料所包含有的规格书

GT20L16S1Y 标准点阵汉字字库芯片介绍

  GT20L16S1Y是一款内含16x16点阵的汉字库芯片,支持GB2312国标简体汉字(含有国家信标委合法授权)、ASCIl字符。排列格式为竖置横排。用户通过字符内码,利用我司所提供库文件内的函数接口可直接读取该内码的点阵信息。

  GT20L16S1Y除含有上述字库以外,芯片提供64KB可擦写空间,包含16个扇区,每个扇区4K字节或16页,每页256字节,可自由写入空间地址范围为:0x6FFFF-0x7FFFF。仅支持上位机烧录,可重复擦写10万次以上。

芯片参数:

  • 数据总线:SPI串行总线接口
  • 点阵排列方式:竖置横排
  • 时钟频率:45MHz@3.3V
  • 工作电压:2.7V~3.6V
  • 电流:

工作电流:5-15mA
睡眠电流:1-5uA

  • 工作温度:-40℃~85℃
  • 封装:SOT23-6
  • 字符集:GB2312
  • 字号:16×16点阵

汉字显示的调用过程

这里以STC单片机为例:

  • 显示相关函数
void OLED_Display_GB2312_string(u8 x,u8 y,u8 *text);
void OLED_Display_string_5x7(u8 x,u8 y,u8 *text);
void OLED_ShowNum(u8 x,u8 y,float num,u8 len);
void OLED_Display_128x64(u8 *dp);
void OLED_Display_16x16(u8 x,u8 y,u8 *dp);
void OLED_Display_8x16(u8 x,u8 y,u8 *dp);
void OLED_Display_5x7(u8 x,u8 y,u8 *dp);
//举例:
OLED_Display_GB2312_string(0,0,"12864,带中文字库");
OLED_Display_16x16(97,6,jiong1);/*在第7页,第81列显示单个自编生僻汉字“囧”*/
OLED_Display_string_5x7(0,2,"<!@#$%^&*()_-+]/;.,?[");/*在第3页,第1列,显示一串5x7点阵的ASCII字*/

中文显示的过程,可以从OLED_Display_GB2312_string(u8 x,u8 y,u8 *text)了解整个调用和实现的过程。

void OLED_Display_GB2312_string(u8 x,u8 y,u8 *text)

	u8 i=0;
	u8 addrHigh,addrMid,addrLow;
	u8 fontbuf[32];
	while(text[i]>0x00)
	
		if((text[i]>=0xb0)&&(text[i]<=0xf7)&&(text[i+1]>=0xa1))
		
			//国标简体(GB2312)汉字在晶联讯字库IC中的地址由以下公式来计算:
			//Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0
			//由于担心8位单片机有乘法溢出问题,所以分三部取地址
			fontaddr=(text[i]-0xb0)*94;
			fontaddr+=(text[i+1]-0xa1)+846;
			fontaddr=fontaddr*32;
			
			addrHigh=(fontaddr&0xff0000)>>16;   //地址的高8位,共24位
			addrMid=(fontaddr&0xff00)>>8;       //地址的中8位,共24位
			addrLow=(fontaddr&0xff);            //地址的低8位,共24位
			
			OLED_get_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32);
			//取32个字节的数据,存到"fontbuf[32]"
			OLED_Display_16x16(x,y,fontbuf);
			//显示汉字到LCD上,y为页地址,x为列地址,fontbuf[]为数据
			x+=16;
			i+=2;
    
		else if((text[i]>=0xa1)&&(text[i]<=0xa3)&&(text[i+1]>=0xa1))
		
			
			fontaddr=(text[i]-0xa1)*94;
			fontaddr+=(text[i+1]-0xa1);
			fontaddr=fontaddr*32;
			
			addrHigh=(fontaddr&0xff0000)>>16;
			addrMid=(fontaddr&0xff00)>>8;
			addrLow=(fontaddr&0xff);
			
			OLED_get_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32);
			OLED_Display_16x16(x,y,fontbuf);
			x+=16;
			i+=2;
    
		else if((text[i]>=0x20)&&(text[i]<=0x7e))
		
			unsigned char fontbuf[16];
			fontaddr=(text[i]-0x20);
			fontaddr=(unsigned long)(fontaddr*16);
			fontaddr=(unsigned long)(fontaddr+0x3cf80);
			
			addrHigh=(fontaddr&0xff0000)>>16;
			addrMid=(fontaddr&0xff00)>>8;
			addrLow=fontaddr&0xff;
			
			OLED_get_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,16);
			OLED_Display_8x16(x,y,fontbuf);
			x+=8;
			i+=1;
    
		else 
			i++;
  

  • 首先对将要显示的字符串从字库芯片里面字符地址逐一查询:

查询字符的过程:

  1. 字符的地址获取:Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0

8位单片机地址做了拆分获取,再拼接:

	fontaddr=(text[i]-0xb0)*94;
	fontaddr+=(text[i+1]-0xa1)+846;
	fontaddr=fontaddr*32;
  1. 通过字符地址,去获取字符数据。
取32个字节的数据,存到"fontbuf[32]"
OLED_get_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32);
//从相关地址(addrHigh:地址高字节,addrMid:地址中字节,addrLow:地址低字节)中连续读出DataLen个字节的数据到 pbuff的地址
//连续读取
void OLED_get_data_from_ROM(u8 addrHigh,u8 addrMid,u8 addrLow,u8 *pbuff,u8 DataLen)

	u8 i;
	OLED_ROM_CS_Clr();//这里将字库芯片SPI片选(CS引脚)拉低,访问有效
	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();
  
	OLED_ROM_CS_Set();//这里获取完字符数据后,将字库片选引脚(CS引脚)拉高

  1. 从字库芯片取到数据后,显示到OLED屏幕上。
//显示汉字到LCD上,y为页地址,x为列地址,fontbuf[]为数据
OLED_Display_16x16(x,y,fontbuf);

//显示16x16点阵图像、汉字、生僻字或16x16点阵的其他图标
void OLED_Display_16x16(u8 x,u8 y,u8 *dp)

	u8 i,j;
	for(j=0;j<2;j++)
	
		OLED_address(x,y);
		for(i=0;i<16;i++)
		
			OLED_WR_Byte(*dp,OLED_DATA);  //写数据到OLED,每写完一个8位的数据后列地址自动加1
			dp++;
    
		y++;
  

对于使用者来说,只需关系如何调佣即可,无需关系是如何实现,这块液晶屏也是借助的第三方的字库芯片来实现的。

以上是关于1.3寸OLED 12864 sh1106带中文字库液晶屏介绍的主要内容,如果未能解决你的问题,请参考以下文章

SWM181 驱动SH1106 1.3寸 OLED屏幕显示

Arduino for esp8266 1.3寸OLED 显示多边形缩放动画

Arduino ESP8266+OLED可视化音乐频谱:11段分频1.3寸OLED显示频谱线

STM32F103VET6基于STM32CubeMX 配置硬件I2C驱动SH1106 OLED屏幕

ESP8266/ESP32 +1.3“ or 0.96“ IIC OLED指针式时钟

STM8驱动0.96寸OLED(12864液晶屏)