Test for STM32F4
Fork of RGB_OLED_SSD1331 by
Diff: src/SSD1331.cpp
- Revision:
- 0:6e810b5b40a3
- Child:
- 2:e033aab5daad
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/SSD1331.cpp Tue Nov 10 22:51:46 2015 +0000 @@ -0,0 +1,261 @@ +/* +* SSD1331.cpp +* A library for RGB OLED module +* +* Copyright (c) 2014 seeed technology inc. +* Copyright (c) 2012, Adafruit Industries. +* +* All rights reserved. +* +* This library is based on Adafruit's SSD1331-OLED-Driver-Library. Thanks to +* their contribution to the code, we modify it and add more interface to +* support our Seeed's Xadow RGB OLED 96*64 module. +* +* Below is the introduction of Adafruit's Color OLED module, we add it to here +* to express our thanks to them. +* +* **************************************************************************** +* This is a library for the 0.96" 16-bit Color OLED with SSD1331 driver chip +* +* Pick one up today in the adafruit shop! +* ------> http://www.adafruit.com/products/684 +* +* These displays use SPI to communicate. +* +* Adafruit invests time and resources providing this open source code, +* please support Adafruit and open-source hardware by purchasing +* products from Adafruit! +* +* Written by Limor Fried/Ladyada for Adafruit Industries. +* Modifed by lawliet for Seeed Studio's RGB OLED module. +* BSD license, all text above must be included in any redistribution +* ****************************************************************************** +* +* Software License Agreement (BSD License) +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. Neither the name of the copyright holders nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +#include "DigitalOut.h" +#include "SPI.h" +#include "SSD1331.h" + +SSD1331::SSD1331(PinName cs, PinName dc, PinName mosi, PinName sck) +:SGL(RGB_OLED_WIDTH, RGB_OLED_HEIGHT) +{ + _cs = new mbed::DigitalOut(cs); + _dc = new mbed::DigitalOut(dc); + _spiPort = new mbed::SPI(mosi, NC, sck); + _spiPort->format(8,3); //8bit frame and POL=1 /PHA=1(UpEdge Sampled) + _spiPort->frequency(25000000); // modify later +}; + +void SSD1331::_sendCmd(uint8_t c) +{ + _dc->write(LOW); + _cs->write(LOW); + _spiPort->write(c); + _cs->write(HIGH); +} + +void SSD1331::init(void) +{ +// pinMode(_dc, OUTPUT); +// pinMode(_cs, OUTPUT); + +// _spiPort->begin(); + + _sendCmd(CMD_DISPLAY_OFF); //Display Off + _sendCmd(CMD_SET_CONTRAST_A); //Set contrast for color A + _sendCmd(0x91); //145 + _sendCmd(CMD_SET_CONTRAST_B); //Set contrast for color B + _sendCmd(0x50); //80 + _sendCmd(CMD_SET_CONTRAST_C); //Set contrast for color C + _sendCmd(0x7D); //125 + _sendCmd(CMD_MASTER_CURRENT_CONTROL);//master current control + _sendCmd(0x06); //6 + _sendCmd(CMD_SET_PRECHARGE_SPEED_A);//Set Second Pre-change Speed For ColorA + _sendCmd(0x64); //100 + _sendCmd(CMD_SET_PRECHARGE_SPEED_B);//Set Second Pre-change Speed For ColorB + _sendCmd(0x78); //120 + _sendCmd(CMD_SET_PRECHARGE_SPEED_C);//Set Second Pre-change Speed For ColorC + _sendCmd(0x64); //100 + _sendCmd(CMD_SET_REMAP); //set remap & data format + _sendCmd(0x72); //0x72 + _sendCmd(CMD_SET_DISPLAY_START_LINE);//Set display Start Line + _sendCmd(0x0); + _sendCmd(CMD_SET_DISPLAY_OFFSET); //Set display offset + _sendCmd(0x0); + _sendCmd(CMD_NORMAL_DISPLAY); //Set display mode + _sendCmd(CMD_SET_MULTIPLEX_RATIO); //Set multiplex ratio + _sendCmd(0x3F); + _sendCmd(CMD_SET_MASTER_CONFIGURE); //Set master configuration + _sendCmd(0x8E); + _sendCmd(CMD_POWER_SAVE_MODE); //Set Power Save Mode + _sendCmd(0x00); //0x00 + _sendCmd(CMD_PHASE_PERIOD_ADJUSTMENT);//phase 1 and 2 period adjustment + _sendCmd(0x31); //0x31 + _sendCmd(CMD_DISPLAY_CLOCK_DIV); //display clock divider/oscillator frequency + _sendCmd(0xF0); + _sendCmd(CMD_SET_PRECHARGE_VOLTAGE);//Set Pre-Change Level + _sendCmd(0x3A); + _sendCmd(CMD_SET_V_VOLTAGE); //Set vcomH + _sendCmd(0x3E); + _sendCmd(CMD_DEACTIVE_SCROLLING); //disable scrolling + _sendCmd(CMD_NORMAL_BRIGHTNESS_DISPLAY_ON);//set display on +} + +void SSD1331::drawPixel(uint16_t x, uint16_t y, uint16_t color) +{ + if ((x >= RGB_OLED_WIDTH) || (y >= RGB_OLED_HEIGHT)) + return; + //set column point + _sendCmd(CMD_SET_COLUMN_ADDRESS); + _sendCmd(x); + _sendCmd(RGB_OLED_WIDTH-1); + //set row point + _sendCmd(CMD_SET_ROW_ADDRESS); + _sendCmd(y); + _sendCmd(RGB_OLED_HEIGHT-1); + //fill 16bit colour + _dc->write(HIGH); + _cs->write(LOW); + _spiPort->write(color >> 8); + _spiPort->write(color); + _cs->write(HIGH); +} + +void SSD1331::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) +{ + if (x0 >= RGB_OLED_WIDTH) x0 = RGB_OLED_WIDTH - 1; + if (y0 >= RGB_OLED_HEIGHT) y0 = RGB_OLED_HEIGHT - 1; + if (x1 >= RGB_OLED_WIDTH) x1 = RGB_OLED_WIDTH - 1; + if (y1 >= RGB_OLED_HEIGHT) y1 = RGB_OLED_HEIGHT - 1; + + _sendCmd(CMD_DRAW_LINE);//draw line + _sendCmd(x0);//start column + _sendCmd(y0);//start row + _sendCmd(x1);//end column + _sendCmd(y1);//end row + _sendCmd((uint8_t)((color>>11)&0x1F));//R + _sendCmd((uint8_t)((color>>5)&0x3F));//G + _sendCmd((uint8_t)(color&0x1F));//B +} + +void SSD1331::drawFrame(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t outColor, uint16_t fillColor) +{ + if (x0 >= RGB_OLED_WIDTH) x0 = RGB_OLED_WIDTH - 1; + if (y0 >= RGB_OLED_HEIGHT) y0 = RGB_OLED_HEIGHT - 1; + if (x1 >= RGB_OLED_WIDTH) x1 = RGB_OLED_WIDTH - 1; + if (y1 >= RGB_OLED_HEIGHT) y1 = RGB_OLED_HEIGHT - 1; + + _sendCmd(CMD_FILL_WINDOW);//fill window + _sendCmd(ENABLE_FILL); + _sendCmd(CMD_DRAW_RECTANGLE);//draw rectangle + _sendCmd(x0);//start column + _sendCmd(y0);//start row + _sendCmd(x1);//end column + _sendCmd(y1);//end row + _sendCmd((uint8_t)((outColor>>11)&0x1F));//R + _sendCmd((uint8_t)((outColor>>5)&0x3F));//G + _sendCmd((uint8_t)(outColor&0x1F));//B + _sendCmd((uint8_t)((fillColor>>11)&0x1F));//R + _sendCmd((uint8_t)((fillColor>>5)&0x3F));//G + _sendCmd((uint8_t)(fillColor&0x1F));//B +} + +void SSD1331::copyWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1,uint16_t x2, uint16_t y2) +{ + _sendCmd(CMD_COPY_WINDOW);//copy window + _sendCmd(x0);//start column + _sendCmd(y0);//start row + _sendCmd(x1);//end column + _sendCmd(y1);//end row + _sendCmd(x2);//new column + _sendCmd(y2);//new row +} + +void SSD1331::dimWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) +{ + _sendCmd(CMD_DIM_WINDOW);//copy area + _sendCmd(x0);//start column + _sendCmd(y0);//start row + _sendCmd(x1);//end column + _sendCmd(y1);//end row +} + +void SSD1331::clearWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) +{ + _sendCmd(CMD_CLEAR_WINDOW);//clear window + _sendCmd(x0);//start column + _sendCmd(y0);//start row + _sendCmd(x1);//end column + _sendCmd(y1);//end row +} + +void SSD1331::setScolling(ScollingDirection direction, uint8_t rowAddr, uint8_t rowNum, uint8_t timeInterval) +{ + uint8_t scolling_horizontal = 0x0; + uint8_t scolling_vertical = 0x0; + switch(direction){ + case Horizontal: + scolling_horizontal = 0x01; + scolling_vertical = 0x00; + break; + case Vertical: + scolling_horizontal = 0x00; + scolling_vertical = 0x01; + break; + case Diagonal: + scolling_horizontal = 0x01; + scolling_vertical = 0x01; + break; + default: + break; + } + _sendCmd(CMD_CONTINUOUS_SCROLLING_SETUP); + _sendCmd(scolling_horizontal); + _sendCmd(rowAddr); + _sendCmd(rowNum); + _sendCmd(scolling_vertical); + _sendCmd(timeInterval); + _sendCmd(CMD_ACTIVE_SCROLLING); +} + +void SSD1331::enableScolling(bool enable) +{ + if(enable) + _sendCmd(CMD_ACTIVE_SCROLLING); + else + _sendCmd(CMD_DEACTIVE_SCROLLING); +} + +void SSD1331::setDisplayMode(DisplayMode mode) +{ + _sendCmd(mode); +} + +void SSD1331::setDisplayPower(DisplayPower power) +{ + _sendCmd(power); +}