extract constructor and remove SPI conditions from official library

This commit is contained in:
Adrien Marquès 2020-05-30 19:10:34 +02:00
parent b68416af99
commit 5c2bedd10f
Signed by: xdrm-brackets
GPG Key ID: D75243CA236D825E
2 changed files with 143 additions and 0 deletions

121
twinmax/display.cpp Normal file
View File

@ -0,0 +1,121 @@
#include <Arduino.h>
#include <string.h>
#include "display.h"
#include <Wire.h>
#define WIRE_MAX 32
#define TRANSACTION_START wire->setClock(400000UL);
#define TRANSACTION_END wire->setClock(100000UL);
void temporary(){
const uint8_t resetPin = 4;
// Adafruit_SSD1306 display(width, height, &Wire, resetPin);
Display display(resetPin);
// / address for I2C 128x32
// display.begin(SSD1306_SWITCHCAPVCC, 0x3C)
// display.clearDisplay();
// display.drawPixel(x, y, SSD1306_WHITE)
// display.drawPixel(x, y, SSD1306_BLACK)
}
void Display::send_command(const uint8_t c){
_wire->beginTransmission(_i2caddr);
_wire->write((uint8_t) 0x00);
_wire->write(c);
_wire->endTransmission();
}
void Display::send_commands(const uint8_t *cc, const uint8_t n){
_wire->beginTransmission(_i2caddr);
_wire->write((uint8_t) 0x00);
_wire->write(c);
_wire->endTransmission();
uint8_t written = 1;
while(n--){
if( written >= WIRE_MAX ){
_wire->endTransmission();
_wire->beginTransmission(_i2caddr);
_wire->write((uint8_t) 0x00);
written = 1;
}
_wire->write(pgm_read_byte(cc++));
written++;
}
_wire->endTransmission();
}
void Display::Display(const resetPin){
_rstPin = resetPin;
_wire = &Wire;
_wire.begin();
// reset sequence
if( _rstPin >= 0 ){
pinMode(rstPin, OUTPUT);
digitalWrite(rstPin, HIGH);
delay(1);
digitalWrite(rstPin, LOW);
delay(10);
digitalWrite(rstPin, HIGH);
}
TRANSACTION_START
// init sequence
static const uint8_t PROGMEM init1[] = {
DSP_DISPLAYOFF,
DSP_SETDISPLAYCLOCKDIV,
0x80, // suggested ratio
DSP_SETMULTIPLEX
};
send_commands(init1, sizeof(init1));
send_command(_height - 1);
static const uint8_t PROGMEM init2[] = {
DSP_SETDISPLAYOFFSET,
0x0,
DSP_SETSTARTLINE | 0x0,
DSP_CHARGEPUMP
};
sendcommands(init2, sizeof(init2));
send_command(0x14);
static const uint8_t PROGMEM init3[] = {
DSP_MEMORYMODE,
0x00,
DSP_SEGREMAP | 0x1,
DSP_COMSCANDEC
};
sendcommands(init3, sizeof(init3));
sendcommand(DSP_SETCOMPINS);
sendcommand(_comPin);
sendcommand(DSP_SETCONTRAST);
sendcommand(_contrast);
send_command(DSP_SETPRECHARGE);
send_command(0xF1);
static const uint8_t PROGMEM init5[] = {
DSP_SETVCOMPDETECT,
0x40,
DSP_DISPLAYALLON_RESUME,
DSP_NORMALDISPLAY,
DSP_DEACTIVATE_SCROLL,
DSP_DISPLAY_ON
};
sendcommands(init5, sizeof(init5));
TRANSACTION_END
return;
}

22
twinmax/display.h Normal file
View File

@ -0,0 +1,22 @@
#ifndef _DISPLAY_H_DEF_
#define _DISPLAY_H_DEF_
class Display {
public:
void Display(const uint8_t width=128, const uint8_t height=32, const resetPin=-1);
void begin();
protected:
void send_command(const uint8_t c);
void send_commands(const uint8_t *cc, const uint8_t n);
private:
const uint8_t _width { 128 };
const uint8_t _height { 32 };
const uint8_t _comPin { 0x02 };
const uint8_t _i2caddr { 0x3C };
const uint8_t _contrast { 0x8F };
uint8_t _rstPin { -1 };
TwoWire* _wire { nullptr };
};
#endif