Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
First version of modified library. Should work fine.
- Loading branch information
0 parents
commit 3c783dc
Showing
6 changed files
with
912 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
This is a modified version of Adafruit's SSD1306 library for OLED displays. This version WILL NOT work with | ||
128x32 displays, and is SPECIFICALLY for 128x64. This version, however, uses hardware SPI for super-fast | ||
update speeds, especially when used with the Akafuino X microcontroller board. I have no current plans to | ||
re-implement I2C control or support for 128x32 displays with this port, but if you need it, drop me a line | ||
and I can look into it. | ||
|
||
Pinout for Arduino Uno: | ||
-Display Data to Arduino digital 11 | ||
-Display CLK to Arduino digital 13 | ||
-Display DC, Rst, and CS can be any pins | ||
|
||
|
||
|
||
|
||
|
||
This is a library for our Monochrome OLEDs based on SSD1306 drivers | ||
|
||
Pick one up today in the adafruit shop! | ||
------> http://www.adafruit.com/category/63_98 | ||
|
||
These displays use SPI to communicate, 4 or 5 pins are required to | ||
interface | ||
|
||
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. | ||
Scrolling code contributed by Michael Gregg | ||
BSD license, check license.txt for more information | ||
All text above must be included in any redistribution | ||
|
||
To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Xmega_SSD1306. Check that the Adafruit_SSD1306 folder contains Adafruit_SSD1306.cpp and Adafruit_SSD1306.h | ||
|
||
Place the Xmega_SSD1306 library folder your <arduinosketchfolder>/libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE. | ||
|
||
You will also have to download the Adafruit GFX Graphics core which does all the circles, text, rectangles, etc. You can get it from | ||
https://github.com/adafruit/Adafruit-GFX-Library | ||
and download/install that library as well | ||
|
||
--11/20/2012-- | ||
Modified to use hardware SPI on both Arduino Uno and Akafuino X by Nathan Duprey | ||
Only for 128x64 SSD1306 OLED Displays |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,324 @@ | ||
/********************************************************************* | ||
This is a library for our Monochrome OLEDs based on SSD1306 drivers | ||
Pick one up today in the adafruit shop! | ||
------> http://www.adafruit.com/category/63_98 | ||
These displays use SPI to communicate, 4 or 5 pins are required to | ||
interface | ||
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. | ||
BSD license, check license.txt for more information | ||
All text above, and the splash screen below must be included in any redistribution | ||
--11/20/2012-- | ||
Modified to use hardware SPI on both Arduino Uno and Akafuino X by Nathan Duprey | ||
Only for 128x64 SSD1306 OLED Displays | ||
*********************************************************************/ | ||
|
||
#include <avr/pgmspace.h> | ||
#include <util/delay.h> | ||
#include <stdlib.h> | ||
|
||
#include "Adafruit_GFX.h" | ||
#include "Xmega_SSD1306.h" | ||
|
||
#include "glcdfont.c" | ||
|
||
//a 5x7 font table | ||
extern uint8_t PROGMEM font[]; | ||
|
||
//the memory buffer for the LCD | ||
static uint8_t buffer[SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8] = { | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, | ||
0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x80, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, | ||
0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xFF, | ||
0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, | ||
0x80, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x8C, 0x8E, 0x84, 0x00, 0x00, 0x80, 0xF8, | ||
0xF8, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, | ||
0x00, 0xE0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xC7, 0x01, 0x01, | ||
0x01, 0x01, 0x83, 0xFF, 0xFF, 0x00, 0x00, 0x7C, 0xFE, 0xC7, 0x01, 0x01, 0x01, 0x01, 0x83, 0xFF, | ||
0xFF, 0xFF, 0x00, 0x38, 0xFE, 0xC7, 0x83, 0x01, 0x01, 0x01, 0x83, 0xC7, 0xFF, 0xFF, 0x00, 0x00, | ||
0x01, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x07, 0x01, 0x01, 0x01, 0x00, 0x00, 0x7F, 0xFF, | ||
0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xFF, | ||
0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x03, 0x0F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC7, 0xC7, 0x8F, | ||
0x8F, 0x9F, 0xBF, 0xFF, 0xFF, 0xC3, 0xC0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC, | ||
0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x01, 0x03, 0x03, 0x03, | ||
0x03, 0x03, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, | ||
0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x00, 0x00, | ||
0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, | ||
0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x03, | ||
0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x1F, 0x0F, | ||
0x87, 0xC7, 0xF7, 0xFF, 0xFF, 0x1F, 0x1F, 0x3D, 0xFC, 0xF8, 0xF8, 0xF8, 0xF8, 0x7C, 0x7D, 0xFF, | ||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x3F, 0x0F, 0x07, 0x00, 0x30, 0x30, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x1F, | ||
0x0F, 0x07, 0x1F, 0x7F, 0xFF, 0xFF, 0xF8, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF8, 0xE0, | ||
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, | ||
0x00, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x0E, 0xFC, 0xF8, 0x00, 0x00, 0xF0, 0xF8, 0x1C, 0x0E, | ||
0x06, 0x06, 0x06, 0x0C, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFC, | ||
0xFE, 0xFC, 0x00, 0x18, 0x3C, 0x7E, 0x66, 0xE6, 0xCE, 0x84, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0x06, | ||
0x06, 0xFC, 0xFE, 0xFC, 0x0C, 0x06, 0x06, 0x06, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0xC0, 0xF8, | ||
0xFC, 0x4E, 0x46, 0x46, 0x46, 0x4E, 0x7C, 0x78, 0x40, 0x18, 0x3C, 0x76, 0xE6, 0xCE, 0xCC, 0x80, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x03, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, | ||
0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x0C, | ||
0x18, 0x18, 0x0C, 0x06, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x01, 0x0F, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, | ||
0x07, 0x01, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, | ||
0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x07, | ||
0x07, 0x0C, 0x0C, 0x18, 0x1C, 0x0C, 0x06, 0x06, 0x00, 0x04, 0x0E, 0x0C, 0x18, 0x0C, 0x0F, 0x07, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||
}; | ||
|
||
|
||
// the most basic function, set a single pixel | ||
void Xmega_SSD1306::drawPixel(int16_t x, int16_t y, uint16_t color) { | ||
if ((x < 0) || (x >= width()) || (y < 0) || (y >= height())) | ||
return; | ||
|
||
// check rotation, move pixel around if necessary | ||
switch (getRotation()) { | ||
case 1: | ||
swap(x, y); | ||
x = WIDTH - x - 1; | ||
break; | ||
case 2: | ||
x = WIDTH - x - 1; | ||
y = HEIGHT - y - 1; | ||
break; | ||
case 3: | ||
swap(x, y); | ||
y = HEIGHT - y - 1; | ||
break; | ||
} | ||
|
||
// x is which column | ||
if (color == WHITE) | ||
buffer[x+ (y/8)*SSD1306_LCDWIDTH] |= _BV((y%8)); | ||
else | ||
buffer[x+ (y/8)*SSD1306_LCDWIDTH] &= ~_BV((y%8)); | ||
} | ||
|
||
|
||
Xmega_SSD1306::Xmega_SSD1306(int8_t CS, int8_t RESET, int8_t DC){ | ||
cs = CS; | ||
rst = RESET; | ||
dc = DC; | ||
} | ||
|
||
|
||
void Xmega_SSD1306::begin(uint8_t vccstate) { | ||
constructor(128, 64); | ||
|
||
// set pin directions | ||
// SPI | ||
SPI.begin(); | ||
SPI.setBitOrder(MSBFIRST); | ||
SPI.setDataMode(SPI_MODE0); | ||
SPI.setClockDivider(SPI_CLOCK_DIV4); | ||
|
||
pinMode(dc, OUTPUT); | ||
pinMode(cs, OUTPUT); | ||
|
||
// Setup reset pin direction (used by both SPI and I2C) | ||
pinMode(rst, OUTPUT); | ||
digitalWrite(rst, HIGH); | ||
// VDD (3.3V) goes high at start, lets just chill for a ms | ||
delay(1); | ||
// bring reset low | ||
digitalWrite(rst, LOW); | ||
// wait 10ms | ||
delay(10); | ||
// bring out of reset | ||
digitalWrite(rst, HIGH); | ||
|
||
|
||
|
||
// Init sequence for 128x64 OLED module | ||
SPItransfer(SSD1306_DISPLAYOFF); // 0xAE | ||
SPItransfer(SSD1306_SETDISPLAYCLOCKDIV); // 0xD5 | ||
SPItransfer(0x80); // the suggested ratio 0x80 | ||
SPItransfer(SSD1306_SETMULTIPLEX); // 0xA8 | ||
SPItransfer(0x3F); | ||
SPItransfer(SSD1306_SETDISPLAYOFFSET); // 0xD3 | ||
SPItransfer(0x0); // no offset | ||
SPItransfer(SSD1306_SETSTARTLINE | 0x0); // line #0 | ||
SPItransfer(SSD1306_CHARGEPUMP); // 0x8D | ||
if (vccstate == SSD1306_EXTERNALVCC) | ||
{ SPItransfer(0x10); } | ||
else | ||
{ SPItransfer(0x14); } | ||
SPItransfer(SSD1306_MEMORYMODE); // 0x20 | ||
SPItransfer(0x00); // 0x0 act like ks0108 | ||
SPItransfer(SSD1306_SEGREMAP | 0x1); | ||
SPItransfer(SSD1306_COMSCANDEC); | ||
SPItransfer(SSD1306_SETCOMPINS); // 0xDA | ||
SPItransfer(0x12); | ||
SPItransfer(SSD1306_SETCONTRAST); // 0x81 | ||
if (vccstate == SSD1306_EXTERNALVCC) | ||
{ SPItransfer(0x9F); } | ||
else | ||
{ SPItransfer(0xCF); } | ||
SPItransfer(SSD1306_SETPRECHARGE); // 0xd9 | ||
if (vccstate == SSD1306_EXTERNALVCC) | ||
{ SPItransfer(0x22); } | ||
else | ||
{ SPItransfer(0xF1); } | ||
SPItransfer(SSD1306_SETVCOMDETECT); // 0xDB | ||
SPItransfer(0x40); | ||
SPItransfer(SSD1306_DISPLAYALLON_RESUME); // 0xA4 | ||
SPItransfer(SSD1306_NORMALDISPLAY); // 0xA6 | ||
|
||
SPItransfer(SSD1306_DISPLAYON);//--turn on oled panel | ||
} | ||
|
||
|
||
void Xmega_SSD1306::invertDisplay(uint8_t i){ | ||
if(i){ | ||
SPItransfer(SSD1306_INVERTDISPLAY); | ||
}else{ | ||
SPItransfer(SSD1306_NORMALDISPLAY); | ||
} | ||
} | ||
|
||
|
||
void Xmega_SSD1306::SPItransfer(uint8_t command){ | ||
digitalWrite(cs, HIGH); | ||
//*csport |= cspinmask; | ||
digitalWrite(dc, LOW); | ||
//*dcport &= ~dcpinmask; | ||
digitalWrite(cs, LOW); | ||
//*csport &= ~cspinmask; | ||
|
||
SPI.transfer(command); | ||
|
||
digitalWrite(cs, HIGH); | ||
*csport |= cspinmask; | ||
} | ||
|
||
|
||
// startscrollright | ||
// Activate a right handed scroll for rows start through stop | ||
// Hint, the display is 16 rows tall. To scroll the whole display, run: | ||
// display.scrollright(0x00, 0x0F) | ||
void Xmega_SSD1306::startscrollright(uint8_t start, uint8_t stop){ | ||
SPItransfer(SSD1306_RIGHT_HORIZONTAL_SCROLL); | ||
SPItransfer(0X00); | ||
SPItransfer(start); | ||
SPItransfer(0X00); | ||
SPItransfer(stop); | ||
SPItransfer(0X01); | ||
SPItransfer(0XFF); | ||
SPItransfer(SSD1306_ACTIVATE_SCROLL); | ||
} | ||
|
||
// startscrollleft | ||
// Activate a right handed scroll for rows start through stop | ||
// Hint, the display is 16 rows tall. To scroll the whole display, run: | ||
// display.scrollright(0x00, 0x0F) | ||
void Xmega_SSD1306::startscrollleft(uint8_t start, uint8_t stop){ | ||
SPItransfer(SSD1306_LEFT_HORIZONTAL_SCROLL); | ||
SPItransfer(0X00); | ||
SPItransfer(start); | ||
SPItransfer(0X00); | ||
SPItransfer(stop); | ||
SPItransfer(0X01); | ||
SPItransfer(0XFF); | ||
SPItransfer(SSD1306_ACTIVATE_SCROLL); | ||
} | ||
|
||
// startscrolldiagright | ||
// Activate a diagonal scroll for rows start through stop | ||
// Hint, the display is 16 rows tall. To scroll the whole display, run: | ||
// display.scrollright(0x00, 0x0F) | ||
void Xmega_SSD1306::startscrolldiagright(uint8_t start, uint8_t stop){ | ||
SPItransfer(SSD1306_SET_VERTICAL_SCROLL_AREA); | ||
SPItransfer(0X00); | ||
SPItransfer(SSD1306_LCDHEIGHT); | ||
SPItransfer(SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL); | ||
SPItransfer(0X00); | ||
SPItransfer(start); | ||
SPItransfer(0X00); | ||
SPItransfer(stop); | ||
SPItransfer(0X01); | ||
SPItransfer(SSD1306_ACTIVATE_SCROLL); | ||
} | ||
|
||
// startscrolldiagleft | ||
// Activate a diagonal scroll for rows start through stop | ||
// Hint, the display is 16 rows tall. To scroll the whole display, run: | ||
// display.scrollright(0x00, 0x0F) | ||
void Xmega_SSD1306::startscrolldiagleft(uint8_t start, uint8_t stop){ | ||
SPItransfer(SSD1306_SET_VERTICAL_SCROLL_AREA); | ||
SPItransfer(0X00); | ||
SPItransfer(SSD1306_LCDHEIGHT); | ||
SPItransfer(SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL); | ||
SPItransfer(0X00); | ||
SPItransfer(start); | ||
SPItransfer(0X00); | ||
SPItransfer(stop); | ||
SPItransfer(0X01); | ||
SPItransfer(SSD1306_ACTIVATE_SCROLL); | ||
} | ||
|
||
void Xmega_SSD1306::stopscroll(void){ | ||
SPItransfer(SSD1306_DEACTIVATE_SCROLL); | ||
} | ||
|
||
|
||
void Xmega_SSD1306::display(void) { | ||
SPItransfer(SSD1306_SETLOWCOLUMN | 0x0); // low col = 0 | ||
SPItransfer(SSD1306_SETHIGHCOLUMN | 0x0); // hi col = 0 | ||
SPItransfer(SSD1306_SETSTARTLINE | 0x0); // line #0 | ||
|
||
digitalWrite(cs, HIGH); | ||
//*csport |= cspinmask; | ||
digitalWrite(dc, HIGH); | ||
//*dcport |= dcpinmask; | ||
digitalWrite(cs, LOW); | ||
//*csport &= ~cspinmask; | ||
|
||
for (uint16_t i=0; i<(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8); i++) { | ||
SPI.transfer(buffer[i]); | ||
} | ||
|
||
digitalWrite(cs, HIGH); | ||
//*csport |= cspinmask; | ||
} | ||
|
||
|
||
// clear everything | ||
void Xmega_SSD1306::clearDisplay(void){ | ||
memset(buffer, 0, (SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8)); | ||
} |
Oops, something went wrong.