void Display::begin(int8_t SCLK, int8_t DIN, int8_t DC, int8_t CS, int8_t RST) {
din = DIN;
sclk = SCLK;
dc = DC;
rst = RST;
cs = CS;
cursor_y = cursor_x = 0;
textsize = 1;
color = BLACK;
bgcolor = WHITE;
wrap = true;
persistence = false;
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV8); //can be set to 4 but some random pixels will start to appear on some displays
SPI.setDataMode(SPI_MODE3);
// set pin directions
pinMode(din, OUTPUT);
pinMode(sclk, OUTPUT);
pinMode(dc, OUTPUT);
if (rst > 0)
pinMode(rst, OUTPUT);
if (cs > 0)
pinMode(cs, OUTPUT);
// toggle RST low to reset
if (rst > 0) {
digitalWrite(rst, LOW);
delay(5);
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);
// set VOP
if (contrast > 0x7f)
contrast = 0x7f;
command(PCD8544_SETVOP | contrast); // Experimentally determined
// normal mode
command(PCD8544_FUNCTIONSET);
// Set display to Normal
command(PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL);
// initial display line
// set page address
// set column address
// write display data
update();
}
void Display::command(uint8_t c) {
noInterrupts();
digitalWrite(dc, LOW);
if (cs > 0)
digitalWrite(cs, LOW);
SPI.transfer((char) c);
if (cs > 0)
digitalWrite(cs, HIGH);
interrupts();
}
void Display::data(uint8_t c) {
noInterrupts();
digitalWrite(dc, HIGH);
if (cs > 0)
digitalWrite(cs, LOW);
SPI.transfer((char) c);
if (cs > 0)
digitalWrite(cs, HIGH);
interrupts();
}
void Display::setContrast(uint8_t val) {
contrast = constrain(val, 30, 80);
/*if (contrast > 0x7f) {
contrast = 0x7f;
}*/
command(PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION);
command(PCD8544_SETVOP | contrast);
command(PCD8544_FUNCTIONSET);
}
void Display::clear(void) {
memset(_displayBuffer, 0, LCDWIDTH * LCDHEIGHT / 8);
cursor_y = cursor_x = 0;
}
void Display::fillScreen(uint8_t color) {
memset(_displayBuffer, 0xFFFF, LCDWIDTH * LCDHEIGHT / 8);
}
void Display::update(void) {
uint8_t col, maxcol, p;
for (p = 0; p < 6; p++) {
command(PCD8544_SETYADDR | p);
// start at the beginning of the row
col = 0;
maxcol = LCDWIDTH_NOROT - 1;
command(PCD8544_SETXADDR | col);
digitalWrite(dc, HIGH);
if (cs > 0)
digitalWrite(cs, LOW);
for (; col <= maxcol; col++) {
SPI.transfer(_displayBuffer[(LCDWIDTH_NOROT * p) + col]);
}
if (cs > 0)
digitalWrite(cs, HIGH);
}
command(PCD8544_SETYADDR); // no idea why this is necessary but it is to finish the last byte?
}
Return to Project Guidance & Game development
Users browsing this forum: Google [Bot] and 95 guests