1.3寸OLED 12864 sh1106带中文字库SPI接口的液晶屏,这是一款来自中景园的屏幕。
链接:https://pan.baidu.com/s/1setO3KIlfqRFJ-utFWSKHQ
提取码:8888
整体的屏幕参数:
原理图
外部引脚接口定义
资料所包含有的规格书
工作电流:5-15mA
睡眠电流:1-5uA
这里以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++;
}
}
查询字符的过程:
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;
取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引脚)拉高
}
//显示汉字到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++;
}
}
对于使用者来说,只需关系如何调佣即可,无需关系是如何实现,这块液晶屏也是借助的第三方的字库芯片来实现的。
有爱情,便全心对待,没有爱情,也一个人惬意。学会一个人生活,不论身边是否有人疼爱。做好自己该做的,有爱或无爱,都安然对待。缘份到了,便去伸手抓住,缘份未到,就让自己活得精彩。爱情,本就是件宁缺勿滥的事,急不得。 |
---|