这篇文章得用到IIC驱动,大家如果不会IIC通信,可以看这篇文章,也是我写的,是有关IIC通信的,有什么不理解的可以在看一下:https://blog.csdn.net/m0_58832575/article/details/124003619?spm=1001.2014.3001.5501
OLED简介
我买的是四针脚的利用IIC通OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显 示(Organic Electroluminesence Display, OELD)。因为具备轻薄、省电等特性,因此从 2003 年开始,这种显示设备在 MP3 播放器上得到了广泛应用,而对于同属数码类产品的 DC 与手机,此前只是在一些展会上展示过采用 OLED 屏幕的工程样品。自 2007 年后,寿命得 到很大提高,具备了许多 LCD 不可比拟的优势信的一款OLED显示屏,是显示蓝色字体的,就是这个形状。
IIC 电路连接:
GND: 电源地
VCC: 2.2V~5.5V
SCL: CLK 时钟 (高电平 2.2V~5.5V)
SDA: 传送数据 (高电平 2.2V~5.5V)
注意事项: OLED 显示屏不同于 LCD,OLED 上电是没有反应的,需要程 序驱动才会有显示。
显示原理:
这里给大家说一下,OLED显示原理,上面参数有说过,此OLED像素是128*64的,而每个像素点是就像一个小灯一样,但是很小,然后集成在一起,我们想显示什么,就点亮依次的小灯,就可以了。我们如何知道显示哪个灯呢?这里就牵扯到一个取模软件,取模软件可以让自己显示的字符,变成二进制的代码,组成数组,然后利用显示的代码调用这个数组就可以依次点亮那些点阵小灯,显示出来自己想显示的东西,可以显示数字、各种各样的符号、汉字,图片(51单片机很难实现,因为内存太小)。下篇文章在分享和教你们怎么使用取模软件。
话不多说,上代码:
OLED显示出来需要七个文件iic.h、iic.c、oled.h、oled.c、main.h、main.c、oled_fong.h。
OLED显示数据函数:
//OLED显示数据函数
#include "oled.h"
#include "iic.h"
#include "oled_fong.h"
void delay(u16 z)
{
u16 i,j;
for(i=z;i>0;i--)
for(j=114;j>0;j--);
}
/* 发送指令函数 */
void write_cmd(cmd)
{
IIC_Start();
IIC_SendByte(0x78);
IIC_WaitAck();
IIC_SendByte(0x00);
IIC_WaitAck();
IIC_SendByte(cmd);
IIC_WaitAck();
IIC_Stop();
}
/* 发送数据函数 */
void write_dat(dat)
{
IIC_Start();
IIC_SendByte(0x78);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
//坐标设置
void Set_add(unsigned char x, unsigned char y) //x表示列(0~127),y表示页(0~7)
{
write_cmd(0xb0+y); //设置页地址(0~7)
write_cmd(((x&0xf0)>>4)|0x10); //设置显示位置—列高地址
write_cmd((x&0x0f)); //设置显示位置—列低地址
}
/*********************OLED初始化************************************/
void OLED_Init(void)
{
delay(500);//初始化之前的延时很重要!
write_cmd(0xae);//--turn off oled panel
write_cmd(0x00);//---set low column address
write_cmd(0x10);//---set high column address
write_cmd(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
write_cmd(0x81);//--set contrast control register
write_cmd(0xcf); // Set SEG Output Current Brightness
write_cmd(0xa1);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
write_cmd(0xc8);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
write_cmd(0xa6);//--set normal display
write_cmd(0xa8);//--set multiplex ratio(1 to 64)
write_cmd(0x3f);//--1/64 duty
write_cmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
write_cmd(0x00);//-not offset
write_cmd(0xd5);//--set display clock divide ratio/oscillator frequency
write_cmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
write_cmd(0xd9);//--set pre-charge period
write_cmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
write_cmd(0xda);//--set com pins hardware configuration
write_cmd(0x12);
write_cmd(0xdb);//--set vcomh
write_cmd(0x40);//Set VCOM Deselect Level
write_cmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
write_cmd(0x02);//
write_cmd(0x8d);//--set Charge Pump enable/disable
write_cmd(0x14);//--set(0x10) disable
write_cmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
write_cmd(0xa6);// Disable Inverse Display On (0xa6/a7)
write_cmd(0xaf);//--turn on oled panel
write_cmd(0x00); //初始清屏
Set_add(0,0);
}
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
//先选中页,初始位置,