驱动1.5寸彩色OLED 128*128(RGB) 代码原创
本帖最后由 butOn 于 2015-4-16 23:29 编辑成功驱动128*64的双色OLED之后,我把目光放在了这款彩色OLED上。
有了上次驱动SSD1306的经验,驱动这款屏幕上的的SSD1351丝毫没有压力,
看了看通信波形,发现它和SSD1306完全一样,于是我还是使用了软件SPI。
注意!和SSD1306不同的是,SSD1351命令的参数是以数据的形式发送的。
然后就是初始化,按照数据手册的时序做好,按自己的喜好改了一个配置就完成了。
/*
*
* SSD1351.ino
*
* Created by Jack, April 12, 2015.
*
*
* OLED INFORMATION:
* ------------->1.5' 128*128 (RGB)
* ------------->Driver IC: SSD1351
*
* INTERFACE : 4-wire SPI.
*
* E-mail : [email protected]
*
* Copyright <c> Jack
*
*/
#define SCLK 2//D0
#define SDIN 3 //D1
#define DC 4
#define RST 5
#define CS 6
void OLED_init ();
void w_cmd (uint8_t c);
void w_data (uint8_t d);
void fill_ram (uint8_t h, uint8_t l);
//=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=
void setup () {OLED_init ();}
void loop () {
fill_ram (0x00,0x1F);while (1) {}
}
//=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=
// OLED_init
//=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=
void OLED_init (){
pinMode (SDIN, OUTPUT);
pinMode (SCLK, OUTPUT);
pinMode (DC, OUTPUT);
pinMode (RST, OUTPUT);
pinMode (CS, OUTPUT);
digitalWrite (RST, HIGH);
delay (1);
digitalWrite (RST, LOW);
delay(10);
digitalWrite (RST, HIGH);
//Command Lock
w_cmd (0xFD);
w_data (0x12);
//Command Lock
w_cmd (0xFD);
w_data (0xB1);
//Set Sleep Mode On
w_cmd (0xAE);
//Set Display Clock Divide Ratio/Oscillator Frequency
w_cmd (0xB3);
w_data (0xF1);
//Set Multiplex Ratio
w_cmd (0xCA);
w_data (0x7F);
//Set Display Offset
w_cmd (0xA2);
w_data (0x00);
//Set Display Start Line
w_cmd (0xA1);
w_data (0x00);
//Set Re-Map & Color Depth
w_cmd (0xA0);
w_data (0x74);
//Set GPIO
w_cmd (0xB5);
w_data (0x00);
//Function Selection
w_cmd (0xAB);
w_data (0x01);
//Set Segment Low Voltage
w_cmd (0xB4);
w_data (0xA0);
w_data (0xB5);
w_data (0x55);
//Set Contrast Current
w_cmd (0xC1);
w_data (0xC8);
w_data (0x80);
w_data (0xC8);
//Set Master Current Control
w_cmd (0xC7);
w_data (0x0F);
//Gamma Look up Table
w_cmd (0xB8);
w_data (0x02);
w_data (0x03);
w_data (0x04);
w_data (0x05);
w_data (0x06);
w_data (0x07);
w_data (0x08);
w_data (0x09);
w_data (0x0A);
w_data (0x0B);
w_data (0x0C);
w_data (0x0D);
w_data (0x0E);
w_data (0x0F);
w_data (0x10);
w_data (0x11);
w_data (0x12);
w_data (0x13);
w_data (0x15);
w_data (0x17);
w_data (0x19);
w_data (0x1B);
w_data (0x1D);
w_data (0x1F);
w_data (0x21);
w_data (0x23);
w_data (0x25);
w_data (0x27);
w_data (0x2A);
w_data (0x2D);
w_data (0x30);
w_data (0x33);
w_data (0x36);
w_data (0x39);
w_data (0x3C);
w_data (0x3F);
w_data (0x42);
w_data (0x45);
w_data (0x48);
w_data (0x4C);
w_data (0x50);
w_data (0x54);
w_data (0x58);
w_data (0x5C);
w_data (0x60);
w_data (0x64);
w_data (0x68);
w_data (0x6C);
w_data (0x70);
w_data (0x74);
w_data (0x78);
w_data (0x7D);
w_data (0x82);
w_data (0x87);
w_data (0x8C);
w_data (0x91);
w_data (0x96);
w_data (0x9B);
w_data (0xA0);
w_data (0xA5);
w_data (0xAA);
w_data (0xAF);
w_data (0xB4);
w_data (0x00);
//Set Phase Length
w_cmd (0xB1);
w_data (0x32);
//Enhance Driving Scheme Capability
w_cmd (0xB2);
w_data (0xA4);
w_data (0x00);
w_data (0x00);
//Set Pre-Charge Voltage
w_cmd (0xBB);
w_data (0x17);
//Set Second Pre-Charge Period
w_cmd (0xB6);
w_data (0x01);
//Set VCOMH Voltage
w_cmd (0xBE);
w_data (0x05);
//Set Display Mode
w_cmd (0xA6);
//Clear Screen
fill_ram (0x00, 0x00);
//Set Sleep Mode Off
w_cmd (0xAF);
}
//=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=
//
// Write Data & Command
//
//=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=
void w_cmd (uint8_t c) {
digitalWrite (CS,LOW);
digitalWrite (DC,LOW);
shiftOut (SDIN, SCLK, MSBFIRST, c);
digitalWrite (CS,HIGH);
}
void w_data (uint8_t d) {
digitalWrite (CS,LOW);
digitalWrite (DC,HIGH);
shiftOut (SDIN, SCLK, MSBFIRST, d);
digitalWrite (CS,HIGH);
}
//=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=
//
// Fill Screen
//
// h ---------> High Byte Of Data
// l ---------> Low Byte Of Data
//
// Data mode:
// RRRRRGGG
// GGGBBBBB
//
// Mode Select With Command "0xA0"
//
//=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=
void fill_ram (uint8_t h, uint8_t l) {
int i, c;
w_cmd (0x15);
w_data (0x00);
w_data (0x7F);
w_cmd (0x75);
w_data (0x00);
w_data (0x7F);
w_cmd (0x5C);
for (i = 0; i < 128; i++) {
for (c = 0; c < 128; c++) {
w_data (h);
w_data (l);
}
}
}
视频:http://v.youku.com/v_show/id_XOTM0NzUyNTU2.html?x 好贴要顶。:) 很好,简洁明了,值得学习。 fill_ram (0x00,0x1F);while (1)全部打开,全部都是操作的寄存器,膜拜一下 这个不是oled吧?应该是lcd。可以读点数据吗?之前我用的一个1.44寸的tft彩屏,spi接口,结果发现不能读数据,郁闷。 ofourme 发表于 2015-4-16 20:28 static/image/common/back.gif
这个不是oled吧?应该是lcd。可以读点数据吗?之前我用的一个1.44寸的tft彩屏,spi接口,结果发现不能读数据 ...
这个就是OLED,理论上可以读数据 不错 支持 请问楼主 能不能为 mind+ 写几个 oled 的模块呢 布列松 发表于 2015-4-17 18:06 static/image/common/back.gif
不错 支持 请问楼主 能不能为 mind+ 写几个 oled 的模块呢
可以,不太了解Mind+,刚才百度了下,感觉他的作者好有个性,我就没有他那种勇气,怕被边缘化 butOn 发表于 2015-4-17 23:13 static/image/common/back.gif
可以,不太了解Mind+,刚才百度了下,感觉他的作者好有个性,我就没有他那种勇气,怕被边缘化
mind+ 有自己的模块建立软件的,应该很容易上手的,来这里下载:www.mindplus.cc butOn 发表于 2015-4-17 23:13 static/image/common/back.gif
可以,不太了解Mind+,刚才百度了下,感觉他的作者好有个性,我就没有他那种勇气,怕被边缘化
MindplusV096dwin_绿色版 下载
http://pan.baidu.com/s/1jG5RjuQ butOn 发表于 2015-4-17 23:13 static/image/common/back.gif
可以,不太了解Mind+,刚才百度了下,感觉他的作者好有个性,我就没有他那种勇气,怕被边缘化
模块建立软件 BlockMaker 下载:
http://www.mindplus.cc/download/BlockMaker1.5.zip 布列松 发表于 2015-4-17 23:19 static/image/common/back.gif
mind+ 有自己的模块建立软件的,应该很容易上手的,来这里下载:www.mindplus.cc
我目前的开发平台是用手机的VNC客户端连接cubieboard烧写Arduino,没有电脑,不太方便
我正在着手新的屏幕,源码都会发在Github上,你可以用我的源码做模块
谢谢分享学习一下 不错不错 这才叫精实。网上买了块oled,给的驱动库资源占用太高,有空了好好研究下。
感觉最缺的就是时间,买了本AVR的书,零零落落看了几章,到现在也忘了一大半 呃。
页:
[1]
2