Help further reduce overdriving display inputs

(and fixed a few spelling errors in comments)
- Use fast pin change macros for RESET, SS and DC.
- Implement MVSPI.packetBegin() and MVSPI.packetEnd() to allow sending
  multiple byte "packets" while SS remains enabled.
- Add 2 and 3 byte command() functions to send multiple command bytes in
  one packet.
- Modify clear() and display() functions to send commands and data in
  packets.
- Do the "wait for SPI transfer complete" just before sending the next
  byte (plus after the last or only byte) in a packet, so code can be
  executed while bytes are being sent.
- Disable SPI mode when not transmitting, so MOSI (and SCK) will go low.
- Keep DC low except when sending data bytes.
- Change MVSPI.transfer() to void since nothing can be received from
  the display.
This commit is contained in:
Scott Allen
2014-07-30 19:28:39 -04:00
parent fa09bdd7aa
commit 499594d9de
2 changed files with 167 additions and 142 deletions

View File

@@ -26,12 +26,12 @@
#define OLEDPWR 4 // 3.3V regulator enable
#define DC 8
// Port and bit mappings for DC, RESET, SS
// ** These are CPU dependent **
#define DCPORT PORTB
#define DCDDR DDRB
#define DCBIT 0
#define RESET 7
#define RESETPORT PORTD
#define RESETDDR DDRD
#define RESETBIT 7
@@ -40,20 +40,21 @@
#define SSDDR DDRB
#define SSBIT 2
// Macros to quickly set DC, RESET, SS
// A HIGH sets the signal to input mode with the internal pullup enabled
#define DCHIGH ((DCPORT |= _BV(DCBIT)), (DCDDR &= ~_BV(DCBIT)))
#define DCLOW ((DCPORT &= ~_BV(DCBIT)), (DCDDR |= _BV(DCBIT)))
#define RESETHIGH ((RESETPORT |= _BV(RESETBIT)), (RESETDDR &= ~_BV(RESETBIT)))
#define RESETLOW ((RESETPORT &= ~_BV(RESETBIT)), (RESETDDR |= _BV(RESETBIT)))
// SS, SCK, MOSI already defined by original pins_arduino.h
//#define CS 10
//#define SCK 13
//#define MOSI 11
#define SSHIGH ((SSPORT |= _BV(SSBIT)), (SSDDR &= ~_BV(SSBIT)))
#define SSLOW ((SSPORT &= ~_BV(SSBIT)), (SSDDR |= _BV(SSBIT)))
// SCK, MOSI already defined by original pins_arduino.h
//#define SCK 13
//#define MOSI 11
#define BLACK 0
#define WHITE 1
@@ -86,6 +87,9 @@
#define SETMULTIPLEX 0xA8
#define SETLOWCOLUMN 0x00
#define SETHIGHCOLUMN 0x10
#define SETPAGE 0xB0
#define SETCOLUMNBOUNDS 0x21
#define SETPAGEBOUNDS 0x22
#define SETSTARTLINE 0x40
#define MEMORYMODE 0x20
#define COMSCANINC 0xC0
@@ -141,6 +145,8 @@ public:
// RAW LCD functions
void command(uint8_t c);
void command(uint8_t c1, uint8_t c2);
void command(uint8_t c1, uint8_t c2, uint8_t c3);
void data(uint8_t c);
void setColumnAddress(uint8_t add);
void setPageAddress(uint8_t add);
@@ -199,10 +205,6 @@ public:
void doCmd(uint8_t index);
private:
//uint8_t cs;
//volatile uint8_t *mosiport, *sckport;
volatile uint8_t *ssport, *dcport, *ssreg, *dcreg; // use volatile because these are fixed location port address
uint8_t mosipinmask, sckpinmask, sspinmask, dcpinmask;
uint8_t foreColor,drawMode,fontWidth, fontHeight, fontType, fontStartChar, fontTotalChar, cursorX, cursorY;
uint16_t fontMapWidth;
//unsigned char *fontsPointer[TOTALFONTS];
@@ -282,8 +284,17 @@ private:
class MVSPIClass {
public:
/** \brief Wait for SPI serial transfer complete. */
inline static void wait();
/** \brief Transfer data byte via SPI port. */
inline static byte transfer(byte _data);
inline static void transfer(byte _data);
/** \brief Set up to begin a SPI packet transmit */
static void packetBegin();
/** \brief End a SPI packet transmit */
static void packetEnd();
// SPI Configuration methods
@@ -300,11 +311,13 @@ public:
extern MVSPIClass MVSPI;
byte MVSPIClass::transfer(byte _data) {
SPDR = _data;
void MVSPIClass::wait() {
while (!(SPSR & _BV(SPIF)))
;
return SPDR;
}
void MVSPIClass::transfer(byte _data) {
SPDR = _data;
}
void MVSPIClass::attachInterrupt() {