#include <SPI.h>
const int csPin = 10;
const int resetPin = 4;
const int cdPin = 3;
void (*fpInitLCD)(void) = 0; // function pointer for LCD initialization
void (*fpCursor)(unsigned char row, unsigned char col) = 0; // function pointer for LCD cursor
void (*fpClearLCD)(void) = 0;
unsigned char lcdXpos = 0; // x cursor position for LCD
unsigned char lcdYpos = 0; // y cursor position for LCD
unsigned int fgColor = 0x000F; // foreground color for LCD (xRGB)
unsigned int bgColor = 0x0FFF; // background color for LCD (xRGB)// function pointer for LCD clearscreen
void setContrast_LM15(unsigned char contrast)
{
digitalWrite(cdPin, HIGH);
digitalWrite(csPin, LOW);
SPI.transfer(0xF4);
SPI.transfer(0xB0 | (contrast >> 4));
SPI.transfer(0xA0 | (contrast & 0x0F));
digitalWrite(csPin, HIGH);
}
void window_LM15(unsigned char xstart, unsigned char ystart, unsigned char xend, unsigned char yend)
{
xstart <<= 1;
xstart += 6;
xend <<= 1;
xend += 7;
digitalWrite(cdPin, HIGH);
digitalWrite(csPin, LOW);
SPI.transfer(0xF0);
SPI.transfer(0x00 | (xstart & 0x0F));
SPI.transfer(0x10 | (xstart >> 4));
SPI.transfer(0x20 | (ystart & 0x0F));
SPI.transfer(0x30 | (ystart >> 4));
SPI.transfer(0xF5);
SPI.transfer(0x00 | (xend & 0x0F));
SPI.transfer(0x10 | (xend >> 4));
SPI.transfer(0x20 | (yend & 0x0F));
SPI.transfer(0x30 | (yend >> 4));
digitalWrite(csPin, HIGH);
digitalWrite(cdPin, LOW);
}
void cursor_LM15(unsigned char row, unsigned char col)
{
window_LM15(col, row, 100, 79);
}
void draw(unsigned char value)
{
SPI.transfer(value);
}
void clearLCD_LM15(void)
{
unsigned int i;
digitalWrite(cdPin, LOW);
digitalWrite(csPin, LOW);
for(i = 0; i < 8080; i++)
{
draw(0xFF);
draw(0xFF);
}
digitalWrite(csPin, HIGH);
}
void testLCD(void)
{
unsigned int i;
setCursor(0,0);
digitalWrite(cdPin, LOW);
digitalWrite(csPin, LOW);
for(i = 0; i < 2020; i++)
{ //white
draw(0x0F);
draw(0xFF);
}
for(i = 0; i < 2020; i++)
{ //red
draw(0x0F);
draw(0x00);
}
for(i = 0; i < 2020; i++)
{ //green
draw(0x00);
draw(0xF0);
}
for(i = 0; i < 2020; i++)
{ //blue
draw(0x00);
draw(0x0F);
}
digitalWrite(csPin, HIGH);
setCursor(0,0);
}
void setCursor(unsigned char y, unsigned char x)
{
lcdXpos = x;
lcdYpos = y;
if(cursor_LM15)
{
(*cursor_LM15)(y, x);
}
}
unsigned char initData_lm15[] = {
0xF4 , 0x90 , 0xB3 , 0xA0 , 0xD0, 0xF0 , 0xE2 , 0xD4 , 0x70 , 0x66 ,
0xB2 , 0xBA , 0xA1 , 0xA3 , 0xAB , 0x94 , 0x95 , 0x95 , 0x95 , 0xF5 ,
0x90, 0xF1 , 0x00 , 0x10 , 0x22 , 0x30 , 0x45 , 0x50 , 0x68 , 0x70 ,
0x8A , 0x90 , 0xAC , 0xB0 , 0xCE , 0xD0, 0xF2 , 0x0F , 0x10 , 0x20 ,
0x30 , 0x43 , 0x50 , 0x66 , 0x70 , 0x89 , 0x90 , 0xAB , 0xB0 , 0xCD ,
0xD0, 0xF3 , 0x0E , 0x10 , 0x2F , 0x30 , 0x40 , 0x50 , 0x64 , 0x70 ,
0x87 , 0x90 , 0xAA , 0xB0 , 0xCB , 0xD0, 0xF4 , 0x0D , 0x10 , 0x2E ,
0x30 , 0x4F , 0x50, 0xF5 , 0x91, 0xF1 , 0x01 , 0x11 , 0x22 , 0x31 ,
0x43 , 0x51 , 0x64 , 0x71 , 0x86 , 0x91 , 0xA8 , 0xB1 , 0xCB , 0xD1,
0xF2 , 0x0F , 0x11 , 0x21 , 0x31 , 0x42 , 0x51 , 0x63 , 0x71 , 0x85 ,
0x91 , 0xA6 , 0xB1 , 0xC8 , 0xD1, 0xF3 , 0x0B , 0x11 , 0x2F , 0x31 ,
0x41 , 0x51 , 0x62 , 0x71 , 0x83 , 0x91 , 0xA4 , 0xB1 , 0xC6 , 0xD1,
0xF4 , 0x08 , 0x11 , 0x2B , 0x31 , 0x4F , 0x51 , 0x80 , 0x94, 0xF5 ,
0xA2 , 0xF4 , 0x60 , 0xF0 , 0x40 , 0x50 , 0xC0 , 0xF4 , 0x70};
void setup()
{
unsigned int i;
SPI.begin();
digitalWrite(resetPin, LOW);
delay(10);
digitalWrite(resetPin, HIGH);
delay(10);
digitalWrite(cdPin, HIGH);
digitalWrite(csPin, LOW);
for(i = 0; i < sizeof(initData_lm15); i++)
{
SPI.transfer(initData_lm15[i]); // send initialization data
}
delay(1);
digitalWrite(csPin, HIGH);
delay(1);
digitalWrite(csPin, LOW);
SPI.transfer(0xF0);
SPI.transfer(0x81);
SPI.transfer(0xF4);
SPI.transfer(0xB3);
SPI.transfer(0xA0);
SPI.transfer(0xF0);
SPI.transfer(0x06);
SPI.transfer(0x10);
SPI.transfer(0x20);
SPI.transfer(0x30);
SPI.transfer(0xF5);
SPI.transfer(0x0F);
SPI.transfer(0x1C);
SPI.transfer(0x2F);
SPI.transfer(0x34);
digitalWrite(csPin, HIGH);
digitalWrite(cdPin, LOW);
setContrast_LM15(30);
cursor_LM15(0,0);
clearLCD_LM15();
cursor_LM15(1,1);
testLCD();
}
void loop()
{
}