Update librairies + optimizations

loop time and memory optimization
This commit is contained in:
sinseman
2015-02-11 18:26:16 +01:00
parent 982dcb7ff9
commit 5737aff17a
20 changed files with 1400 additions and 418 deletions

View File

@@ -104,9 +104,40 @@ Adafruit_PCD8544::Adafruit_PCD8544(int8_t SCLK, int8_t DIN, int8_t DC,
_cs = -1;
}
Adafruit_PCD8544::Adafruit_PCD8544(int8_t DC, int8_t CS, int8_t RST):
Adafruit_GFX(LCDWIDTH, LCDHEIGHT) {
// -1 for din and sclk specify using hardware SPI
_din = -1;
_sclk = -1;
_dc = DC;
_rst = RST;
_cs = CS;
}
// the most basic function, set a single pixel
void Adafruit_PCD8544::drawPixel(int16_t x, int16_t y, uint16_t color) {
if ((x < 0) || (x >= _width) || (y < 0) || (y >= _height))
return;
int16_t t;
switch(rotation){
case 1:
t = x;
x = y;
y = LCDHEIGHT - 1 - t;
break;
case 2:
x = LCDWIDTH - 1 - x;
y = LCDHEIGHT - 1 - y;
break;
case 3:
t = x;
x = LCDWIDTH - 1 - y;
y = t;
break;
}
if ((x < 0) || (x >= LCDWIDTH) || (y < 0) || (y >= LCDHEIGHT))
return;
@@ -129,15 +160,34 @@ uint8_t Adafruit_PCD8544::getPixel(int8_t x, int8_t y) {
}
void Adafruit_PCD8544::begin(uint8_t contrast) {
// set pin directions
pinMode(_din, OUTPUT);
pinMode(_sclk, OUTPUT);
void Adafruit_PCD8544::begin(uint8_t contrast, uint8_t bias) {
if (isHardwareSPI()) {
// Setup hardware SPI.
SPI.begin();
SPI.setClockDivider(PCD8544_SPI_CLOCK_DIV);
SPI.setDataMode(SPI_MODE0);
SPI.setBitOrder(MSBFIRST);
}
else {
// Setup software SPI.
// Set software SPI specific pin outputs.
pinMode(_din, OUTPUT);
pinMode(_sclk, OUTPUT);
// Set software SPI ports and masks.
clkport = portOutputRegister(digitalPinToPort(_sclk));
clkpinmask = digitalPinToBitMask(_sclk);
mosiport = portOutputRegister(digitalPinToPort(_din));
mosipinmask = digitalPinToBitMask(_din);
}
// Set common pin outputs.
pinMode(_dc, OUTPUT);
if (_rst > 0)
pinMode(_rst, OUTPUT);
pinMode(_rst, OUTPUT);
if (_cs > 0)
pinMode(_cs, OUTPUT);
pinMode(_cs, OUTPUT);
// toggle RST low to reset
if (_rst > 0) {
@@ -146,20 +196,11 @@ void Adafruit_PCD8544::begin(uint8_t contrast) {
digitalWrite(_rst, HIGH);
}
clkport = portOutputRegister(digitalPinToPort(_sclk));
clkpinmask = digitalPinToBitMask(_sclk);
mosiport = portOutputRegister(digitalPinToPort(_din));
mosipinmask = digitalPinToBitMask(_din);
csport = portOutputRegister(digitalPinToPort(_cs));
cspinmask = digitalPinToBitMask(_cs);
dcport = portOutputRegister(digitalPinToPort(_dc));
dcpinmask = digitalPinToBitMask(_dc);
// get into the EXTENDED mode!
command(PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION );
// LCD bias select (4 is optimal?)
command(PCD8544_SETBIAS | 0x4);
command(PCD8544_SETBIAS | bias);
// set VOP
if (contrast > 0x7f)
@@ -187,25 +228,31 @@ void Adafruit_PCD8544::begin(uint8_t contrast) {
}
inline void Adafruit_PCD8544::fastSPIwrite(uint8_t d) {
for(uint8_t bit = 0x80; bit; bit >>= 1) {
*clkport &= ~clkpinmask;
if(d & bit) *mosiport |= mosipinmask;
else *mosiport &= ~mosipinmask;
*clkport |= clkpinmask;
inline void Adafruit_PCD8544::spiWrite(uint8_t d) {
if (isHardwareSPI()) {
// Hardware SPI write.
SPI.transfer(d);
}
else {
// Software SPI write with bit banging.
for(uint8_t bit = 0x80; bit; bit >>= 1) {
*clkport &= ~clkpinmask;
if(d & bit) *mosiport |= mosipinmask;
else *mosiport &= ~mosipinmask;
*clkport |= clkpinmask;
}
}
}
inline void Adafruit_PCD8544::slowSPIwrite(uint8_t c) {
shiftOut(_din, _sclk, MSBFIRST, c);
bool Adafruit_PCD8544::isHardwareSPI() {
return (_din == -1 && _sclk == -1);
}
void Adafruit_PCD8544::command(uint8_t c) {
digitalWrite(_dc, LOW);
if (_cs > 0)
digitalWrite(_cs, LOW);
fastSPIwrite(c);
spiWrite(c);
if (_cs > 0)
digitalWrite(_cs, HIGH);
}
@@ -214,7 +261,7 @@ void Adafruit_PCD8544::data(uint8_t c) {
digitalWrite(_dc, HIGH);
if (_cs > 0)
digitalWrite(_cs, LOW);
fastSPIwrite(c);
spiWrite(c);
if (_cs > 0)
digitalWrite(_cs, HIGH);
}
@@ -242,7 +289,7 @@ void Adafruit_PCD8544::display(void) {
}
if (yUpdateMax < p*8) {
break;
}d
}
#endif
command(PCD8544_SETYADDR | p);
@@ -263,9 +310,7 @@ void Adafruit_PCD8544::display(void) {
if (_cs > 0)
digitalWrite(_cs, LOW);
for(; col <= maxcol; col++) {
//uart_putw_dec(col);
//uart_putchar(' ');
fastSPIwrite(pcd8544_buffer[(LCDWIDTH*p)+col]);
spiWrite(pcd8544_buffer[(LCDWIDTH*p)+col]);
}
if (_cs > 0)
digitalWrite(_cs, HIGH);