Test for STM32F4

Dependents:   Nucleo_SSD1331

Fork of RGB_OLED_SSD1331 by Juergen M

Committer:
messi1
Date:
Tue Nov 10 22:51:46 2015 +0000
Revision:
0:6e810b5b40a3
Child:
2:e033aab5daad
Init version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
messi1 0:6e810b5b40a3 1 /*
messi1 0:6e810b5b40a3 2 * SSD1331.cpp
messi1 0:6e810b5b40a3 3 * A library for RGB OLED module
messi1 0:6e810b5b40a3 4 *
messi1 0:6e810b5b40a3 5 * Copyright (c) 2014 seeed technology inc.
messi1 0:6e810b5b40a3 6 * Copyright (c) 2012, Adafruit Industries.
messi1 0:6e810b5b40a3 7 *
messi1 0:6e810b5b40a3 8 * All rights reserved.
messi1 0:6e810b5b40a3 9 *
messi1 0:6e810b5b40a3 10 * This library is based on Adafruit's SSD1331-OLED-Driver-Library. Thanks to
messi1 0:6e810b5b40a3 11 * their contribution to the code, we modify it and add more interface to
messi1 0:6e810b5b40a3 12 * support our Seeed's Xadow RGB OLED 96*64 module.
messi1 0:6e810b5b40a3 13 *
messi1 0:6e810b5b40a3 14 * Below is the introduction of Adafruit's Color OLED module, we add it to here
messi1 0:6e810b5b40a3 15 * to express our thanks to them.
messi1 0:6e810b5b40a3 16 *
messi1 0:6e810b5b40a3 17 * ****************************************************************************
messi1 0:6e810b5b40a3 18 * This is a library for the 0.96" 16-bit Color OLED with SSD1331 driver chip
messi1 0:6e810b5b40a3 19 *
messi1 0:6e810b5b40a3 20 * Pick one up today in the adafruit shop!
messi1 0:6e810b5b40a3 21 * ------> http://www.adafruit.com/products/684
messi1 0:6e810b5b40a3 22 *
messi1 0:6e810b5b40a3 23 * These displays use SPI to communicate.
messi1 0:6e810b5b40a3 24 *
messi1 0:6e810b5b40a3 25 * Adafruit invests time and resources providing this open source code,
messi1 0:6e810b5b40a3 26 * please support Adafruit and open-source hardware by purchasing
messi1 0:6e810b5b40a3 27 * products from Adafruit!
messi1 0:6e810b5b40a3 28 *
messi1 0:6e810b5b40a3 29 * Written by Limor Fried/Ladyada for Adafruit Industries.
messi1 0:6e810b5b40a3 30 * Modifed by lawliet for Seeed Studio's RGB OLED module.
messi1 0:6e810b5b40a3 31 * BSD license, all text above must be included in any redistribution
messi1 0:6e810b5b40a3 32 * ******************************************************************************
messi1 0:6e810b5b40a3 33 *
messi1 0:6e810b5b40a3 34 * Software License Agreement (BSD License)
messi1 0:6e810b5b40a3 35 *
messi1 0:6e810b5b40a3 36 * Redistribution and use in source and binary forms, with or without
messi1 0:6e810b5b40a3 37 * modification, are permitted provided that the following conditions are met:
messi1 0:6e810b5b40a3 38 * 1. Redistributions of source code must retain the above copyright
messi1 0:6e810b5b40a3 39 * notice, this list of conditions and the following disclaimer.
messi1 0:6e810b5b40a3 40 * 2. Redistributions in binary form must reproduce the above copyright
messi1 0:6e810b5b40a3 41 * notice, this list of conditions and the following disclaimer in the
messi1 0:6e810b5b40a3 42 * documentation and/or other materials provided with the distribution.
messi1 0:6e810b5b40a3 43 * 3. Neither the name of the copyright holders nor the
messi1 0:6e810b5b40a3 44 * names of its contributors may be used to endorse or promote products
messi1 0:6e810b5b40a3 45 * derived from this software without specific prior written permission.
messi1 0:6e810b5b40a3 46 *
messi1 0:6e810b5b40a3 47 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
messi1 0:6e810b5b40a3 48 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
messi1 0:6e810b5b40a3 49 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
messi1 0:6e810b5b40a3 50 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
messi1 0:6e810b5b40a3 51 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
messi1 0:6e810b5b40a3 52 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
messi1 0:6e810b5b40a3 53 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
messi1 0:6e810b5b40a3 54 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
messi1 0:6e810b5b40a3 55 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
messi1 0:6e810b5b40a3 56 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
messi1 0:6e810b5b40a3 57 *
messi1 0:6e810b5b40a3 58 */
messi1 0:6e810b5b40a3 59 #include "DigitalOut.h"
messi1 0:6e810b5b40a3 60 #include "SPI.h"
messi1 0:6e810b5b40a3 61 #include "SSD1331.h"
messi1 0:6e810b5b40a3 62
messi1 0:6e810b5b40a3 63 SSD1331::SSD1331(PinName cs, PinName dc, PinName mosi, PinName sck)
messi1 0:6e810b5b40a3 64 :SGL(RGB_OLED_WIDTH, RGB_OLED_HEIGHT)
messi1 0:6e810b5b40a3 65 {
messi1 0:6e810b5b40a3 66 _cs = new mbed::DigitalOut(cs);
messi1 0:6e810b5b40a3 67 _dc = new mbed::DigitalOut(dc);
messi1 0:6e810b5b40a3 68 _spiPort = new mbed::SPI(mosi, NC, sck);
messi1 0:6e810b5b40a3 69 _spiPort->format(8,3); //8bit frame and POL=1 /PHA=1(UpEdge Sampled)
messi1 0:6e810b5b40a3 70 _spiPort->frequency(25000000); // modify later
messi1 0:6e810b5b40a3 71 };
messi1 0:6e810b5b40a3 72
messi1 0:6e810b5b40a3 73 void SSD1331::_sendCmd(uint8_t c)
messi1 0:6e810b5b40a3 74 {
messi1 0:6e810b5b40a3 75 _dc->write(LOW);
messi1 0:6e810b5b40a3 76 _cs->write(LOW);
messi1 0:6e810b5b40a3 77 _spiPort->write(c);
messi1 0:6e810b5b40a3 78 _cs->write(HIGH);
messi1 0:6e810b5b40a3 79 }
messi1 0:6e810b5b40a3 80
messi1 0:6e810b5b40a3 81 void SSD1331::init(void)
messi1 0:6e810b5b40a3 82 {
messi1 0:6e810b5b40a3 83 // pinMode(_dc, OUTPUT);
messi1 0:6e810b5b40a3 84 // pinMode(_cs, OUTPUT);
messi1 0:6e810b5b40a3 85
messi1 0:6e810b5b40a3 86 // _spiPort->begin();
messi1 0:6e810b5b40a3 87
messi1 0:6e810b5b40a3 88 _sendCmd(CMD_DISPLAY_OFF); //Display Off
messi1 0:6e810b5b40a3 89 _sendCmd(CMD_SET_CONTRAST_A); //Set contrast for color A
messi1 0:6e810b5b40a3 90 _sendCmd(0x91); //145
messi1 0:6e810b5b40a3 91 _sendCmd(CMD_SET_CONTRAST_B); //Set contrast for color B
messi1 0:6e810b5b40a3 92 _sendCmd(0x50); //80
messi1 0:6e810b5b40a3 93 _sendCmd(CMD_SET_CONTRAST_C); //Set contrast for color C
messi1 0:6e810b5b40a3 94 _sendCmd(0x7D); //125
messi1 0:6e810b5b40a3 95 _sendCmd(CMD_MASTER_CURRENT_CONTROL);//master current control
messi1 0:6e810b5b40a3 96 _sendCmd(0x06); //6
messi1 0:6e810b5b40a3 97 _sendCmd(CMD_SET_PRECHARGE_SPEED_A);//Set Second Pre-change Speed For ColorA
messi1 0:6e810b5b40a3 98 _sendCmd(0x64); //100
messi1 0:6e810b5b40a3 99 _sendCmd(CMD_SET_PRECHARGE_SPEED_B);//Set Second Pre-change Speed For ColorB
messi1 0:6e810b5b40a3 100 _sendCmd(0x78); //120
messi1 0:6e810b5b40a3 101 _sendCmd(CMD_SET_PRECHARGE_SPEED_C);//Set Second Pre-change Speed For ColorC
messi1 0:6e810b5b40a3 102 _sendCmd(0x64); //100
messi1 0:6e810b5b40a3 103 _sendCmd(CMD_SET_REMAP); //set remap & data format
messi1 0:6e810b5b40a3 104 _sendCmd(0x72); //0x72
messi1 0:6e810b5b40a3 105 _sendCmd(CMD_SET_DISPLAY_START_LINE);//Set display Start Line
messi1 0:6e810b5b40a3 106 _sendCmd(0x0);
messi1 0:6e810b5b40a3 107 _sendCmd(CMD_SET_DISPLAY_OFFSET); //Set display offset
messi1 0:6e810b5b40a3 108 _sendCmd(0x0);
messi1 0:6e810b5b40a3 109 _sendCmd(CMD_NORMAL_DISPLAY); //Set display mode
messi1 0:6e810b5b40a3 110 _sendCmd(CMD_SET_MULTIPLEX_RATIO); //Set multiplex ratio
messi1 0:6e810b5b40a3 111 _sendCmd(0x3F);
messi1 0:6e810b5b40a3 112 _sendCmd(CMD_SET_MASTER_CONFIGURE); //Set master configuration
messi1 0:6e810b5b40a3 113 _sendCmd(0x8E);
messi1 0:6e810b5b40a3 114 _sendCmd(CMD_POWER_SAVE_MODE); //Set Power Save Mode
messi1 0:6e810b5b40a3 115 _sendCmd(0x00); //0x00
messi1 0:6e810b5b40a3 116 _sendCmd(CMD_PHASE_PERIOD_ADJUSTMENT);//phase 1 and 2 period adjustment
messi1 0:6e810b5b40a3 117 _sendCmd(0x31); //0x31
messi1 0:6e810b5b40a3 118 _sendCmd(CMD_DISPLAY_CLOCK_DIV); //display clock divider/oscillator frequency
messi1 0:6e810b5b40a3 119 _sendCmd(0xF0);
messi1 0:6e810b5b40a3 120 _sendCmd(CMD_SET_PRECHARGE_VOLTAGE);//Set Pre-Change Level
messi1 0:6e810b5b40a3 121 _sendCmd(0x3A);
messi1 0:6e810b5b40a3 122 _sendCmd(CMD_SET_V_VOLTAGE); //Set vcomH
messi1 0:6e810b5b40a3 123 _sendCmd(0x3E);
messi1 0:6e810b5b40a3 124 _sendCmd(CMD_DEACTIVE_SCROLLING); //disable scrolling
messi1 0:6e810b5b40a3 125 _sendCmd(CMD_NORMAL_BRIGHTNESS_DISPLAY_ON);//set display on
messi1 0:6e810b5b40a3 126 }
messi1 0:6e810b5b40a3 127
messi1 0:6e810b5b40a3 128 void SSD1331::drawPixel(uint16_t x, uint16_t y, uint16_t color)
messi1 0:6e810b5b40a3 129 {
messi1 0:6e810b5b40a3 130 if ((x >= RGB_OLED_WIDTH) || (y >= RGB_OLED_HEIGHT))
messi1 0:6e810b5b40a3 131 return;
messi1 0:6e810b5b40a3 132 //set column point
messi1 0:6e810b5b40a3 133 _sendCmd(CMD_SET_COLUMN_ADDRESS);
messi1 0:6e810b5b40a3 134 _sendCmd(x);
messi1 0:6e810b5b40a3 135 _sendCmd(RGB_OLED_WIDTH-1);
messi1 0:6e810b5b40a3 136 //set row point
messi1 0:6e810b5b40a3 137 _sendCmd(CMD_SET_ROW_ADDRESS);
messi1 0:6e810b5b40a3 138 _sendCmd(y);
messi1 0:6e810b5b40a3 139 _sendCmd(RGB_OLED_HEIGHT-1);
messi1 0:6e810b5b40a3 140 //fill 16bit colour
messi1 0:6e810b5b40a3 141 _dc->write(HIGH);
messi1 0:6e810b5b40a3 142 _cs->write(LOW);
messi1 0:6e810b5b40a3 143 _spiPort->write(color >> 8);
messi1 0:6e810b5b40a3 144 _spiPort->write(color);
messi1 0:6e810b5b40a3 145 _cs->write(HIGH);
messi1 0:6e810b5b40a3 146 }
messi1 0:6e810b5b40a3 147
messi1 0:6e810b5b40a3 148 void SSD1331::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color)
messi1 0:6e810b5b40a3 149 {
messi1 0:6e810b5b40a3 150 if (x0 >= RGB_OLED_WIDTH) x0 = RGB_OLED_WIDTH - 1;
messi1 0:6e810b5b40a3 151 if (y0 >= RGB_OLED_HEIGHT) y0 = RGB_OLED_HEIGHT - 1;
messi1 0:6e810b5b40a3 152 if (x1 >= RGB_OLED_WIDTH) x1 = RGB_OLED_WIDTH - 1;
messi1 0:6e810b5b40a3 153 if (y1 >= RGB_OLED_HEIGHT) y1 = RGB_OLED_HEIGHT - 1;
messi1 0:6e810b5b40a3 154
messi1 0:6e810b5b40a3 155 _sendCmd(CMD_DRAW_LINE);//draw line
messi1 0:6e810b5b40a3 156 _sendCmd(x0);//start column
messi1 0:6e810b5b40a3 157 _sendCmd(y0);//start row
messi1 0:6e810b5b40a3 158 _sendCmd(x1);//end column
messi1 0:6e810b5b40a3 159 _sendCmd(y1);//end row
messi1 0:6e810b5b40a3 160 _sendCmd((uint8_t)((color>>11)&0x1F));//R
messi1 0:6e810b5b40a3 161 _sendCmd((uint8_t)((color>>5)&0x3F));//G
messi1 0:6e810b5b40a3 162 _sendCmd((uint8_t)(color&0x1F));//B
messi1 0:6e810b5b40a3 163 }
messi1 0:6e810b5b40a3 164
messi1 0:6e810b5b40a3 165 void SSD1331::drawFrame(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t outColor, uint16_t fillColor)
messi1 0:6e810b5b40a3 166 {
messi1 0:6e810b5b40a3 167 if (x0 >= RGB_OLED_WIDTH) x0 = RGB_OLED_WIDTH - 1;
messi1 0:6e810b5b40a3 168 if (y0 >= RGB_OLED_HEIGHT) y0 = RGB_OLED_HEIGHT - 1;
messi1 0:6e810b5b40a3 169 if (x1 >= RGB_OLED_WIDTH) x1 = RGB_OLED_WIDTH - 1;
messi1 0:6e810b5b40a3 170 if (y1 >= RGB_OLED_HEIGHT) y1 = RGB_OLED_HEIGHT - 1;
messi1 0:6e810b5b40a3 171
messi1 0:6e810b5b40a3 172 _sendCmd(CMD_FILL_WINDOW);//fill window
messi1 0:6e810b5b40a3 173 _sendCmd(ENABLE_FILL);
messi1 0:6e810b5b40a3 174 _sendCmd(CMD_DRAW_RECTANGLE);//draw rectangle
messi1 0:6e810b5b40a3 175 _sendCmd(x0);//start column
messi1 0:6e810b5b40a3 176 _sendCmd(y0);//start row
messi1 0:6e810b5b40a3 177 _sendCmd(x1);//end column
messi1 0:6e810b5b40a3 178 _sendCmd(y1);//end row
messi1 0:6e810b5b40a3 179 _sendCmd((uint8_t)((outColor>>11)&0x1F));//R
messi1 0:6e810b5b40a3 180 _sendCmd((uint8_t)((outColor>>5)&0x3F));//G
messi1 0:6e810b5b40a3 181 _sendCmd((uint8_t)(outColor&0x1F));//B
messi1 0:6e810b5b40a3 182 _sendCmd((uint8_t)((fillColor>>11)&0x1F));//R
messi1 0:6e810b5b40a3 183 _sendCmd((uint8_t)((fillColor>>5)&0x3F));//G
messi1 0:6e810b5b40a3 184 _sendCmd((uint8_t)(fillColor&0x1F));//B
messi1 0:6e810b5b40a3 185 }
messi1 0:6e810b5b40a3 186
messi1 0:6e810b5b40a3 187 void SSD1331::copyWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1,uint16_t x2, uint16_t y2)
messi1 0:6e810b5b40a3 188 {
messi1 0:6e810b5b40a3 189 _sendCmd(CMD_COPY_WINDOW);//copy window
messi1 0:6e810b5b40a3 190 _sendCmd(x0);//start column
messi1 0:6e810b5b40a3 191 _sendCmd(y0);//start row
messi1 0:6e810b5b40a3 192 _sendCmd(x1);//end column
messi1 0:6e810b5b40a3 193 _sendCmd(y1);//end row
messi1 0:6e810b5b40a3 194 _sendCmd(x2);//new column
messi1 0:6e810b5b40a3 195 _sendCmd(y2);//new row
messi1 0:6e810b5b40a3 196 }
messi1 0:6e810b5b40a3 197
messi1 0:6e810b5b40a3 198 void SSD1331::dimWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)
messi1 0:6e810b5b40a3 199 {
messi1 0:6e810b5b40a3 200 _sendCmd(CMD_DIM_WINDOW);//copy area
messi1 0:6e810b5b40a3 201 _sendCmd(x0);//start column
messi1 0:6e810b5b40a3 202 _sendCmd(y0);//start row
messi1 0:6e810b5b40a3 203 _sendCmd(x1);//end column
messi1 0:6e810b5b40a3 204 _sendCmd(y1);//end row
messi1 0:6e810b5b40a3 205 }
messi1 0:6e810b5b40a3 206
messi1 0:6e810b5b40a3 207 void SSD1331::clearWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1)
messi1 0:6e810b5b40a3 208 {
messi1 0:6e810b5b40a3 209 _sendCmd(CMD_CLEAR_WINDOW);//clear window
messi1 0:6e810b5b40a3 210 _sendCmd(x0);//start column
messi1 0:6e810b5b40a3 211 _sendCmd(y0);//start row
messi1 0:6e810b5b40a3 212 _sendCmd(x1);//end column
messi1 0:6e810b5b40a3 213 _sendCmd(y1);//end row
messi1 0:6e810b5b40a3 214 }
messi1 0:6e810b5b40a3 215
messi1 0:6e810b5b40a3 216 void SSD1331::setScolling(ScollingDirection direction, uint8_t rowAddr, uint8_t rowNum, uint8_t timeInterval)
messi1 0:6e810b5b40a3 217 {
messi1 0:6e810b5b40a3 218 uint8_t scolling_horizontal = 0x0;
messi1 0:6e810b5b40a3 219 uint8_t scolling_vertical = 0x0;
messi1 0:6e810b5b40a3 220 switch(direction){
messi1 0:6e810b5b40a3 221 case Horizontal:
messi1 0:6e810b5b40a3 222 scolling_horizontal = 0x01;
messi1 0:6e810b5b40a3 223 scolling_vertical = 0x00;
messi1 0:6e810b5b40a3 224 break;
messi1 0:6e810b5b40a3 225 case Vertical:
messi1 0:6e810b5b40a3 226 scolling_horizontal = 0x00;
messi1 0:6e810b5b40a3 227 scolling_vertical = 0x01;
messi1 0:6e810b5b40a3 228 break;
messi1 0:6e810b5b40a3 229 case Diagonal:
messi1 0:6e810b5b40a3 230 scolling_horizontal = 0x01;
messi1 0:6e810b5b40a3 231 scolling_vertical = 0x01;
messi1 0:6e810b5b40a3 232 break;
messi1 0:6e810b5b40a3 233 default:
messi1 0:6e810b5b40a3 234 break;
messi1 0:6e810b5b40a3 235 }
messi1 0:6e810b5b40a3 236 _sendCmd(CMD_CONTINUOUS_SCROLLING_SETUP);
messi1 0:6e810b5b40a3 237 _sendCmd(scolling_horizontal);
messi1 0:6e810b5b40a3 238 _sendCmd(rowAddr);
messi1 0:6e810b5b40a3 239 _sendCmd(rowNum);
messi1 0:6e810b5b40a3 240 _sendCmd(scolling_vertical);
messi1 0:6e810b5b40a3 241 _sendCmd(timeInterval);
messi1 0:6e810b5b40a3 242 _sendCmd(CMD_ACTIVE_SCROLLING);
messi1 0:6e810b5b40a3 243 }
messi1 0:6e810b5b40a3 244
messi1 0:6e810b5b40a3 245 void SSD1331::enableScolling(bool enable)
messi1 0:6e810b5b40a3 246 {
messi1 0:6e810b5b40a3 247 if(enable)
messi1 0:6e810b5b40a3 248 _sendCmd(CMD_ACTIVE_SCROLLING);
messi1 0:6e810b5b40a3 249 else
messi1 0:6e810b5b40a3 250 _sendCmd(CMD_DEACTIVE_SCROLLING);
messi1 0:6e810b5b40a3 251 }
messi1 0:6e810b5b40a3 252
messi1 0:6e810b5b40a3 253 void SSD1331::setDisplayMode(DisplayMode mode)
messi1 0:6e810b5b40a3 254 {
messi1 0:6e810b5b40a3 255 _sendCmd(mode);
messi1 0:6e810b5b40a3 256 }
messi1 0:6e810b5b40a3 257
messi1 0:6e810b5b40a3 258 void SSD1331::setDisplayPower(DisplayPower power)
messi1 0:6e810b5b40a3 259 {
messi1 0:6e810b5b40a3 260 _sendCmd(power);
messi1 0:6e810b5b40a3 261 }