From 5c9eb1b24ed4cfa7eae59ffbc24bdbbce814ba35 Mon Sep 17 00:00:00 2001 From: lynxeyed-atsu Date: Tue, 25 Sep 2012 21:32:32 +0900 Subject: apply a patch made by audin to a src/core audin fixed some bugs about Print class and gpio function with interruption for us. thank you! --- src/Samples/SpiLcd.cpp | 457 +++++++++++++++++++++++++++++++ src/Samples/SpiLcd.h | 94 +++++++ src/Samples/TFTLCD.h | 220 +++++++++++++++ src/Samples/maryoled.cpp | 484 +++++++++++++++++++++++++++++++++ src/Samples/maryoled.h | 127 +++++++++ src/TFTLCD/TFTLCD.h | 220 --------------- src/core/Print.cpp | 252 ++++++++--------- src/core/gpio.cpp | 685 ++++++++++++++++++++++++----------------------- src/core/gpio_int.cpp | 306 ++++++++++----------- src/core/maryoled.cpp | 484 --------------------------------- src/core/maryoled.h | 127 --------- 11 files changed, 2019 insertions(+), 1437 deletions(-) create mode 100755 src/Samples/SpiLcd.cpp create mode 100755 src/Samples/SpiLcd.h create mode 100755 src/Samples/TFTLCD.h create mode 100755 src/Samples/maryoled.cpp create mode 100755 src/Samples/maryoled.h delete mode 100755 src/TFTLCD/TFTLCD.h delete mode 100755 src/core/maryoled.cpp delete mode 100755 src/core/maryoled.h diff --git a/src/Samples/SpiLcd.cpp b/src/Samples/SpiLcd.cpp new file mode 100755 index 0000000..10d870c --- /dev/null +++ b/src/Samples/SpiLcd.cpp @@ -0,0 +1,457 @@ +/* mbed Nokia LCD Library + * Atsu + */ + +#include "delay.h" +#include "SpiLcd.h" +#include + + +#define LCD_ROWS 15 +#define LCD_COLS 16 +#define LCD_WIDTH 128 +#define LCD_HEIGHT 160 +#define LCD_FREQUENCY 20000000 + +//MARY Pin Assign +//#define LCD_VCC_ON C21 +//#define LCD_CS C33 +//#define LCD_RES C31 + +//LPCXpresso pin Assign (MARMEX-SLOT1) +//#define LCD_VCC_ON P0_7 +//#define LCD_CS P0_2 +//#define LCD_RES P0_1 + +SPILCD slcd; + +SPILCD::SPILCD() +{ + this->LCD_VCC_ON = C21; + this->LCD_CS = C33; + this->LCD_RES = C31; + this->device = ST7735; + port = marySSP0; + _row = 0; + _column = 0; + _foreground = 0x00FFFFFF; + _background = 0x00000000; + +} + +SPILCD::~SPILCD() +{ +} +void SPILCD::reset(SSP_PORT port) +{ + this->port = port; + if(port==LPCXSSP0) //LPCXpresso 1114 + MAPLE + { + this->LCD_VCC_ON = P0_7; + this->LCD_CS = P0_2; + this->LCD_RES = P0_1; + } + pinMode(LCD_VCC_ON,OUTPUT); + pinMode(LCD_RES,OUTPUT); + pinMode(LCD_CS,OUTPUT); + + digitalWrite(LCD_RES,HIGH); + digitalWrite(LCD_VCC_ON,LOW); + + reset(); + return; +} +void SPILCD::reset() { + + command(0x11);//Sleep out + delay(120); + //ST7735R Frame Rate + command(0xB1); + data(0x01); + data(0x2C); + data(0x2D); + command(0xB2); + data(0x01); + data(0x2C); + data(0x2D); + command(0xB3); + data(0x01); + data(0x2C); + data(0x2D); + data(0x01); + data(0x2C); + data(0x2D); + //------------------------------------End ST7735R Frame Rate-----------------------------------------// + command(0xB4);//Column inversion + data(0x07); + //------------------------------------ST7735R Power Sequence-----------------------------------------// + command(0xC0); + data(0xA2); + data(0x02); + data(0x84); + command(0xC1); + data(0xC5); + command(0xC2); + data(0x0A); + data(0x00); + command(0xC3); + data(0x8A); + data(0x2A); + command(0xC4); + data(0x8A); + data(0xEE); + //---------------------------------End ST7735R Power Sequence-------------------------------------// + command(0xC5);//VCOM + data(0x0E); + command(0x36);//MX, MY, RGB mode + data(0xC8); + //------------------------------------ST7735R Gamma Sequence-----------------------------------------// + command(0xe0); + data(0x02); + data(0x1c); + data(0x07); + data(0x12); + data(0x37); + data(0x32); + data(0x29); + data(0x2d); + data(0x29); + data(0x25); + data(0x2b); + data(0x39); + data(0x00); + data(0x01); + data(0x03); + data(0x10); + command(0xe1); + data(0x03); + data(0x1d); + data(0x07); + data(0x06); + data(0x2e); + data(0x2c); + data(0x29); + data(0x2d); + data(0x2e); + data(0x2e); + data(0x37); + data(0x3f); + data(0x00); + data(0x00); + data(0x02); + data(0x10); + command(0x2A); + data(0x00); + data(0x02); + data(0x00); + data(0x81); + + command(0x2B); + data(0x00); + data(0x01); + data(0x00); + data(0xA0); + //------------------------------------End ST7735R Gamma Sequence-----------------------------------------// + + command(0x3A); + data(0x05); + //command(0x3A);//65k mode + //data(0x05); + command(0x29);//Display on + +} + +void SPILCD::command(int value) +{ + digitalWrite(LCD_CS, LOW); + digitalWrite(LCD_RES, LOW); + + SPI.transfer(value & 0xff); + + digitalWrite(LCD_CS,HIGH); +} + +void SPILCD::data(int value) +{ + digitalWrite(LCD_CS,LOW); + digitalWrite(LCD_RES,HIGH); + + SPI.transfer(value & 0xff); + + digitalWrite(LCD_CS, HIGH); +} + +void SPILCD::_window( int x, int y, int width, int height ) +{ + int x1 = x + 0; + int y1 = y + 0; + int x2 = x1 + width - 1; + int y2 = y1 + height - 1; + +// TODO: fix this frame-Command new +// command( SET_COLUMN_ADDRESS ); +// data( x1 ); +// data( x2 ); +// command( SET_ROW_ADDRESS ); +// data( y1 ); +// data( y2 ); +// command( WRITE_RAM_COMMAND ); + +} + +void SPILCD::WindowReset(void) +{ + command( SET_COLUMN_ADDRESS ); + data( 0 ); + data( 127 ); + command( SET_ROW_ADDRESS ); + data( 0 ); + data( 127 ); + command( WRITE_RAM_COMMAND ); +} + + + + +const unsigned char FONT8x8[97][8] = { + {0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00}, // columns, rows, num_bytes_per_char + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space 0x20 + {0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00}, // ! + {0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00}, // " + {0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00}, // # + {0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00}, // $ + {0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00}, // % + {0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00}, // & + {0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00}, // ' + {0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00}, // ( + {0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00}, // ) + {0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00}, // * + {0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00}, // + + {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30}, // , + {0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00}, // - + {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}, // . + {0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00}, // / (forward slash) + {0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00}, // 0 0x30 + {0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00}, // 1 + {0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00}, // 2 + {0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00}, // 3 + {0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00}, // 4 + {0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00}, // 5 + {0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00}, // 6 + {0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00}, // 7 + {0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00}, // 8 + {0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00}, // 9 + {0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00}, // : + {0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30}, // ; + {0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00}, // < + {0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00}, // = + {0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00}, // > + {0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00}, // ? + {0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00}, // @ 0x40 + {0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00}, // A + {0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00}, // B + {0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00}, // C + {0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00}, // D + {0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00}, // E + {0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00}, // F + {0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00}, // G + {0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00}, // H + {0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // I + {0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00}, // J + {0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00}, // K + {0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00}, // L + {0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00}, // M + {0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00}, // N + {0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00}, // O + {0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00}, // P 0x50 + {0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00}, // Q + {0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00}, // R + {0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00}, // S + {0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00}, // T + {0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00}, // U + {0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00}, // V + {0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00}, // W + {0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00}, // X + {0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00}, // Y + {0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00}, // Z + {0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00}, // [ + {0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00}, // \ (back slash) + {0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00}, // ] + {0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00}, // ^ + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF}, // _ + {0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00}, // ` 0x60 + {0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00}, // a + {0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00}, // b + {0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00}, // c + {0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00}, // d + {0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00}, // e + {0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00}, // f + {0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C}, // g + {0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00}, // h + {0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00}, // i + {0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C}, // j + {0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00}, // k + {0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // l + {0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00}, // m + {0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00}, // n + {0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00}, // o + {0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78}, // p + {0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F}, // q + {0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00}, // r + {0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00}, // s + {0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00}, // t + {0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00}, // u + {0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00}, // v + {0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00}, // w + {0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00}, // x + {0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C}, // y + {0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00}, // z + {0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00}, // { + {0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00}, // | + {0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00}, // } + {0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00}, // ~ + {0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00} +}; // DEL + +void SPILCD::locate(int column, int row) { + _column = column; + _row = row; +} + +void SPILCD::newline() { + _column = 0; + _row++; + if (_row >= rows() ) { + _row = 0; + } +} + +void SPILCD::_putp( int colour ) { + /*int cnv = 0; + + cnv = (colour >> 8) & 0xf800; + cnv |= (colour >> 5) & 0x07e0; + cnv |= (colour >> 3) & 0x001f; + + data( cnv >> 8); + data( cnv ); + */ + unsigned long data1, data2; + data1 = ((colour >> 8) & 0xff) | 0x100; + data2 = (colour & 0x0ff) | 0x100; + data(data1); + data(data2); + } +int SPILCD::_putc(int value) { + int x = _column * 8; // FIXME: Char sizes + int y = _row * 8; + bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0])); + + _column++; + + if (_column >= SPILCD_COLS) { + _row++; + _column = 0; + } + + if (_row >= SPILCD_ROWS) { + _row = 0; + } + + return value; +} + +void SPILCD::cls( void ) { + fill( 0, 0, SPILCD_WIDTH , SPILCD_HEIGHT, _background ); + _row = 0; + _column = 0; +} + + +void SPILCD::window(int x, int y, int width, int height) { + // digitalWrite( LCD_CS, LOW ); + _window(x, y, width, height); + //digitalWrite( LCD_CS, HIGH ); +} + +void SPILCD::putp(int colour) { + //digitalWrite( LCD_CS, LOW ); + _putp(colour); + //digitalWrite( LCD_CS, HIGH ); +} + + +void SPILCD::pixel(int x, int y, int colour) { + //digitalWrite( LCD_CS, LOW ); + _window(x, y, 1, 1); + _putp(colour); + //digitalWrite( LCD_CS, HIGH ); +} + +void SPILCD::fill( int x, int y, int width, int height, int colour ) +{ + digitalWrite( LCD_CS, LOW ); + _window( x, y, width, height ); + + for (int i = 0; i < width * height; i++ ) { + _putp( colour ); + } + + _window( 0, 0, SPILCD_WIDTH, SPILCD_HEIGHT ); + digitalWrite( LCD_CS, HIGH ); +} + + +void SPILCD::blit( int x, int y, int width, int height, const int* colour ) { + digitalWrite( LCD_CS, LOW ); + _window( x, y, width, height ); + + for (int i = 0; i < width * height; i++ ) { + _putp( colour[i] ); + } + _window( 0, 0, SPILCD_WIDTH, SPILCD_HEIGHT ); + digitalWrite( LCD_CS, HIGH ); +} + + +void SPILCD::bitblit( int x, int y, int width, int height, const char* bitstream ) { + digitalWrite( LCD_CS, LOW ); + _window( x, y, width, height ); + + for (int i = 0; i < height * width; i++ ) { + int byte = i / 8; + int bit = i % 8; + int colour = ((bitstream[ byte ] << bit) & 0x80) ? _foreground : _background; + _putp( colour ); + } + _window( 0, 0, _width, _height ); + digitalWrite( LCD_CS, HIGH ); +} + +void SPILCD::foreground(int c) { + _foreground = c; + return; +} + +void SPILCD::background(int c) { + _background = c; + return; +} + +int SPILCD::width() { + return SPILCD_WIDTH; +} + +int SPILCD::height() { + return SPILCD_HEIGHT; +} + +int SPILCD::columns() { + return SPILCD_COLS; +} + +int SPILCD::rows() { + return SPILCD_ROWS; +} + + diff --git a/src/Samples/SpiLcd.h b/src/Samples/SpiLcd.h new file mode 100755 index 0000000..be912cc --- /dev/null +++ b/src/Samples/SpiLcd.h @@ -0,0 +1,94 @@ +/* + * SpiLcd.h + * + * Created on: 2012/08/01 + * Author: lynxeyed + */ + +#ifndef SPILCD_H_ +#define SPILCD_H_ + +/**************************************************************************//** + * @file SpiLcd.h + * @brief Arduino-like library for Cortex-M0 Series + * @version v.0.50 + * @date 1. August 2011. + * @author lynxeyed + * @note Copyright (c) 2012 Lynx-EyED's Klavier and Craft-works.
+ * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions:
+ * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ******************************************************************************/ + +#include "SPI.h" +#include "gpio.h" + +#ifdef __cplusplus + extern "C" { +#endif + +typedef enum {ST7735,Nokia6610,Nokia6100,PCF8833} LCD_DEVICES; // Defaults:ST7735 + +class SPILCD { +private: + SSP_PORT port; + LCD_DEVICES device; + int LCD_VCC_ON; + int LCD_CS; + int LCD_RES; + int _row; + int _column; + int _foreground; + int _background; + int _width; + int _height; + + + +public: + SPILCD(); // announce the constructor to initialize + ~SPILCD(); + + void reset(); + void reset(SSP_PORT port); + void command( int value ); + void data( int value ); + void _window( int x, int y, int width, int height ); + void locate(int column, int row); + void newline(); + void _putp( int colour ); + int _putc( int value ); + void cls( void ); + void window( int x, int y, int width, int height ); + void WindowReset(void); + void putp( int colour ); + void pixel( int x, int y, int colour ); + void fill( int x, int y, int width, int height, int colour ); + void blit( int x, int y, int width, int height, const int* colour ); + void bitblit( int x, int y, int width, int height, const char* bitstream ); + void foreground(int c); + void background(int c); + int width(); + int height(); + int columns(); + int rows(); +}; + +extern SPILCD slcd; + +#ifdef __cplusplus + } +#endif +#endif /* SPILCD_H_ */ diff --git a/src/Samples/TFTLCD.h b/src/Samples/TFTLCD.h new file mode 100755 index 0000000..797383c --- /dev/null +++ b/src/Samples/TFTLCD.h @@ -0,0 +1,220 @@ +#include +#include + +#define LCD_CS C33//4 //cs +#define LCD_DC C21//5 //data command +#define LCD_RES C31//6 //reset +//MOSI 11 C47 +//CLK 13 C43 +#define DC_DATA HIGH +#define DC_CMD LOW + +//#define STICK_A 7 +//#define STICK_B 8 +//#define STICK_C 9 +//#define STICK_D 10 +//#define STICK_CT 2 + + +#define select_disp() digitalWrite(LCD_CS,LOW) //PORTD &= ~(1 << PORTD4) +#define unselect_disp() digitalWrite(LCD_CS,HIGH) //PORTD |= (1 << PORTD4) + +#define set_disp_command() digitalWrite(LCD_DC,LOW) //PORTD &= ~(1 << PORTD5) +#define set_disp_data() digitalWrite(LCD_DC,HIGH) //PORTD |= (1 << PORTD5) + +/* SSD1283A Unique Value */ +/* MUST be need for SSD1283A */ +#define OFS_COL 2 +#define OFS_RAW 0 +#define MAX_X 130 +#define MAX_Y 130 + + + +void sendCmd(unsigned int cmd){ + select_disp(); + set_disp_command(); + // shiftOut2(PIN_MOSI,PIN_CLK,MSBFIRST,cmd); + SPI.transfer(cmd); + set_disp_data(); +} + +void sendData(unsigned int data){ + select_disp(); + set_disp_data(); + //shiftOut2(PIN_MOSI,PIN_CLK,MSBFIRST,data); + SPI.transfer(data); +} + +void sendData16(unsigned int data1,unsigned int data2){ + select_disp(); + set_disp_data(); + //shiftOut2(PIN_MOSI,PIN_CLK,MSBFIRST,data); + SPI.transfer(data1); + SPI.transfer(data2); +} + +void sendColor(unsigned int color){ + sendData(color&0x00ff); +} + + + + +void initDisplay(){ + select_disp(); + + digitalWrite(LCD_RES, LOW); + delay(80); + digitalWrite(LCD_RES, HIGH); + delay(20); + + /* SSD1283A */ + sendCmd(0x10); /* Power Control (1) */ + sendData16(0x2f,0x8e); /* Onchip DCDC Clock,Fine*2 StartCycle,VGH unregurated */ + /* StepUpCycle fosc,Internal OPAMP Current reserved,Sleep Mode OFF */ + + sendCmd(0x11); /* Power Control (2) */ + sendData16(0x00,0x0c); /* VGH/VCI ratio x4 */ + + sendCmd(0x07); /* Display Control */ + sendData16(0x00,0x21); /* Nomalize source out zero, Vartical Scroll not pafomed */ + /* 1 Divison Display,Source output GND, Gate output GVOFFL */ + + sendCmd(0x28); /* VCOM-OTP1 */ + sendData16(0x00,0x06); + + sendCmd(0x28); /* VCOM-OTP1 */ + sendData16(0x00,0x05); + + sendCmd(0x27); /* VCOM-OTP */ + sendData16(0x05,0x7f); + + sendCmd(0x29); /* VCOM-OTP2 */ + sendData16(0x89,0xa1); + + sendCmd(0x00); /* Oscillator On */ + sendData16(0x00,0x01); + delay(150); + + sendCmd(0x29); /* VCOM-OTP2 */ + sendData16(0x80,0xb0); + delay(50); + + sendCmd(0x29); /* VCOM-OTP2 */ + sendData16(0xff,0xfe); + + sendCmd(0x07); /* Display Control */ + sendData16(0x00,0x23); + delay(50); + + sendCmd(0x07); /* Display Control (Confirm) */ + sendData16(0x00,0x23); + delay(50); + + sendCmd(0x07); /* Display Control */ + sendData16(0x00,0x33); /* Nomalize source out zero, Vartical Scroll not pafomed */ + /* 1 Divison Display,,Source output GND (OFF) */ + /* Gate output Selected VGH, others GVOFFL */ + + sendCmd(0x01); /* Driver Output Control */ + sendData16(0x21,0x83); /* Reversal ON ,Cs On Common,BGR,Scanning Mounting Method */ + /* Output Shift Direction of Gate Driver G131->G0, */ + /* Output Shift Direction of Source Driver S0->S395, */ + /* Number of Gate Driver 131 */ + + sendCmd(0x2f); /* ??? */ + sendData16(0xff,0xff); + + sendCmd(0x2c); /* Oscillator frequency */ + sendData16(0x80,0x00); /* 520kHz */ + + sendCmd(0x03); /* Entry mode */ + sendData16(0x68,0x30); /* Colour mode 65k,OE defines Display Window,D-mode from internal ram */ + /* Horizontal increment & Vertical increment & AM 0 Horizontal */ + + sendCmd(0x40); /* Set Offset */ + sendData16(0x00,0x02); + + sendCmd(0x27); /* Further bias current setting */ + sendData16(0x05,0x70); /* Maximum */ + + sendCmd(0x02); /* LCD-Driving-Waveform Control */ + sendData16(0x03,0x00); /* the odd/even frame-select signals and the N-line inversion */ + /* signals are EORed for alternating drive */ + + sendCmd(0x0b); /* Frame Cycle Control */ + sendData16(0x58,0x0c); /* Amount of Overlap 4 clock cycle */ + /* Delay amount of the source output 2 clock cycle */ + /* EQ period 2 clock cycle, Division Ratio 2 */ + + sendCmd(0x12); /* Power Control 3 */ + sendData16(0x06,0x09); /* Set amplitude magnification of VLCD63 = Vref x 2.175 */ + + sendCmd(0x13); /* Power Control 4 */ + sendData16(0x31,0x00); /* Set output voltage of VcomL = VLCD63 x 1.02 */ + + sendCmd(0x2a); /* Test Commands ? */ + sendData16(0x1d,0xd0); + + sendCmd(0x2b); /* Test Commands ? */ + sendData16(0x0a,0x90); + + sendCmd(0x2d); /* Test Commands ? */ + sendData16(0x31,0x0f); + delay(100); + + sendCmd(0x44); /* Set CAS Address */ + sendData16(0x83,0x00); + + sendCmd(0x45); /* Set RAS Address */ + sendData16(0x83,0x00); + + sendCmd(0x21); /* Set RAM Address */ + sendData16(0x00,0x00); + + sendCmd(0x1e); /* Power Control 5 */ + sendData16(0x00,0xbf); /* VcomH = VLCD63 x 0.99 */ + delay(1); + + sendCmd(0x1e); /* Power Control 5 */ + sendData16(0x00,0x00); /* VcomH =VLCD63 x 0.36 */ + delay(100); + + unselect_disp(); +} + +void resetArea(){ + int x=0,y=0; + int xwidth=130 , yheight=130; + + select_disp(); + + /* Set CAS Address */ + sendCmd(0x44); + sendData16(OFS_COL + xwidth - 1, OFS_COL + x); + + /* Set RAS Address */ + sendCmd(0x45); + sendData16(OFS_RAW + yheight - 1, OFS_RAW + y); + + /* Set RAM Address */ + sendCmd(0x21); + sendData16(OFS_RAW + y, OFS_COL + x); + + /* Write RAM */ + sendCmd(0x22); + + set_disp_data(); + unselect_disp(); +} + +void fillScreen(unsigned int color_H,unsigned int color_L){ + select_disp(); + int i; + resetArea(); + for(i=0;i<16900;i++){ + sendData16(color_H,color_L); + } + unselect_disp(); +} diff --git a/src/Samples/maryoled.cpp b/src/Samples/maryoled.cpp new file mode 100755 index 0000000..8df935c --- /dev/null +++ b/src/Samples/maryoled.cpp @@ -0,0 +1,484 @@ +/* mbed Nokia LCD Library + * Atsu + */ + +#include "delay.h" +#include "maryoled.h" +#include + +/** General parameters for MARMEX_OB_oled */ + +#define MARYOLED_ROWS 15 +#define MARYOLED_COLS 16 +#define MARYOLED_WIDTH 128 +#define MARYOLED_HEIGHT 128 +#define MARYOLED_FREQUENCY 20000000 + +//MARY Pin Assign +//#define OLED_VCC_ON C21 +//#define OLED_CS C33 +//#define OLED_RES C31 + +//LPCXpresso pin Assign (MARMEX-SLOT1) +//#define OLED_VCC_ON P0_7 +//#define OLED_CS P0_2 +//#define OLED_RES P0_1 + +MARYOLED oled; + +MARYOLED::MARYOLED() //default : MARY +{ + this->OLED_VCC_ON = C21; + this->OLED_CS = C33; + this->OLED_RES = C31; + this->device = OLED; + port = marySSP0; + _row = 0; + _column = 0; + _foreground = 0x00FFFFFF; + _background = 0x00000000; + +} + +MARYOLED::~MARYOLED() +{ +} +void MARYOLED::reset(SSP_PORT port) +{ + this->port = port; + if(port==LPCXSSP0) //LPCXpresso 1114 + MAPLE + { + this->OLED_VCC_ON = P0_7; + this->OLED_CS = P0_2; + this->OLED_RES = P0_1; + } + pinMode(OLED_VCC_ON,OUTPUT); + pinMode(OLED_RES,OUTPUT); + pinMode(OLED_CS,OUTPUT); + + digitalWrite(OLED_RES,HIGH); + digitalWrite(OLED_VCC_ON,LOW); + + reset(); + return; +} +void MARYOLED::reset() { + #define GAMMA_LUT_SIZE 63 + //unsigned char gamma_LUT[ GAMMA_LUT_SIZE ]; + + //for ( int i = 0; i < GAMMA_LUT_SIZE; i++ ) + //gamma_LUT[ i ] = (unsigned char)(powf( ((float)i / 62.0), (1.0 / 0.58) ) * 178.0 + 2.0); + unsigned char gamma_LUT[63] = + { + 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, + // + 0x12, 0x13, 0x15, 0x17, + 0x19, 0x1b, 0x1d, 0x1f, + 0x21, 0x23, 0x25, 0x27, + 0x2a, 0x2d, 0x30, 0x33, + // + 0x36, 0x39, 0x3c, 0x3f, + 0x42, 0x45, 0x48, 0x4c, + 0x50, 0x54, 0x58, 0x5c, + 0x60, 0x64, 0x68, 0x6c, + // + 0x70, 0x74, 0x78, 0x7d, + 0x82, 0x87, 0x8c, 0x91, + 0x96, 0x9b, 0xa0, 0xa5, + 0xaa, 0xaf, 0xb4 + }; + + // setup the _spi interface and bring display out of reset + digitalWrite( OLED_CS, HIGH ); + digitalWrite( OLED_RES, LOW ); + + + SPI.setBitLength( 9 ); //9bit mode + SPI.setDataMode(SPI_MODE3); + SPI.setClockDivider( SPI_CLOCK_DIV2 ); + SPI.begin(port); + //ssp_begin(SPI_CLOCK_DIV1, SPI_MODE0, 9); + + delay( 100 ); //wait 100ms + digitalWrite( OLED_RES, LOW ); + delay( 100 ); + digitalWrite( OLED_RES, HIGH ); //RESET + + command( SET_DISPLAY_MODE_ALL_OFF ); + + command( SET_COMMAND_LOCK ); + data( 0x12 ); + + command( SET_COMMAND_LOCK ); + data( 0xb1 ); + + command( SET_SLEEP_MODE_ON ); + + command( FRONT_CLOCK_DRIVER_OSC_FREQ ); + data( 0xF1 ); + + command( SET_MUX_RATIO ); + data( 0x7F ); + + command( SET_DISPAY_OFFSET ); + data( 0x00 ); + + command( SET_DISPAY_START_LINE ); + data( 0x00 ); + + command( SET_REMAP_COLOR_DEPTH ); + data( 0x74 ); + + command( SET_GPIO ); + data( 0x00); + + command( FUNCTION_SELECTION ); + data( 0x01 ); + + command( SET_SEGMENT_LOW_VOLTAGE ); + data( 0xA0 ); + data( 0xB5 ); + data( 0x55 ); + + command( SET_CONTRAST_CURRENT_FOR_COLOR_ABC ); + data( 0xC8 ); + data( 0x80 ); + data( 0xC8 ); + + command( MASTER_CONTRAST_CURRENT_CONTROL ); + data( 0x0F ); + + command( LOOKUP_TABLE_FOR_GRAYSCALE_PULSE_WIDTH ); + for ( int i = 0; i < GAMMA_LUT_SIZE; i++ ) + data( gamma_LUT[ i ] ); + + //command( USE_BUILT_IN_LINEAR_LUT ); + + command( SET_RESET_PRECHARGE_PERIOD ); + data( 0x32 ); + + command( ENHANCE_DRIVING_SCHEME_CAPABILITY ); + data( 0xA4 );//data( 0x04 ); + data( 0x00 ); + data( 0x00 ); + + command( SET_PRECHARGE_VOLTAGE ); + data( 0x17 ); + + command( SET_SECOND_PRECHARGE_VOLTAGE ); + data( 0x01 ); + + command( SET_VCOMH_VOLTAGE ); + data( 0x05 ); + command( SET_DISPLAY_MODE_RESET ); + + command( SET_COLUMN_ADDRESS ); + data( 0x00 ); + data( 0x7f ); + + command( SET_ROW_ADDRESS ); + data( 0x00 ); + data( 0x7f ); + + cls(); + //WindowReset(); + + digitalWrite(OLED_VCC_ON,HIGH); + + delay( 200 ); //wait 200ms + + command( SET_SLEEP_MODE_OFF ); + return; +} + +void MARYOLED::command(int value) { + + digitalWrite(OLED_CS,LOW); + SPI.transfer(value & 0xff); + //ssp_transfer(value & 0xFF); + digitalWrite(OLED_CS,HIGH); +} + +void MARYOLED::data(int value) { + digitalWrite(OLED_CS,LOW); + SPI.transfer(value | 0x100); + //ssp_transfer(value | 0x100); + digitalWrite(OLED_CS,HIGH); +} + +void MARYOLED::_window( int x, int y, int width, int height ) +{ + int x1 = x + 0; + int y1 = y + 0; + int x2 = x1 + width - 1; + int y2 = y1 + height - 1; + + command( SET_COLUMN_ADDRESS ); + data( x1 ); + data( x2 ); + command( SET_ROW_ADDRESS ); + data( y1 ); + data( y2 ); + command( WRITE_RAM_COMMAND ); + +} + +void MARYOLED::WindowReset(void) +{ + command( SET_COLUMN_ADDRESS ); + data( 0 ); + data( 127 ); + command( SET_ROW_ADDRESS ); + data( 0 ); + data( 127 ); + command( WRITE_RAM_COMMAND ); +} + + + + +const unsigned char FONT8x8[97][8] = { + {0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00}, // columns, rows, num_bytes_per_char + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space 0x20 + {0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00}, // ! + {0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00}, // " + {0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00}, // # + {0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00}, // $ + {0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00}, // % + {0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00}, // & + {0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00}, // ' + {0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00}, // ( + {0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00}, // ) + {0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00}, // * + {0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00}, // + + {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30}, // , + {0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00}, // - + {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}, // . + {0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00}, // / (forward slash) + {0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00}, // 0 0x30 + {0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00}, // 1 + {0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00}, // 2 + {0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00}, // 3 + {0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00}, // 4 + {0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00}, // 5 + {0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00}, // 6 + {0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00}, // 7 + {0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00}, // 8 + {0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00}, // 9 + {0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00}, // : + {0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30}, // ; + {0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00}, // < + {0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00}, // = + {0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00}, // > + {0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00}, // ? + {0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00}, // @ 0x40 + {0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00}, // A + {0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00}, // B + {0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00}, // C + {0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00}, // D + {0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00}, // E + {0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00}, // F + {0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00}, // G + {0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00}, // H + {0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // I + {0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00}, // J + {0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00}, // K + {0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00}, // L + {0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00}, // M + {0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00}, // N + {0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00}, // O + {0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00}, // P 0x50 + {0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00}, // Q + {0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00}, // R + {0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00}, // S + {0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00}, // T + {0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00}, // U + {0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00}, // V + {0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00}, // W + {0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00}, // X + {0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00}, // Y + {0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00}, // Z + {0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00}, // [ + {0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00}, // \ (back slash) + {0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00}, // ] + {0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00}, // ^ + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF}, // _ + {0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00}, // ` 0x60 + {0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00}, // a + {0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00}, // b + {0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00}, // c + {0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00}, // d + {0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00}, // e + {0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00}, // f + {0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C}, // g + {0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00}, // h + {0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00}, // i + {0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C}, // j + {0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00}, // k + {0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // l + {0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00}, // m + {0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00}, // n + {0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00}, // o + {0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78}, // p + {0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F}, // q + {0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00}, // r + {0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00}, // s + {0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00}, // t + {0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00}, // u + {0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00}, // v + {0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00}, // w + {0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00}, // x + {0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C}, // y + {0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00}, // z + {0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00}, // { + {0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00}, // | + {0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00}, // } + {0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00}, // ~ + {0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00} +}; // DEL + +void MARYOLED::locate(int column, int row) { + _column = column; + _row = row; +} + +void MARYOLED::newline() { + _column = 0; + _row++; + if (_row >= rows() ) { + _row = 0; + } +} + +void MARYOLED::_putp( int colour ) { + /*int cnv = 0; + + cnv = (colour >> 8) & 0xf800; + cnv |= (colour >> 5) & 0x07e0; + cnv |= (colour >> 3) & 0x001f; + + data( cnv >> 8); + data( cnv ); + */ + unsigned long data1, data2; + data1 = ((colour >> 8) & 0xff) | 0x100; + data2 = (colour & 0x0ff) | 0x100; + data(data1); + data(data2); + } +int MARYOLED::_putc(int value) { + int x = _column * 8; // FIXME: Char sizes + int y = _row * 8; + bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0])); + + _column++; + + if (_column >= MARYOLED_COLS) { + _row++; + _column = 0; + } + + if (_row >= MARYOLED_ROWS) { + _row = 0; + } + + return value; +} + +void MARYOLED::cls( void ) { + fill( 0, 0, MARYOLED_WIDTH , MARYOLED_HEIGHT, _background ); + _row = 0; + _column = 0; +} + + +void MARYOLED::window(int x, int y, int width, int height) { + // digitalWrite( OLED_CS, LOW ); + _window(x, y, width, height); + //digitalWrite( OLED_CS, HIGH ); +} + +void MARYOLED::putp(int colour) { + //digitalWrite( OLED_CS, LOW ); + _putp(colour); + //digitalWrite( OLED_CS, HIGH ); +} + + +void MARYOLED::pixel(int x, int y, int colour) { + //digitalWrite( OLED_CS, LOW ); + _window(x, y, 1, 1); + _putp(colour); + //digitalWrite( OLED_CS, HIGH ); +} + +void MARYOLED::fill( int x, int y, int width, int height, int colour ) +{ + digitalWrite( OLED_CS, LOW ); + _window( x, y, width, height ); + + for (int i = 0; i < width * height; i++ ) { + _putp( colour ); + } + + _window( 0, 0, MARYOLED_WIDTH, MARYOLED_HEIGHT ); + digitalWrite( OLED_CS, HIGH ); +} + + +void MARYOLED::blit( int x, int y, int width, int height, const int* colour ) { + digitalWrite( OLED_CS, LOW ); + _window( x, y, width, height ); + + for (int i = 0; i < width * height; i++ ) { + _putp( colour[i] ); + } + _window( 0, 0, MARYOLED_WIDTH, MARYOLED_HEIGHT ); + digitalWrite( OLED_CS, HIGH ); +} + + +void MARYOLED::bitblit( int x, int y, int width, int height, const char* bitstream ) { + digitalWrite( OLED_CS, LOW ); + _window( x, y, width, height ); + + for (int i = 0; i < height * width; i++ ) { + int byte = i / 8; + int bit = i % 8; + int colour = ((bitstream[ byte ] << bit) & 0x80) ? _foreground : _background; + _putp( colour ); + } + _window( 0, 0, _width, _height ); + digitalWrite( OLED_CS, HIGH ); +} + +void MARYOLED::foreground(int c) { + _foreground = c; + return; +} + +void MARYOLED::background(int c) { + _background = c; + return; +} + +int MARYOLED::width() { + return MARYOLED_WIDTH; +} + +int MARYOLED::height() { + return MARYOLED_HEIGHT; +} + +int MARYOLED::columns() { + return MARYOLED_COLS; +} + +int MARYOLED::rows() { + return MARYOLED_ROWS; +} + + diff --git a/src/Samples/maryoled.h b/src/Samples/maryoled.h new file mode 100755 index 0000000..3998f8d --- /dev/null +++ b/src/Samples/maryoled.h @@ -0,0 +1,127 @@ +/* + * MARYOLED.h + * + * Created on: 2011/08/01 + * Author: lynxeyed + */ + +#ifndef MARYOLED_H_ +#define MARYOLED_H_ + +/**************************************************************************//** + * @file maryoled.h + * @brief Arduino-like library for MARY(LPC1114) + * @version v.0.50 + * @date 1. August 2011. + * @author this library's assembled by @@dw256 and @@tedd_okano rebuild by @@lynxeyed_atsu + * @note Copyright (c) 2011 Lynx-EyED's Klavier and Craft-works.
+ * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions:
+ * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ******************************************************************************/ + +#include "SPI.h" +#include "gpio.h" + +#ifdef __cplusplus + extern "C" { +#endif + +typedef enum {OLED,Nokia6610,Nokia6100,PCF8833} LCD_DEVICES; // Defaults:OLED + +class MARYOLED { +private: + SSP_PORT port; + LCD_DEVICES device; + int OLED_VCC_ON; + int OLED_CS; + int OLED_RES; + int _row; + int _column; + int _foreground; + int _background; + int _width; + int _height; + + /** Command list for the OLED controller */ + enum { + SET_DISPLAY_MODE_ALL_OFF = 0xA4, + SET_COMMAND_LOCK = 0xFD, + SET_SLEEP_MODE_ON = 0xAE, + FRONT_CLOCK_DRIVER_OSC_FREQ = 0xB3, + SET_MUX_RATIO = 0xCA, + SET_DISPAY_OFFSET = 0xA2, + SET_DISPAY_START_LINE = 0xA1, + SET_REMAP_COLOR_DEPTH = 0xA0, + SET_GPIO = 0xB5, + FUNCTION_SELECTION = 0xAB, + SET_SEGMENT_LOW_VOLTAGE = 0xB4, + SET_CONTRAST_CURRENT_FOR_COLOR_ABC = 0xC1, + MASTER_CONTRAST_CURRENT_CONTROL = 0xC7, + LOOKUP_TABLE_FOR_GRAYSCALE_PULSE_WIDTH = 0xB8, + USE_BUILT_IN_LINEAR_LUT = 0xB9, + SET_RESET_PRECHARGE_PERIOD = 0xB1, + ENHANCE_DRIVING_SCHEME_CAPABILITY = 0xB2, + SET_PRECHARGE_VOLTAGE = 0xBB, + SET_SECOND_PRECHARGE_VOLTAGE = 0xB6, + SET_VCOMH_VOLTAGE = 0xBE, + SET_DISPLAY_MODE_RESET = 0xA6, + SET_COLUMN_ADDRESS = 0x15, + SET_ROW_ADDRESS = 0x75, + WRITE_RAM_COMMAND = 0x5C, + SET_SLEEP_MODE_OFF = 0xAF + }; + /** Constants for power() function */ + enum { + OFF = 0, /**< : to turning-OFF */ + ON /**< : to turning-ON */ + }; + + +public: + MARYOLED(); // announce the constructor to initialize + ~MARYOLED(); + + void reset(); + void reset(SSP_PORT port); + void command( int value ); + void data( int value ); + void _window( int x, int y, int width, int height ); + void locate(int column, int row); + void newline(); + void _putp( int colour ); + int _putc( int value ); + void cls( void ); + void window( int x, int y, int width, int height ); + void WindowReset(void); + void putp( int colour ); + void pixel( int x, int y, int colour ); + void fill( int x, int y, int width, int height, int colour ); + void blit( int x, int y, int width, int height, const int* colour ); + void bitblit( int x, int y, int width, int height, const char* bitstream ); + void foreground(int c); + void background(int c); + int width(); + int height(); + int columns(); + int rows(); +}; + +extern MARYOLED oled; + +#ifdef __cplusplus + } +#endif +#endif /* MARYOLED_H_ */ diff --git a/src/TFTLCD/TFTLCD.h b/src/TFTLCD/TFTLCD.h deleted file mode 100755 index 797383c..0000000 --- a/src/TFTLCD/TFTLCD.h +++ /dev/null @@ -1,220 +0,0 @@ -#include -#include - -#define LCD_CS C33//4 //cs -#define LCD_DC C21//5 //data command -#define LCD_RES C31//6 //reset -//MOSI 11 C47 -//CLK 13 C43 -#define DC_DATA HIGH -#define DC_CMD LOW - -//#define STICK_A 7 -//#define STICK_B 8 -//#define STICK_C 9 -//#define STICK_D 10 -//#define STICK_CT 2 - - -#define select_disp() digitalWrite(LCD_CS,LOW) //PORTD &= ~(1 << PORTD4) -#define unselect_disp() digitalWrite(LCD_CS,HIGH) //PORTD |= (1 << PORTD4) - -#define set_disp_command() digitalWrite(LCD_DC,LOW) //PORTD &= ~(1 << PORTD5) -#define set_disp_data() digitalWrite(LCD_DC,HIGH) //PORTD |= (1 << PORTD5) - -/* SSD1283A Unique Value */ -/* MUST be need for SSD1283A */ -#define OFS_COL 2 -#define OFS_RAW 0 -#define MAX_X 130 -#define MAX_Y 130 - - - -void sendCmd(unsigned int cmd){ - select_disp(); - set_disp_command(); - // shiftOut2(PIN_MOSI,PIN_CLK,MSBFIRST,cmd); - SPI.transfer(cmd); - set_disp_data(); -} - -void sendData(unsigned int data){ - select_disp(); - set_disp_data(); - //shiftOut2(PIN_MOSI,PIN_CLK,MSBFIRST,data); - SPI.transfer(data); -} - -void sendData16(unsigned int data1,unsigned int data2){ - select_disp(); - set_disp_data(); - //shiftOut2(PIN_MOSI,PIN_CLK,MSBFIRST,data); - SPI.transfer(data1); - SPI.transfer(data2); -} - -void sendColor(unsigned int color){ - sendData(color&0x00ff); -} - - - - -void initDisplay(){ - select_disp(); - - digitalWrite(LCD_RES, LOW); - delay(80); - digitalWrite(LCD_RES, HIGH); - delay(20); - - /* SSD1283A */ - sendCmd(0x10); /* Power Control (1) */ - sendData16(0x2f,0x8e); /* Onchip DCDC Clock,Fine*2 StartCycle,VGH unregurated */ - /* StepUpCycle fosc,Internal OPAMP Current reserved,Sleep Mode OFF */ - - sendCmd(0x11); /* Power Control (2) */ - sendData16(0x00,0x0c); /* VGH/VCI ratio x4 */ - - sendCmd(0x07); /* Display Control */ - sendData16(0x00,0x21); /* Nomalize source out zero, Vartical Scroll not pafomed */ - /* 1 Divison Display,Source output GND, Gate output GVOFFL */ - - sendCmd(0x28); /* VCOM-OTP1 */ - sendData16(0x00,0x06); - - sendCmd(0x28); /* VCOM-OTP1 */ - sendData16(0x00,0x05); - - sendCmd(0x27); /* VCOM-OTP */ - sendData16(0x05,0x7f); - - sendCmd(0x29); /* VCOM-OTP2 */ - sendData16(0x89,0xa1); - - sendCmd(0x00); /* Oscillator On */ - sendData16(0x00,0x01); - delay(150); - - sendCmd(0x29); /* VCOM-OTP2 */ - sendData16(0x80,0xb0); - delay(50); - - sendCmd(0x29); /* VCOM-OTP2 */ - sendData16(0xff,0xfe); - - sendCmd(0x07); /* Display Control */ - sendData16(0x00,0x23); - delay(50); - - sendCmd(0x07); /* Display Control (Confirm) */ - sendData16(0x00,0x23); - delay(50); - - sendCmd(0x07); /* Display Control */ - sendData16(0x00,0x33); /* Nomalize source out zero, Vartical Scroll not pafomed */ - /* 1 Divison Display,,Source output GND (OFF) */ - /* Gate output Selected VGH, others GVOFFL */ - - sendCmd(0x01); /* Driver Output Control */ - sendData16(0x21,0x83); /* Reversal ON ,Cs On Common,BGR,Scanning Mounting Method */ - /* Output Shift Direction of Gate Driver G131->G0, */ - /* Output Shift Direction of Source Driver S0->S395, */ - /* Number of Gate Driver 131 */ - - sendCmd(0x2f); /* ??? */ - sendData16(0xff,0xff); - - sendCmd(0x2c); /* Oscillator frequency */ - sendData16(0x80,0x00); /* 520kHz */ - - sendCmd(0x03); /* Entry mode */ - sendData16(0x68,0x30); /* Colour mode 65k,OE defines Display Window,D-mode from internal ram */ - /* Horizontal increment & Vertical increment & AM 0 Horizontal */ - - sendCmd(0x40); /* Set Offset */ - sendData16(0x00,0x02); - - sendCmd(0x27); /* Further bias current setting */ - sendData16(0x05,0x70); /* Maximum */ - - sendCmd(0x02); /* LCD-Driving-Waveform Control */ - sendData16(0x03,0x00); /* the odd/even frame-select signals and the N-line inversion */ - /* signals are EORed for alternating drive */ - - sendCmd(0x0b); /* Frame Cycle Control */ - sendData16(0x58,0x0c); /* Amount of Overlap 4 clock cycle */ - /* Delay amount of the source output 2 clock cycle */ - /* EQ period 2 clock cycle, Division Ratio 2 */ - - sendCmd(0x12); /* Power Control 3 */ - sendData16(0x06,0x09); /* Set amplitude magnification of VLCD63 = Vref x 2.175 */ - - sendCmd(0x13); /* Power Control 4 */ - sendData16(0x31,0x00); /* Set output voltage of VcomL = VLCD63 x 1.02 */ - - sendCmd(0x2a); /* Test Commands ? */ - sendData16(0x1d,0xd0); - - sendCmd(0x2b); /* Test Commands ? */ - sendData16(0x0a,0x90); - - sendCmd(0x2d); /* Test Commands ? */ - sendData16(0x31,0x0f); - delay(100); - - sendCmd(0x44); /* Set CAS Address */ - sendData16(0x83,0x00); - - sendCmd(0x45); /* Set RAS Address */ - sendData16(0x83,0x00); - - sendCmd(0x21); /* Set RAM Address */ - sendData16(0x00,0x00); - - sendCmd(0x1e); /* Power Control 5 */ - sendData16(0x00,0xbf); /* VcomH = VLCD63 x 0.99 */ - delay(1); - - sendCmd(0x1e); /* Power Control 5 */ - sendData16(0x00,0x00); /* VcomH =VLCD63 x 0.36 */ - delay(100); - - unselect_disp(); -} - -void resetArea(){ - int x=0,y=0; - int xwidth=130 , yheight=130; - - select_disp(); - - /* Set CAS Address */ - sendCmd(0x44); - sendData16(OFS_COL + xwidth - 1, OFS_COL + x); - - /* Set RAS Address */ - sendCmd(0x45); - sendData16(OFS_RAW + yheight - 1, OFS_RAW + y); - - /* Set RAM Address */ - sendCmd(0x21); - sendData16(OFS_RAW + y, OFS_COL + x); - - /* Write RAM */ - sendCmd(0x22); - - set_disp_data(); - unselect_disp(); -} - -void fillScreen(unsigned int color_H,unsigned int color_L){ - select_disp(); - int i; - resetArea(); - for(i=0;i<16900;i++){ - sendData16(color_H,color_L); - } - unselect_disp(); -} diff --git a/src/core/Print.cpp b/src/core/Print.cpp index b26848f..e259ac4 100755 --- a/src/core/Print.cpp +++ b/src/core/Print.cpp @@ -1,124 +1,128 @@ -#include "Print.h" - -void Print::print(const char *s) //uart_puts -{ - int n; - for (n = 0; *s; s++, n++) { - write(*s); - } - //return n; - return; -} - -void Print::print(int val, RADIX_FORMAT format) -{ - if(format == BYTE) - { - write((char)(val & 0xff)); - return; - } - char s[33]; - int i,j; - i=j=0; // header of strings - if (val<0) - { //minus value - s[i]='-'; - val=~val+1; - i++; - j++; - } - switch(format) - { - case BIN: - while (val>0) - { // do until zero - s[i++]=radix_bin[val%format]; - val/=format; - } - break; - - case OCT: - while (val>0) - { // do until zero - s[i++]=radix_oct[val%format]; - val/=format; - } - break; - - case DEC: //RADIX = Decimal - while (val>0) - { // do until zero - s[i++]=radix_dec[val%format]; - val/=format; - } - break; - - case HEX: //RADIX = Hexadecimal - while (val>0) - { // do until zero - s[i++]=radix_hex[val%format]; - val/=format; - } - break; - default: - break; - } - s[i--]='\0'; // EOF - while (j0) + { // do until zero + s[i++]=radix_bin[val%format]; + val/=format; + } + break; + + case OCT: + while (val>0) + { // do until zero + s[i++]=radix_oct[val%format]; + val/=format; + } + break; + + case DEC: //RADIX = Decimal + while (val>0) + { // do until zero + s[i++]=radix_dec[val%format]; + val/=format; + } + break; + + case HEX: //RADIX = Hexadecimal + while (val>0) + { // do until zero + s[i++]=radix_hex[val%format]; + val/=format; + } + break; + default: + break; + } + s[i--]='\0'; // EOF + while (jDIR |= (1 << arduino_pinAssign[pin * 2 + 1]); - - }else //INPUT - { - LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR &= ~((1 << arduino_pinAssign[pin * 2 + 1])); - } - return; - } - - if(pin < 100) return; //(20~99:reserved) - - if(pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0); - if(state == OUTPUT) //OUTPUT - { - LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR |= (1 << mary_pinAssign[pin * 2 + 1]); - }else //INPUT - { - LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR &= ~((1 << mary_pinAssign[pin * 2 + 1])); - } - } - return; - } - -void digitalWrite(int pin,digitalWriteState state) -{ - if(pin < 22) //arduinoPinAssign(0~21) - { - if(state == HIGH) //HIGH - { - if(LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR & 1<MASKED_ACCESS[ (1 << arduino_pinAssign[pin * 2 + 1]) ] = (1 << arduino_pinAssign[pin * 2 + 1]); - }else//pin is input - { - SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_PULLUP); - } - }else //LOW - { - if(LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR & 1<MASKED_ACCESS[ (1 << arduino_pinAssign[pin * 2 + 1]) ] &= ~((1 << arduino_pinAssign[pin * 2 + 1])); - }else // pin is input - { - SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_INACTIVE); - } - } - - return; - } - - - if(pin < 100) return; //arduinoPinAssign(20~99:reserved) - - if(pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - if(state == HIGH) //HIGH - { - if(LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR & 1<MASKED_ACCESS[ (1 << mary_pinAssign[pin * 2 + 1]) ] = (1 << mary_pinAssign[pin * 2 + 1]); - }else//pin is input - { - SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_PULLUP); - } - }else //LOW - { - if(LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR & 1<MASKED_ACCESS[ (1 << mary_pinAssign[pin * 2 + 1]) ] &= ~((1 << mary_pinAssign[pin * 2 + 1])); - }else // pin is input - { - SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_INACTIVE); - } - } - } - return; - } - -int digitalRead(int pin) -{ - volatile int readValue; - if(pin < 22) //arduinoPinAssign(0~21) - { - readValue = (LPC_GPIO[ arduino_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << arduino_pinAssign[pin * 2 + 1]) ])? 1 : 0; - return readValue; - } - - if(pin < 100) return 0; //(20~99:reserved) - - if(pin < 200) //maryPinAssign(100~199?) - { - pin = pin - 100; - readValue = (LPC_GPIO[ mary_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << mary_pinAssign[pin * 2 + 1]) ])? 1 : 0; - return readValue; - } - return 0; -} - -/***************************************************************************** - ** Function name: GPIOSetInterrupt - ** - ** Descriptions: Set interrupt sense, event, etc. - ** edge or level, 0 is edge, 1 is level - ** single or double edge, 0 is single, 1 is double - ** active high or low, etc. - ** - ** parameters: pin num, bit position, sense, single/doube, polarity - ** Returned value: None - ** - *****************************************************************************/ -void GPIOSetInterrupt(int pin, int sense, int single, int event) { - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) - { - if (sense == 0) { - LPC_GPIO[arduino_pinAssign[pin * 2]]->IS &= ~((1 << arduino_pinAssign[pin * 2 + 1])); - /* single or double only applies when sense is 0(edge trigger). */ - if (single == 0) - LPC_GPIO[arduino_pinAssign[pin * 2]]->IBE - &= ~((1 << arduino_pinAssign[pin * 2 + 1])); - else - LPC_GPIO[arduino_pinAssign[pin * 2]]->IBE - |= ((1 << arduino_pinAssign[pin * 2 + 1])); - } else - LPC_GPIO[arduino_pinAssign[pin * 2]]->IS |= ((1 << arduino_pinAssign[pin * 2 + 1])); - - if (event == 0) - LPC_GPIO[arduino_pinAssign[pin * 2]]->IEV - &= ~((1 << arduino_pinAssign[pin * 2 + 1])); - else - LPC_GPIO[arduino_pinAssign[pin * 2]]->IEV |= ((1 << arduino_pinAssign[pin * 2 + 1])); - } else if (pin >= 22 && pin < 100) { - //(22~99:reserved) - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - if (sense == 0) { - LPC_GPIO[mary_pinAssign[pin * 2]]->IS &= ~((1 << mary_pinAssign[pin * 2 + 1])); - /* single or double only applies when sense is 0(edge trigger). */ - if (single == 0) - LPC_GPIO[mary_pinAssign[pin * 2]]->IBE &= ~((1 << mary_pinAssign[pin * 2 + 1])); - else - LPC_GPIO[mary_pinAssign[pin * 2]]->IBE |= ((1 << mary_pinAssign[pin * 2 + 1])); - } else - LPC_GPIO[mary_pinAssign[pin * 2]]->IS |= ((1 << mary_pinAssign[pin * 2 + 1])); - - if (event == 0) - LPC_GPIO[mary_pinAssign[pin * 2]]->IEV &= ~((1 << mary_pinAssign[pin * 2 + 1])); - else - LPC_GPIO[mary_pinAssign[pin * 2]]->IEV |= ((1 << mary_pinAssign[pin * 2 + 1])); - } - - return; -} - -void GPIOIntEnable(int pin) { - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) - { - - LPC_GPIO[arduino_pinAssign[pin * 2]]->IE |= (1 << arduino_pinAssign[pin * 2 + 1]); - } else if (pin >= 22 && pin < 100) { //(20~99:reserved) - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - LPC_GPIO[mary_pinAssign[pin * 2]]->IE |= (1 << mary_pinAssign[pin * 2 + 1]); - } - - return; -} - -void GPIOIntDisable(int pin) { - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) - { - - LPC_GPIO[arduino_pinAssign[pin * 2]]->IE &= ~((1 << arduino_pinAssign[pin * 2 + 1])); - } else if (pin >= 22 && pin < 100) {//(22~99:reserved) - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - LPC_GPIO[mary_pinAssign[pin * 2]]->IE &= ~((1 << mary_pinAssign[pin * 2 + 1])); - } - - return; -} - -int GPIOIntStatus(int pin) { - int regVal = 0; - - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) - { - if (LPC_GPIO[arduino_pinAssign[pin * 2]]->MIS - & (1 << arduino_pinAssign[pin * 2 + 1])) { - regVal = 1; - } - } else if (pin >= 22 && pin < 100) { //(22~99:reserved) - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - - if (LPC_GPIO[mary_pinAssign[pin * 2]]->MIS - & (1 << mary_pinAssign[pin * 2 + 1])) { - regVal = 1; - } - } - - return regVal; -} - -void GPIOIntClear(int pin) { - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) - { - - LPC_GPIO[arduino_pinAssign[pin * 2]]->IC |= (1 << arduino_pinAssign[pin * 2 + 1]); - } else if (pin >= 22 && pin < 100) { //(22~99:reserved) - - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - LPC_GPIO[mary_pinAssign[pin * 2]]->IC |= (1 << mary_pinAssign[pin * 2 + 1]); - } - - return; -} +#include "gpio.h" + + +// IOCON:Cortex-M0 depend Settings +//#ifdef __NXP_LPC1114 +#define PORT_BIT_COUNT 12 // up to 12 I/O lines per port +#define PORT_COUNT 4 // up to 4 ports + +const uint8_t IOCON_LUT[PORT_COUNT][PORT_BIT_COUNT] = { + { 0x0C, 0x10, 0x1C, 0x2C, 0x30, 0x34, 0x4C, 0x50, 0x60, 0x64, 0x68, 0x74 }, + { 0x78, 0x7C, 0x80, 0x90, 0x94, 0xA0, 0xA4, 0xA8, 0x14, 0x38, 0x6C, 0x98 }, + { 0x08, 0x28, 0x5C, 0x8C, 0x40, 0x44, 0x00, 0x20, 0x24, 0x54, 0x58, 0x70 }, + { 0x84, 0x88, 0x9C, 0xAC, 0x3C, 0x48 } +}; + +#define IOCONAddress(port,bit) ((volatile uint16_t * const) (LPC_IOCON_BASE + IOCON_LUT[port][bit])) +#define SetIOCON(port, bit, ioconmask, ioconbits) \ + *IOCONAddress((port),(bit)) = (*IOCONAddress((port),(bit)) & ~(ioconmask)) | (ioconbits) + +typedef enum { + GPIO_DIR_INPUT = 0, + GPIO_DIR_OUTPUT = 1, + IOCON_MODE_MASK = (3<<3), + IOCON_MODE_PULLUP = (2<<3), + IOCON_MODE_PULLDOWN = (1<<3), + IOCON_MODE_REPEATER = (3<<3), + IOCON_MODE_INACTIVE = (0<<3), + IOCON_FUNC_MASK = 7, + IOCON_FUNC_0 = 0, + IOCON_FUNC_1 = 1, + IOCON_FUNC_2 = 2, + IOCON_FUNC_3 = 3, + IOCON_FUNC_4 = 4, + IOCON_FUNC_5 = 5, + IOCON_FUNC_6 = 6, + IOCON_FUNC_7 = 7, + IOCON_HYS_MASK = (1<<5), + IOCON_HYS_ENABLE = (1<<5), + IOCON_HYS_DISABLE = (0<<5), + IOCON_ADMODE_MASK = (1<<7), + IOCON_ADMODE_ANALOG = (0<<7), + IOCON_ADMODE_DIGITAL = (1<<7) +} IOCON_BITFIELD_ENUM; + +//#endif + +/* ======================================= +* Macros and functions for Defining MARY's GPIO Assign +* +* CN1_7,8 : (PIO1_2,PIO1_1) +* should be C17,C18 +* +* CN2_1...8 : (PIO1_4,PIO1_11,PIO1_7,PIO1_5,PIO3_2,PIO2_0,PIO1_6,PIO0_1) +* should be C21,C22,C23,C24,C25,C26,C27,C28 +* +* CN3_1...8 : (PIO1_8,PIO0_3,PIO0_2,PIO3_4,PIO0_4,PIO3_5,PIO0_5,PIO1_7) +* should be C31,C32,C33,C34,C35,C36,C37,C38 +* +* CN4_1...7 : (PIO1_9,PIO1_10,PIO0_6,PIO0_11,PIO0_8,PIO1_0,PIO0_9) +* should be C41,C42,C43,C44,C45,C46,C47 +* +* see also mary_pinAssign[...] in "gpio.h" +* ======================================= +*/ + + +void pinMode(int pin,pinModeState state) +{ + if(pin < 22) //arduinoPinAssign(0~21) + { + //IOCON settings use as GPIO + if((arduino_pinAssign[pin * 2]) == 0)//PIO0_X + { + switch(arduino_pinAssign[pin * 2 + 1]) + { + case 11: //P0_11 + SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_1); + break; + default: //P0_X + SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0); + break; + } + }else if((arduino_pinAssign[pin * 2]) == 1)//PIO1_X + { + switch(arduino_pinAssign[pin * 2 + 1]) + { + case _BIT0: + case _BIT1: + case _BIT2: + case _BIT3: + SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_1); + break; + default: + SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0); + break; + } + }else //PIO2_X + { + SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0); + } + + if(state == OUTPUT) //OUTPUT + { + LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR |= (1 << arduino_pinAssign[pin * 2 + 1]); + + }else //INPUT + { + LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR &= ~((1 << arduino_pinAssign[pin * 2 + 1])); + } + return; + } + + if(pin < 100) return; //(20~99:reserved) + + if(pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + //IOCON settings use as GPIO + if((mary_pinAssign[pin * 2]) == 0)//PIO0_X + { + switch(mary_pinAssign[pin * 2 + 1]) + { + case 11: //P0_11 + case 10: //P0_10 + SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_1); + break; + default: //P0_X + SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0); + break; + } + }else if((mary_pinAssign[pin * 2]) == 1)//PIO1_X + { + switch(mary_pinAssign[pin * 2 + 1]) + { + case _BIT0: + case _BIT1: + case _BIT2: + case _BIT3: + SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_1); + break; + default: + SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_FUNC_MASK, IOCON_FUNC_0); + break; + } + } + if(state == OUTPUT) //OUTPUT + { + LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR |= (1 << mary_pinAssign[pin * 2 + 1]); + }else //INPUT + { + LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR &= ~((1 << mary_pinAssign[pin * 2 + 1])); + } + } + return; + } + +void digitalWrite(int pin,digitalWriteState state) +{ + if(pin < 22) //arduinoPinAssign(0~21) + { + if(state == HIGH) //HIGH + { + if(LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR & 1<MASKED_ACCESS[ (1 << arduino_pinAssign[pin * 2 + 1]) ] = (1 << arduino_pinAssign[pin * 2 + 1]); + }else//pin is input + { + SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_PULLUP); + } + }else //LOW + { + if(LPC_GPIO[ arduino_pinAssign[pin * 2] ]->DIR & 1<MASKED_ACCESS[ (1 << arduino_pinAssign[pin * 2 + 1]) ] &= ~((1 << arduino_pinAssign[pin * 2 + 1])); + }else // pin is input + { + SetIOCON(arduino_pinAssign[pin * 2], arduino_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_INACTIVE); + } + } + + return; + } + + + if(pin < 100) return; //arduinoPinAssign(20~99:reserved) + + if(pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + if(state == HIGH) //HIGH + { + if(LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR & 1<MASKED_ACCESS[ (1 << mary_pinAssign[pin * 2 + 1]) ] = (1 << mary_pinAssign[pin * 2 + 1]); + }else//pin is input + { + SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_PULLUP); + } + }else //LOW + { + if(LPC_GPIO[ mary_pinAssign[pin * 2] ]->DIR & 1<MASKED_ACCESS[ (1 << mary_pinAssign[pin * 2 + 1]) ] &= ~((1 << mary_pinAssign[pin * 2 + 1])); + }else // pin is input + { + SetIOCON(mary_pinAssign[pin * 2], mary_pinAssign[pin * 2 + 1], IOCON_MODE_MASK, IOCON_MODE_INACTIVE); + } + } + } + return; + } + +int digitalRead(int pin) +{ + volatile int readValue; + if(pin < 22) //arduinoPinAssign(0~21) + { + readValue = (LPC_GPIO[ arduino_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << arduino_pinAssign[pin * 2 + 1]) ])? 1 : 0; + return readValue; + } + + if(pin < 100) return 0; //(20~99:reserved) + + if(pin < 200) //maryPinAssign(100~199?) + { + pin = pin - 100; + readValue = (LPC_GPIO[ mary_pinAssign[pin * 2] ]->MASKED_ACCESS[ (1 << mary_pinAssign[pin * 2 + 1]) ])? 1 : 0; + return readValue; + } + return 0; +} + +/***************************************************************************** + ** Function name: GPIOSetInterrupt + ** + ** Descriptions: Set interrupt sense, event, etc. + ** edge or level, 0 is edge, 1 is level + ** single or double edge, 0 is single, 1 is double + ** active high or low, etc. + ** + ** parameters: pin num, bit position, sense, single/doube, polarity + ** Returned value: None + ** + *****************************************************************************/ +void GPIOSetInterrupt(int pin, int sense, int single, int event) { + if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) + { + if (sense == 0) { + LPC_GPIO[arduino_pinAssign[pin * 2]]->IS &= ~((1 << arduino_pinAssign[pin * 2 + 1])); + /* single or double only applies when sense is 0(edge trigger). */ + if (single == 0) + LPC_GPIO[arduino_pinAssign[pin * 2]]->IBE + &= ~((1 << arduino_pinAssign[pin * 2 + 1])); + else + LPC_GPIO[arduino_pinAssign[pin * 2]]->IBE + |= ((1 << arduino_pinAssign[pin * 2 + 1])); + } else + LPC_GPIO[arduino_pinAssign[pin * 2]]->IS |= ((1 << arduino_pinAssign[pin * 2 + 1])); + + if (event == 0) + LPC_GPIO[arduino_pinAssign[pin * 2]]->IEV + &= ~((1 << arduino_pinAssign[pin * 2 + 1])); + else + LPC_GPIO[arduino_pinAssign[pin * 2]]->IEV |= ((1 << arduino_pinAssign[pin * 2 + 1])); + } else if (pin >= 22 && pin < 100) { + //(22~99:reserved) + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + if (sense == 0) { + LPC_GPIO[mary_pinAssign[pin * 2]]->IS &= ~((1 << mary_pinAssign[pin * 2 + 1])); + /* single or double only applies when sense is 0(edge trigger). */ + if (single == 0) + LPC_GPIO[mary_pinAssign[pin * 2]]->IBE &= ~((1 << mary_pinAssign[pin * 2 + 1])); + else + LPC_GPIO[mary_pinAssign[pin * 2]]->IBE |= ((1 << mary_pinAssign[pin * 2 + 1])); + } else + LPC_GPIO[mary_pinAssign[pin * 2]]->IS |= ((1 << mary_pinAssign[pin * 2 + 1])); + + if (event == 0) + LPC_GPIO[mary_pinAssign[pin * 2]]->IEV &= ~((1 << mary_pinAssign[pin * 2 + 1])); + else + LPC_GPIO[mary_pinAssign[pin * 2]]->IEV |= ((1 << mary_pinAssign[pin * 2 + 1])); + } + + return; +} + +void GPIOIntEnable(int pin) { + if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) + { + + LPC_GPIO[arduino_pinAssign[pin * 2]]->IE |= (1 << arduino_pinAssign[pin * 2 + 1]); + } else if (pin >= 22 && pin < 100) { //(20~99:reserved) + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + LPC_GPIO[mary_pinAssign[pin * 2]]->IE |= (1 << mary_pinAssign[pin * 2 + 1]); + } + + return; +} + +void GPIOIntDisable(int pin) { + if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) + { + + LPC_GPIO[arduino_pinAssign[pin * 2]]->IE &= ~((1 << arduino_pinAssign[pin * 2 + 1])); + } else if (pin >= 22 && pin < 100) {//(22~99:reserved) + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + LPC_GPIO[mary_pinAssign[pin * 2]]->IE &= ~((1 << mary_pinAssign[pin * 2 + 1])); + } + + return; +} + +int GPIOIntStatus(int pin) { + int regVal = 0; + + if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) + { + if (LPC_GPIO[arduino_pinAssign[pin * 2]]->MIS + & (1 << arduino_pinAssign[pin * 2 + 1])) { + regVal = 1; + } + } else if (pin >= 22 && pin < 100) { //(22~99:reserved) + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + + if (LPC_GPIO[mary_pinAssign[pin * 2]]->MIS + & (1 << mary_pinAssign[pin * 2 + 1])) { + regVal = 1; + } + } + + return regVal; +} + +void GPIOIntClear(int pin) { + if (pin >= 0 && pin < 22) //arduinoPinAssign(0~21) + { + + LPC_GPIO[arduino_pinAssign[pin * 2]]->IC |= (1 << arduino_pinAssign[pin * 2 + 1]); + } else if (pin >= 22 && pin < 100) { //(22~99:reserved) + + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + LPC_GPIO[mary_pinAssign[pin * 2]]->IC |= (1 << mary_pinAssign[pin * 2 + 1]); + } + + return; +} diff --git a/src/core/gpio_int.cpp b/src/core/gpio_int.cpp index 27e16c6..d2477e3 100755 --- a/src/core/gpio_int.cpp +++ b/src/core/gpio_int.cpp @@ -1,153 +1,153 @@ -#include "gpio.h" - -#define EXTERNAL_NUM_INTERRUPTS 22 -volatile static USER_GPIO_FUNC intFunc[EXTERNAL_NUM_INTERRUPTS]; - -void attachInterrupt(int pin, USER_GPIO_FUNC func, digitalWriteState mode) { - pinMode(pin, INPUT); - - switch (mode) { - case LOW: - GPIOSetInterrupt(pin, 1, 0, 0); - break; - case HIGH: - GPIOSetInterrupt(pin, 1, 0, 1); - break; - case CHANGE: - GPIOSetInterrupt(pin, 0, 1, 0); - break; - case RISING: - GPIOSetInterrupt(pin, 0, 0, 1); - break; - case FALLING: - GPIOSetInterrupt(pin, 0, 0, 0); - break; - default: - break; - } - - - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~22) - { - intFunc[pin] = func; - - switch (arduino_pinAssign[pin * 2]) { - case 0: - NVIC_EnableIRQ(EINT0_IRQn); - break; - case 1: - NVIC_EnableIRQ(EINT1_IRQn); - break; - case 2: - NVIC_EnableIRQ(EINT2_IRQn); - break; - case 3: - NVIC_EnableIRQ(EINT3_IRQn); - break; - } - } else if (pin >= 22 && pin < 100) { - //(22~99:reserved) - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - intFunc[pin] = func; - - switch (mary_pinAssign[pin * 2]) { - case 0: - NVIC_EnableIRQ(EINT0_IRQn); - break; - case 1: - NVIC_EnableIRQ(EINT1_IRQn); - break; - case 2: - NVIC_EnableIRQ(EINT2_IRQn); - break; - case 3: - NVIC_EnableIRQ(EINT3_IRQn); - break; - } - } - - GPIOIntEnable(pin); - - return; -} - -void detachInterrupt(int pin) { - GPIOIntDisable(pin); - - if (pin >= 0 && pin < 22) //arduinoPinAssign(0~22) - { - intFunc[pin] = 0; - if (LPC_GPIO[arduino_pinAssign[pin * 2]]->IE == 0) { - switch (arduino_pinAssign[pin * 2]) { - case 0: - NVIC_DisableIRQ(EINT0_IRQn); - break; - case 1: - NVIC_DisableIRQ(EINT1_IRQn); - break; - case 2: - NVIC_DisableIRQ(EINT2_IRQn); - break; - case 3: - NVIC_DisableIRQ(EINT3_IRQn); - break; - } - } - } - else if (pin >= 22 && pin < 100) {//(22~99:reserved) - } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) - { - pin = pin - 100; - intFunc[pin] = 0; - if (LPC_GPIO[mary_pinAssign[pin * 2]]->IE == 0) { - switch (mary_pinAssign[pin * 2]) { - case 0: - NVIC_DisableIRQ(EINT0_IRQn); - break; - case 1: - NVIC_DisableIRQ(EINT1_IRQn); - break; - case 2: - NVIC_DisableIRQ(EINT2_IRQn); - break; - case 3: - NVIC_DisableIRQ(EINT3_IRQn); - break; - } - } - } - return; -} - -void GPIO_IRQHandler(void) { - for (int i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) { - if (GPIOIntStatus(i)) { - GPIOIntClear(i); - - if (intFunc[i]) - intFunc[i](); - } - } -} - -void PIOINT0_IRQHandler(void) { - GPIO_IRQHandler(); - return; -} - -void PIOINT1_IRQHandler(void) { - GPIO_IRQHandler(); - return; -} - -void PIOINT2_IRQHandler(void) { - GPIO_IRQHandler(); - return; -} - -void PIOINT3_IRQHandler(void) { - GPIO_IRQHandler(); - return; -} +#include "gpio.h" + +#define EXTERNAL_NUM_INTERRUPTS 22 +volatile static USER_GPIO_FUNC intFunc[EXTERNAL_NUM_INTERRUPTS]; + +void attachInterrupt(int pin, USER_GPIO_FUNC func, digitalWriteState mode) { + pinMode(pin, INPUT); + + switch (mode) { + case LOW: + GPIOSetInterrupt(pin, 1, 0, 0); + break; + case HIGH: + GPIOSetInterrupt(pin, 1, 0, 1); + break; + case CHANGE: + GPIOSetInterrupt(pin, 0, 1, 0); + break; + case RISING: + GPIOSetInterrupt(pin, 0, 0, 1); + break; + case FALLING: + GPIOSetInterrupt(pin, 0, 0, 0); + break; + default: + break; + } + + + if (pin >= 0 && pin < 22) //arduinoPinAssign(0~22) + { + intFunc[pin] = func; + + switch (arduino_pinAssign[pin * 2]) { + case 0: + NVIC_EnableIRQ(EINT0_IRQn); + break; + case 1: + NVIC_EnableIRQ(EINT1_IRQn); + break; + case 2: + NVIC_EnableIRQ(EINT2_IRQn); + break; + case 3: + NVIC_EnableIRQ(EINT3_IRQn); + break; + } + } else if (pin >= 22 && pin < 100) { + //(22~99:reserved) + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + int _pin = pin - 100; + intFunc[_pin] = func; + + switch (mary_pinAssign[_pin * 2]) { + case 0: + NVIC_EnableIRQ(EINT0_IRQn); + break; + case 1: + NVIC_EnableIRQ(EINT1_IRQn); + break; + case 2: + NVIC_EnableIRQ(EINT2_IRQn); + break; + case 3: + NVIC_EnableIRQ(EINT3_IRQn); + break; + } + } + + GPIOIntEnable(pin); + + return; +} + +void detachInterrupt(int pin) { + GPIOIntDisable(pin); + + if (pin >= 0 && pin < 22) //arduinoPinAssign(0~22) + { + intFunc[pin] = 0; + if (LPC_GPIO[arduino_pinAssign[pin * 2]]->IE == 0) { + switch (arduino_pinAssign[pin * 2]) { + case 0: + NVIC_DisableIRQ(EINT0_IRQn); + break; + case 1: + NVIC_DisableIRQ(EINT1_IRQn); + break; + case 2: + NVIC_DisableIRQ(EINT2_IRQn); + break; + case 3: + NVIC_DisableIRQ(EINT3_IRQn); + break; + } + } + } + else if (pin >= 22 && pin < 100) {//(22~99:reserved) + } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?) + { + pin = pin - 100; + intFunc[pin] = 0; + if (LPC_GPIO[mary_pinAssign[pin * 2]]->IE == 0) { + switch (mary_pinAssign[pin * 2]) { + case 0: + NVIC_DisableIRQ(EINT0_IRQn); + break; + case 1: + NVIC_DisableIRQ(EINT1_IRQn); + break; + case 2: + NVIC_DisableIRQ(EINT2_IRQn); + break; + case 3: + NVIC_DisableIRQ(EINT3_IRQn); + break; + } + } + } + return; +} + +void GPIO_IRQHandler(void) { + for (int i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) { + if (GPIOIntStatus(i)) { + GPIOIntClear(i); + + if (intFunc[i]) + intFunc[i](); + } + } +} + +void PIOINT0_IRQHandler(void) { + GPIO_IRQHandler(); + return; +} + +void PIOINT1_IRQHandler(void) { + GPIO_IRQHandler(); + return; +} + +void PIOINT2_IRQHandler(void) { + GPIO_IRQHandler(); + return; +} + +void PIOINT3_IRQHandler(void) { + GPIO_IRQHandler(); + return; +} diff --git a/src/core/maryoled.cpp b/src/core/maryoled.cpp deleted file mode 100755 index 8df935c..0000000 --- a/src/core/maryoled.cpp +++ /dev/null @@ -1,484 +0,0 @@ -/* mbed Nokia LCD Library - * Atsu - */ - -#include "delay.h" -#include "maryoled.h" -#include - -/** General parameters for MARMEX_OB_oled */ - -#define MARYOLED_ROWS 15 -#define MARYOLED_COLS 16 -#define MARYOLED_WIDTH 128 -#define MARYOLED_HEIGHT 128 -#define MARYOLED_FREQUENCY 20000000 - -//MARY Pin Assign -//#define OLED_VCC_ON C21 -//#define OLED_CS C33 -//#define OLED_RES C31 - -//LPCXpresso pin Assign (MARMEX-SLOT1) -//#define OLED_VCC_ON P0_7 -//#define OLED_CS P0_2 -//#define OLED_RES P0_1 - -MARYOLED oled; - -MARYOLED::MARYOLED() //default : MARY -{ - this->OLED_VCC_ON = C21; - this->OLED_CS = C33; - this->OLED_RES = C31; - this->device = OLED; - port = marySSP0; - _row = 0; - _column = 0; - _foreground = 0x00FFFFFF; - _background = 0x00000000; - -} - -MARYOLED::~MARYOLED() -{ -} -void MARYOLED::reset(SSP_PORT port) -{ - this->port = port; - if(port==LPCXSSP0) //LPCXpresso 1114 + MAPLE - { - this->OLED_VCC_ON = P0_7; - this->OLED_CS = P0_2; - this->OLED_RES = P0_1; - } - pinMode(OLED_VCC_ON,OUTPUT); - pinMode(OLED_RES,OUTPUT); - pinMode(OLED_CS,OUTPUT); - - digitalWrite(OLED_RES,HIGH); - digitalWrite(OLED_VCC_ON,LOW); - - reset(); - return; -} -void MARYOLED::reset() { - #define GAMMA_LUT_SIZE 63 - //unsigned char gamma_LUT[ GAMMA_LUT_SIZE ]; - - //for ( int i = 0; i < GAMMA_LUT_SIZE; i++ ) - //gamma_LUT[ i ] = (unsigned char)(powf( ((float)i / 62.0), (1.0 / 0.58) ) * 178.0 + 2.0); - unsigned char gamma_LUT[63] = - { - 0x02, 0x03, 0x04, 0x05, - 0x06, 0x07, 0x08, 0x09, - 0x0a, 0x0b, 0x0c, 0x0d, - 0x0e, 0x0f, 0x10, 0x11, - // - 0x12, 0x13, 0x15, 0x17, - 0x19, 0x1b, 0x1d, 0x1f, - 0x21, 0x23, 0x25, 0x27, - 0x2a, 0x2d, 0x30, 0x33, - // - 0x36, 0x39, 0x3c, 0x3f, - 0x42, 0x45, 0x48, 0x4c, - 0x50, 0x54, 0x58, 0x5c, - 0x60, 0x64, 0x68, 0x6c, - // - 0x70, 0x74, 0x78, 0x7d, - 0x82, 0x87, 0x8c, 0x91, - 0x96, 0x9b, 0xa0, 0xa5, - 0xaa, 0xaf, 0xb4 - }; - - // setup the _spi interface and bring display out of reset - digitalWrite( OLED_CS, HIGH ); - digitalWrite( OLED_RES, LOW ); - - - SPI.setBitLength( 9 ); //9bit mode - SPI.setDataMode(SPI_MODE3); - SPI.setClockDivider( SPI_CLOCK_DIV2 ); - SPI.begin(port); - //ssp_begin(SPI_CLOCK_DIV1, SPI_MODE0, 9); - - delay( 100 ); //wait 100ms - digitalWrite( OLED_RES, LOW ); - delay( 100 ); - digitalWrite( OLED_RES, HIGH ); //RESET - - command( SET_DISPLAY_MODE_ALL_OFF ); - - command( SET_COMMAND_LOCK ); - data( 0x12 ); - - command( SET_COMMAND_LOCK ); - data( 0xb1 ); - - command( SET_SLEEP_MODE_ON ); - - command( FRONT_CLOCK_DRIVER_OSC_FREQ ); - data( 0xF1 ); - - command( SET_MUX_RATIO ); - data( 0x7F ); - - command( SET_DISPAY_OFFSET ); - data( 0x00 ); - - command( SET_DISPAY_START_LINE ); - data( 0x00 ); - - command( SET_REMAP_COLOR_DEPTH ); - data( 0x74 ); - - command( SET_GPIO ); - data( 0x00); - - command( FUNCTION_SELECTION ); - data( 0x01 ); - - command( SET_SEGMENT_LOW_VOLTAGE ); - data( 0xA0 ); - data( 0xB5 ); - data( 0x55 ); - - command( SET_CONTRAST_CURRENT_FOR_COLOR_ABC ); - data( 0xC8 ); - data( 0x80 ); - data( 0xC8 ); - - command( MASTER_CONTRAST_CURRENT_CONTROL ); - data( 0x0F ); - - command( LOOKUP_TABLE_FOR_GRAYSCALE_PULSE_WIDTH ); - for ( int i = 0; i < GAMMA_LUT_SIZE; i++ ) - data( gamma_LUT[ i ] ); - - //command( USE_BUILT_IN_LINEAR_LUT ); - - command( SET_RESET_PRECHARGE_PERIOD ); - data( 0x32 ); - - command( ENHANCE_DRIVING_SCHEME_CAPABILITY ); - data( 0xA4 );//data( 0x04 ); - data( 0x00 ); - data( 0x00 ); - - command( SET_PRECHARGE_VOLTAGE ); - data( 0x17 ); - - command( SET_SECOND_PRECHARGE_VOLTAGE ); - data( 0x01 ); - - command( SET_VCOMH_VOLTAGE ); - data( 0x05 ); - command( SET_DISPLAY_MODE_RESET ); - - command( SET_COLUMN_ADDRESS ); - data( 0x00 ); - data( 0x7f ); - - command( SET_ROW_ADDRESS ); - data( 0x00 ); - data( 0x7f ); - - cls(); - //WindowReset(); - - digitalWrite(OLED_VCC_ON,HIGH); - - delay( 200 ); //wait 200ms - - command( SET_SLEEP_MODE_OFF ); - return; -} - -void MARYOLED::command(int value) { - - digitalWrite(OLED_CS,LOW); - SPI.transfer(value & 0xff); - //ssp_transfer(value & 0xFF); - digitalWrite(OLED_CS,HIGH); -} - -void MARYOLED::data(int value) { - digitalWrite(OLED_CS,LOW); - SPI.transfer(value | 0x100); - //ssp_transfer(value | 0x100); - digitalWrite(OLED_CS,HIGH); -} - -void MARYOLED::_window( int x, int y, int width, int height ) -{ - int x1 = x + 0; - int y1 = y + 0; - int x2 = x1 + width - 1; - int y2 = y1 + height - 1; - - command( SET_COLUMN_ADDRESS ); - data( x1 ); - data( x2 ); - command( SET_ROW_ADDRESS ); - data( y1 ); - data( y2 ); - command( WRITE_RAM_COMMAND ); - -} - -void MARYOLED::WindowReset(void) -{ - command( SET_COLUMN_ADDRESS ); - data( 0 ); - data( 127 ); - command( SET_ROW_ADDRESS ); - data( 0 ); - data( 127 ); - command( WRITE_RAM_COMMAND ); -} - - - - -const unsigned char FONT8x8[97][8] = { - {0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00}, // columns, rows, num_bytes_per_char - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space 0x20 - {0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00}, // ! - {0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00}, // " - {0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00}, // # - {0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00}, // $ - {0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00}, // % - {0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00}, // & - {0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00}, // ' - {0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00}, // ( - {0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00}, // ) - {0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00}, // * - {0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00}, // + - {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30}, // , - {0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00}, // - - {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}, // . - {0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00}, // / (forward slash) - {0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00}, // 0 0x30 - {0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00}, // 1 - {0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00}, // 2 - {0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00}, // 3 - {0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00}, // 4 - {0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00}, // 5 - {0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00}, // 6 - {0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00}, // 7 - {0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00}, // 8 - {0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00}, // 9 - {0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00}, // : - {0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30}, // ; - {0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00}, // < - {0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00}, // = - {0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00}, // > - {0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00}, // ? - {0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00}, // @ 0x40 - {0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00}, // A - {0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00}, // B - {0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00}, // C - {0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00}, // D - {0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00}, // E - {0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00}, // F - {0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00}, // G - {0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00}, // H - {0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // I - {0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00}, // J - {0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00}, // K - {0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00}, // L - {0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00}, // M - {0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00}, // N - {0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00}, // O - {0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00}, // P 0x50 - {0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00}, // Q - {0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00}, // R - {0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00}, // S - {0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00}, // T - {0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00}, // U - {0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00}, // V - {0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00}, // W - {0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00}, // X - {0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00}, // Y - {0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00}, // Z - {0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00}, // [ - {0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00}, // \ (back slash) - {0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00}, // ] - {0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00}, // ^ - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF}, // _ - {0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00}, // ` 0x60 - {0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00}, // a - {0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00}, // b - {0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00}, // c - {0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00}, // d - {0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00}, // e - {0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00}, // f - {0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C}, // g - {0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00}, // h - {0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00}, // i - {0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C}, // j - {0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00}, // k - {0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // l - {0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00}, // m - {0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00}, // n - {0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00}, // o - {0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78}, // p - {0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F}, // q - {0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00}, // r - {0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00}, // s - {0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00}, // t - {0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00}, // u - {0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00}, // v - {0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00}, // w - {0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00}, // x - {0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C}, // y - {0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00}, // z - {0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00}, // { - {0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00}, // | - {0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00}, // } - {0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00}, // ~ - {0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00} -}; // DEL - -void MARYOLED::locate(int column, int row) { - _column = column; - _row = row; -} - -void MARYOLED::newline() { - _column = 0; - _row++; - if (_row >= rows() ) { - _row = 0; - } -} - -void MARYOLED::_putp( int colour ) { - /*int cnv = 0; - - cnv = (colour >> 8) & 0xf800; - cnv |= (colour >> 5) & 0x07e0; - cnv |= (colour >> 3) & 0x001f; - - data( cnv >> 8); - data( cnv ); - */ - unsigned long data1, data2; - data1 = ((colour >> 8) & 0xff) | 0x100; - data2 = (colour & 0x0ff) | 0x100; - data(data1); - data(data2); - } -int MARYOLED::_putc(int value) { - int x = _column * 8; // FIXME: Char sizes - int y = _row * 8; - bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0])); - - _column++; - - if (_column >= MARYOLED_COLS) { - _row++; - _column = 0; - } - - if (_row >= MARYOLED_ROWS) { - _row = 0; - } - - return value; -} - -void MARYOLED::cls( void ) { - fill( 0, 0, MARYOLED_WIDTH , MARYOLED_HEIGHT, _background ); - _row = 0; - _column = 0; -} - - -void MARYOLED::window(int x, int y, int width, int height) { - // digitalWrite( OLED_CS, LOW ); - _window(x, y, width, height); - //digitalWrite( OLED_CS, HIGH ); -} - -void MARYOLED::putp(int colour) { - //digitalWrite( OLED_CS, LOW ); - _putp(colour); - //digitalWrite( OLED_CS, HIGH ); -} - - -void MARYOLED::pixel(int x, int y, int colour) { - //digitalWrite( OLED_CS, LOW ); - _window(x, y, 1, 1); - _putp(colour); - //digitalWrite( OLED_CS, HIGH ); -} - -void MARYOLED::fill( int x, int y, int width, int height, int colour ) -{ - digitalWrite( OLED_CS, LOW ); - _window( x, y, width, height ); - - for (int i = 0; i < width * height; i++ ) { - _putp( colour ); - } - - _window( 0, 0, MARYOLED_WIDTH, MARYOLED_HEIGHT ); - digitalWrite( OLED_CS, HIGH ); -} - - -void MARYOLED::blit( int x, int y, int width, int height, const int* colour ) { - digitalWrite( OLED_CS, LOW ); - _window( x, y, width, height ); - - for (int i = 0; i < width * height; i++ ) { - _putp( colour[i] ); - } - _window( 0, 0, MARYOLED_WIDTH, MARYOLED_HEIGHT ); - digitalWrite( OLED_CS, HIGH ); -} - - -void MARYOLED::bitblit( int x, int y, int width, int height, const char* bitstream ) { - digitalWrite( OLED_CS, LOW ); - _window( x, y, width, height ); - - for (int i = 0; i < height * width; i++ ) { - int byte = i / 8; - int bit = i % 8; - int colour = ((bitstream[ byte ] << bit) & 0x80) ? _foreground : _background; - _putp( colour ); - } - _window( 0, 0, _width, _height ); - digitalWrite( OLED_CS, HIGH ); -} - -void MARYOLED::foreground(int c) { - _foreground = c; - return; -} - -void MARYOLED::background(int c) { - _background = c; - return; -} - -int MARYOLED::width() { - return MARYOLED_WIDTH; -} - -int MARYOLED::height() { - return MARYOLED_HEIGHT; -} - -int MARYOLED::columns() { - return MARYOLED_COLS; -} - -int MARYOLED::rows() { - return MARYOLED_ROWS; -} - - diff --git a/src/core/maryoled.h b/src/core/maryoled.h deleted file mode 100755 index 3998f8d..0000000 --- a/src/core/maryoled.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * MARYOLED.h - * - * Created on: 2011/08/01 - * Author: lynxeyed - */ - -#ifndef MARYOLED_H_ -#define MARYOLED_H_ - -/**************************************************************************//** - * @file maryoled.h - * @brief Arduino-like library for MARY(LPC1114) - * @version v.0.50 - * @date 1. August 2011. - * @author this library's assembled by @@dw256 and @@tedd_okano rebuild by @@lynxeyed_atsu - * @note Copyright (c) 2011 Lynx-EyED's Klavier and Craft-works.
- * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions:
- * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software.
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - ******************************************************************************/ - -#include "SPI.h" -#include "gpio.h" - -#ifdef __cplusplus - extern "C" { -#endif - -typedef enum {OLED,Nokia6610,Nokia6100,PCF8833} LCD_DEVICES; // Defaults:OLED - -class MARYOLED { -private: - SSP_PORT port; - LCD_DEVICES device; - int OLED_VCC_ON; - int OLED_CS; - int OLED_RES; - int _row; - int _column; - int _foreground; - int _background; - int _width; - int _height; - - /** Command list for the OLED controller */ - enum { - SET_DISPLAY_MODE_ALL_OFF = 0xA4, - SET_COMMAND_LOCK = 0xFD, - SET_SLEEP_MODE_ON = 0xAE, - FRONT_CLOCK_DRIVER_OSC_FREQ = 0xB3, - SET_MUX_RATIO = 0xCA, - SET_DISPAY_OFFSET = 0xA2, - SET_DISPAY_START_LINE = 0xA1, - SET_REMAP_COLOR_DEPTH = 0xA0, - SET_GPIO = 0xB5, - FUNCTION_SELECTION = 0xAB, - SET_SEGMENT_LOW_VOLTAGE = 0xB4, - SET_CONTRAST_CURRENT_FOR_COLOR_ABC = 0xC1, - MASTER_CONTRAST_CURRENT_CONTROL = 0xC7, - LOOKUP_TABLE_FOR_GRAYSCALE_PULSE_WIDTH = 0xB8, - USE_BUILT_IN_LINEAR_LUT = 0xB9, - SET_RESET_PRECHARGE_PERIOD = 0xB1, - ENHANCE_DRIVING_SCHEME_CAPABILITY = 0xB2, - SET_PRECHARGE_VOLTAGE = 0xBB, - SET_SECOND_PRECHARGE_VOLTAGE = 0xB6, - SET_VCOMH_VOLTAGE = 0xBE, - SET_DISPLAY_MODE_RESET = 0xA6, - SET_COLUMN_ADDRESS = 0x15, - SET_ROW_ADDRESS = 0x75, - WRITE_RAM_COMMAND = 0x5C, - SET_SLEEP_MODE_OFF = 0xAF - }; - /** Constants for power() function */ - enum { - OFF = 0, /**< : to turning-OFF */ - ON /**< : to turning-ON */ - }; - - -public: - MARYOLED(); // announce the constructor to initialize - ~MARYOLED(); - - void reset(); - void reset(SSP_PORT port); - void command( int value ); - void data( int value ); - void _window( int x, int y, int width, int height ); - void locate(int column, int row); - void newline(); - void _putp( int colour ); - int _putc( int value ); - void cls( void ); - void window( int x, int y, int width, int height ); - void WindowReset(void); - void putp( int colour ); - void pixel( int x, int y, int colour ); - void fill( int x, int y, int width, int height, int colour ); - void blit( int x, int y, int width, int height, const int* colour ); - void bitblit( int x, int y, int width, int height, const char* bitstream ); - void foreground(int c); - void background(int c); - int width(); - int height(); - int columns(); - int rows(); -}; - -extern MARYOLED oled; - -#ifdef __cplusplus - } -#endif -#endif /* MARYOLED_H_ */ -- cgit v1.2.3