OLED的中英文和图片显示
51单片机使用oled时要用到取模软件,本文用PCtoLCD2002进行中英文和图片的取字模
OLED点阵与常规的LCD点阵的显示方式相同,从第一列开始向下取8个点作为一个字节,然后从第二列开始向下取.8个点作为第二个字节…依此类推。取模顺序是从低高,即第-一个点作为最低位。如图显示一行数据的图解。
要显示一个字符和汉字,都是由字符集的点整数据构成的,这些点阵数据被称为“字模”。计算字模的软件一一PCtoLCD2002。该软件可用来计算各种ASCII 字符、汉字(字体和大小都可以自己设置)、图片的字模。
0.96寸OLED分辨率是128*64,即OLED显示是128行64列;
本文用的是iic通信方式:
它是由数据线 SDA 和时钟 SCL 构成的串行总线, 可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送
水平方向分布了128个像素点,垂直方向分布了64个像素点,而驱动芯片在点亮像素点的时候,是以8个像素点为单位的。推荐的是垂直扫描的方式,也就是先画垂直方向的8个像素点,所以我们在画点的时候Y的取值为0-7,X的取值为0-127.
所以在设置取模方式是选择列行式,垂直扫描,页设置为0-7
OLED的显存
存放格式如下.
Y
X [0]0 1 2 3 ... 127
[1]0 1 2 3 ... 127
[2]0 1 2 3 ... 127
[3]0 1 2 3 ... 127
[4]0 1 2 3 ... 127
[5]0 1 2 3 ... 127
[6]0 1 2 3 ... 127
[7]0 1 2 3 ... 127
显示屏有8192个像素,每个发光点都有正负两个电极,全部引出8192*2个驱动电极是不现实的,实际做法是把每列的正极都接在一起引出一个电极,定义为一个段,把每行的负级接在一起引出一个电极,定义为一个公共极,这样12864的点阵,只需要引出128个段引脚、64个公共极引脚、一共有192个引脚即可。
点阵屏像素按128列X64行排列,每一行128个像素单元的阴极是连接在一起,作为公共极,每一列64个像素单元的阳极也连接在一起,作为一段。行列交叉点上的LED就是一个显示单元,即一个像素。要点亮一个像素,只要在该像素所在列电极上加上正电压、行电极接地。同样,要驱动一整行图像,就需要同时把128列信号加载到列电极上,把该行行电极接地。该行显示时,其他63行均不能显示,其行电极应为高电平或悬空。
oled屏显示程序:
unsigned char code picture_tab[]=
{
{0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0xC0,0x30,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x01,0x20,0x70,0x28,0x24,0x22,0x21,0x20,0x20,0x24,0x28,0x30,0x60,0x00,0x00},/*"么",0*/
/* (16 X 16 , 宋体 )*/
{0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0xC0,0x30,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x01,0x20,0x70,0x28,0x24,0x22,0x21,0x20,0x20,0x24,0x28,0x30,0x60,0x00,0x00},/*"么",1*/
/* (16 X 16 , 宋体 )*/
{0x00,0xFC,0x04,0x04,0xFC,0x00,0x42,0xCC,0x10,0x10,0x90,0x7F,0x90,0x10,0x10,0x00},
{0x00,0x0F,0x04,0x04,0x0F,0x40,0x20,0x1F,0x28,0x46,0x41,0x40,0x40,0x43,0x4C,0x00},/*"哒",2*/
/* (16 X 16 , 宋体 )*/
};
void mingling(unsigned char command)
//写命令
{
unsigned char counter;
for(counter=0;counter<8;counter++)
//发送数据
{
SCL=0;//将SCL总线拉低,为SDA电平变化做准备
SDA=(command&0x80)>>7;
command=command<<1;
SCL=1;//将SCL拉高,现在可以检测SDA的电平了
_nop_();
SCL=0;//8位数据传输完成后,将SCL拉低
}
}
void shuju(unsigned char command)
//写数据
{
unsigned char counter;
for(counter=0;counter<8;counter++)
//发送数据
{
SCL=0;//将SCL总线拉低,为SDA电平变化做准备
SDA=(command&0x80)>>7;
command=command<<1;
_nop_();
SCL=1;//将SCL拉高,现在可以检测SDA的电平了
_nop_();
SCL=0;8位数据传输完成后,将SCL拉低
}
}
void lie_set(unsigned char lie)
//设置列
{
mingling(0x10|(lie>>4));
mingling(0x00|(lie&0x0f));
}
void hang_set(unsigned char hang)
//设置行
{
mingling(0xb0+hang);
}
void Screen_clear()
//oled复位
{
unsigned char hang,lie;
for(hang=0;hang<8;hang++)
//行循环
{
hang_set(hang);
lie_set(0);
for(lie=0;lie<128;lie++)
//列循环
{
shuju(0x00);
}
}
}
void Screen_check()
{
unsigned char hang,lie;
for(hang=0;hang<8;hang++)
//行循环
{
hang_set(hang);
lie_set(0);
for(lie=0;lie<128;lie++)
//列循环
{
shuju(0xff);
}
}
}
void Picture_display(unsigned char *ptr_pic)
{
unsigned char hang,lie;
for(hang=0;hang<(64/8);hang++)
//行循环
{
hang_set(hang);
lie_set(0);
for(lie=0;lie<128;lei++)
//列循环
{
shuju(*ptr_pic++);
}
}
Delay(15);
}
如果我们需要改变屏幕的显示内容,我们可以将picture_tab[ ] 数组中的数据进行修改
取模方式:
修改picture_tab[ ] 数组数据我们需要取模软件来获取显示内容的数据,中英文与图片的取模方式略有不同 。
1、中文取模方式:
(1)打开字模软件,模式选择字符模式,
(2)点击选项,设置成如图格式
(3)在空白框输入要填写的汉字,带点击生成字模
可以调整字宽与字高使屏幕显示使更清晰。
在使用取模软件时,注意图片的高度和宽度都要是16的倍数。
(4)将字模复制到程序函数中调用,在oled屏上即可实现汉字显示。
2、英文取模方式:
第(1)步与第(2)步同汉字取模,
(3)在空白框输入要填写的英文,带点击生成字模,适当调换字体使屏幕显示清晰
(4)将字模复制到程序函数中调用,在oled屏上即可实现英文显示。
3、图片取模方式:
(1)打开模式,选择图形模式,建立合适宽度与高度的图片
(2)点击选项,修改设置
(3)绘制图片,生成字模
(4)将字模复制到程序函数中调用,在oled屏上即可实现图片的显示。
对图片取模还有一种方法:
(1)打开电脑绘图软件,点击新建,点击文件,属性设置如图格式
(2)绘制所需要的图片
(3)将图片存为bmp格式
(4)打开PCtoLCD2002 ,添加刚刚绘制的图片 设置成如图格式,点击生成字模。则可以出现图片字模。
(5)将字模复制到程序函数中,即可调用。
当改变字宽与字高时字的形态也会发生变化,字模也会发生变化,用英文取模方式来演示:
当改变字字高由16变为32时,发现字的高度时原来的2倍,且字模发生了变化。
当字宽与字高分别增加2倍时,字母的面积变为原来的4倍,同时字模也发生变化,
注意:此模块为128*64像素,所以宽度不能超过128,高度不能超过64,否则屏幕无法全部显示字母。