#include <TinyWireM.h>
// Pins
int const sda = 0;
int const scl = 2;
// Constants
int const address = 60;
int const commands = 0x00;
int const onecommand = 0x80;
int const data = 0x40;
int const onedata = 0xC0;
#define ADDRESS 0x3C
// OLED display **********************************************
// Write a single command
void Single (uint8_t x) {
TinyWireM.write(onecommand);
TinyWireM.write(x);
}
void InitDisplay () {
TinyWireM.beginTransmission(address);
TinyWireM.write(commands);
TinyWireM.write(0xA1); // Flip horizontal
TinyWireM.write(0xAF); // Display on
TinyWireM.endTransmission();
}
void ClearDisplay () {
for (int p = 0 ; p < 8; p++) {
TinyWireM.beginTransmission(address);
Single(0xB0 + p);
TinyWireM.endTransmission();
for (int q = 0 ; q < 8; q++) {
TinyWireM.beginTransmission(address);
TinyWireM.write(data);
for (int i = 0 ; i < 20; i++) TinyWireM.write(0);
TinyWireM.endTransmission();
}
}
}
// Plot point x,y into buffer if in current slice
void PlotPoint (int x, int y, int mode) {
TinyWireM.beginTransmission(address);
Single(0x00 + ((x + 2) & 0x0F)); // Column low nibble
Single(0x10 + ((x + 2)>>4)); // Column high nibble
Single(0xB0 + (y >> 3)); // Page
Single(0xE0); // Read modify write
TinyWireM.write(onedata);
TinyWireM.endTransmission();
TinyWireM.requestFrom(address, 2);
TinyWireM.read(); // Dummy read
int j = TinyWireM.read();
TinyWireM.beginTransmission(address);
TinyWireM.write(onedata);
// TinyWireM.write((1<<(y & 0x07)) | j); // full block 4x4 pixels ----------------------------
Single(0xEE); // Cancel read modify write
TinyWireM.endTransmission();
}
/*
// Plot point (SSD1306): x (0 to 127), y (0 to 63), mode (0 = point, 1 = histogram)
void PlotPoint (int x, int y, int mode) {
TinyWireM.beginTransmission(address);
TinyWireM.write(commands);
TinyWireM.write(0x21); TinyWireM.write(x); TinyWireM.write(x); // Column range
TinyWireM.write(0x22); TinyWireM.write(0); TinyWireM.write(7); // Page range
TinyWireM.endTransmission();
TinyWireM.beginTransmission(address);
TinyWireM.write(data);
for (int i=0; i<8; i++) {
if (y > 7) TinyWireM.write(- mode);
else if (y < 0) TinyWireM.write(0);
else TinyWireM.write((1<<y) - mode);
y = y - 8;
}
TinyWireM.endTransmission();
} */
// Draw crossTinyWireMs
void Cross () {
for (int x=0; x<126; x++) PlotPoint(x, 32, 0);
delay(500);
ClearDisplay();
for (int y=0; y<63; y++) PlotPoint(8, y, 0);
delay(1000);
ClearDisplay();
}
const uint8_t BALL[8][8] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x18, 0x3F, 0x66, 0x66, 0x3F, 0x18, 0x00},
{0x00, 0x3F, 0x66, 0xFF, 0xFF, 0x66, 0x3F, 0x00},
{0x00, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x00},
{0x00, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x00},
{0x00, 0x3F, 0x66, 0xFF, 0xFF, 0x66, 0x3F, 0x00},
{0x00, 0x18, 0x3F, 0x66, 0x66, 0x3F, 0x18, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
};
int x = 0;
int y = 0;
int dx = 1;
int dy = 1;
void setup() {
TinyWireM.begin();
InitDisplay();
Cross();
delay(1000);
ClearDisplay();
}
void loop() {
ClearDisplay();
// Draw image
for (int p = 0; p < 8; p++) {
TinyWireM.beginTransmission(ADDRESS);
TinyWireM.write(0xB0 + p + y); // Page address
TinyWireM.write(0x00); // Column address
TinyWireM.write(0x10); // Column address
for (int q = 0; q < 4; q++) {
TinyWireM.write(BALL[p][q]);
}
TinyWireM.endTransmission();
}
// Update position
x += dx;
y += dy;
// Bounce off edges
if (x < 0 || x > 3) dx = -dx;
if (y < 0 || y > 3) dy = -dy;
delay(50);
}
/*
#include <TinyWireM.h>
// Constants
#define ADDRESS 0x3C
const uint8_t LETTER_A[4][4] = {
0x0E, 0x0A, 0x0A, 0x0E,
0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11,
0x0E, 0x0A, 0x0A, 0x0E
};
int x = 0;
int y = 0;
int dx = 1;
int dy = 1;
void setup() {
TinyWireM.begin();
delay(100);
// Initialize OLED display
TinyWireM.beginTransmission(ADDRESS);
TinyWireM.write(0x00); // Command mode
TinyWireM.write(0xAE); // Display off
TinyWireM.write(0xD5); // Clock divide ratio
TinyWireM.write(0x80); // Clock divide ratio
TinyWireM.write(0xA8); // Multiplex ratio
TinyWireM.write(0x3F); // Multiplex ratio
TinyWireM.write(0xD3); // Display offset
TinyWireM.write(0x00); // Display offset
TinyWireM.write(0x40); // Display start line
TinyWireM.write(0x8D); // Charge pump
TinyWireM.write(0x14); // Charge pump
TinyWireM.write(0xA1); // Segment remap
TinyWireM.write(0xC8); // COM output scan direction
TinyWireM.write(0xDA); // COM pins hardware configuration
TinyWireM.write(0x12); // COM pins hardware configuration
TinyWireM.write(0x81); // Contrast control
TinyWireM.write(0xCF); // Contrast control
TinyWireM.write(0xD9); // Pre-charge period
TinyWireM.write(0xF1); // Pre-charge period
TinyWireM.write(0xDB); // VCOMH deselect level
TinyWireM.write(0x40); // VCOMH deselect level
TinyWireM.write(0xA4); // Entire display on
TinyWireM.write(0xA6); // Inverse display off
TinyWireM.write(0xAF); // Display on
TinyWireM.endTransmission();
delay(100);
}
void loop() {
// Clear display
for (int p = 0 ; p < 4; p++) {
TinyWireM.beginTransmission(ADDRESS);
TinyWireM.write(0xB0 + p); // Page address
TinyWireM.write(0x00); // Column address
TinyWireM.write(0x10); // Column address
for (int q = 0 ; q < 4; q++) {
TinyWireM.write(0x00); // Data
}
TinyWireM.endTransmission();
}
// Draw image
for (int p = 0; p < 4; p++) {
TinyWireM.beginTransmission(ADDRESS);
TinyWireM.write(0xB0 + p + y); // Page address
TinyWireM.write(0x00); // Column address
TinyWireM.write(0x10); // Column address
for (int q = 0; q < 4; q++) {
TinyWireM.write(LETTER_A[p][q]);
}
TinyWireM.endTransmission();
}
// Update position
x += dx;
y += dy;
// Bounce off edges
if (x < 0 || x > 3) dx = -dx;
if (y < 0 || y > 3) dy = -dy;
delay(50);
}
*/