Introduction
Sample code for driving LX COG 12864R1 LCD.
NOTE
For arudino only.But it's very easy to apply on STM.To run the code, you'd better to have a Arduino Mega 2560 which can print the log.
Code
// The .ino file.// Define PINs#define CS 2#define RST 3#define DC 4#define SCL 21#define SDA 20#define setPin(pin, x) digitalWrite(pin, (x) ? HIGH : LOW)#define cs(x) setPin(CS, (x))#define reset(x) setPin(RST, (x))#define dc(x) setPin(DC, (x))#define scl(x) setPin(SCL, (x))#define sda(x) setPin(SDA, (x))void log(const char* str) { Serial.println(str);}void spi_delay(uint16_t x) { while(x > 0) { x--; }}void spi_send(uint8_t val) { for(int i = 0; i < 8; i++) { if (val & 0x80) { sda(1); } else { sda(0); } spi_delay(1); scl(1); scl(0); val <<= 1; }}void lcd_cmd(uint8_t val) { cs(0); dc(0); spi_send(val); cs(1); dc(1);}void lcd_data(uint8_t val) { cs(0); dc(1); spi_send(val); cs(1); dc(1);}void lcd_init() { log("Reset 1"); reset(1); delay(1000); log("Reset 2"); reset(0); delay(1000); log("Reset 3"); reset(1); delay(1000); log("Reset internal"); lcd_cmd(0xe2); // Internal reset lcd_cmd(0xe3); // reset signal // delay(3000); log("Display off"); lcd_cmd(0xae); // display off // delay(3000); log("ADC select"); lcd_cmd(0xa0); // ADC select lcd_cmd(0xc8); // command output select lcd_cmd(0x2f); // power control // delay(3000); // SET dir // log("Set direction"); // log("Reversed"); lcd_cmd(0xa1); //0b10100001); // Reverse // log("Normal"); lcd_cmd(0xa0); // 0b10100000); // Normal // delay(3000); log("Inverse display"); // Inverse display // log("Reversed"); lcd_cmd(0xa7); // 0b10100111); // Reverse // log("No"); lcd_cmd(0xa6); // 0b10100110); // Normal // delay(3000); log("All pixels on"); // // All pixels on // lcd_cmd(0xa5); // 0b10100101); // All on // lcd_cmd(0xa4); // 0b10100100); // Normal // delay(3000); log("Set bias"); // bias log("1/9 bias"); lcd_cmd(0xa2); //(0xa2 1/9 bias,1/65 duty ) // log("1/7 bias"); lcd_cmd(0xa3); // 1/7 // delay(3000); // log("Page blink"); // // Page Blink Page // lcd_cmd(0xd5); // lcd_cmd(0x0); // Blink all page: 0xF // delay(3000); // Ratio is a key parameter which haverily affects the invisibility. log("Select resistor ratio"); // select resistor ratio Rb/Ra: 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27 lcd_cmd(0x22); // delay(3000); log("Select volume"); lcd_cmd(0x81); // select volume // delay(3000); log("vop"); lcd_cmd(0x29); // 0x15); //0x29); // vop // delay(3000); lcd_cmd(0xf8); // x4 lcd_cmd(0x08); // x4 // delay(3000); log("Initial page"); lcd_cmd(0xb0);//set page address lcd_cmd(0x10);//set column address lcd_cmd(0x00); for(int col=0; col < 128; col++) { lcd_data(0x00); // lcd_data(0b11110000); } // delay(3000); log("Display on"); lcd_cmd(0xaf); //display on // delay(3000);}uint8_t img[] = { 0xFF,0x01,0x01,0x01,0x01,0x01,0x09,0x09,0xFD,0xFD,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0xA0,0xBF,0xBF,0xA0,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0xA0,0xBF,0xBF,0xA0,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0xA0,0xBF,0xBF,0xA0,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0xA0,0xBF,0xBF,0xA0,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0xA0,0xBF,0xBF,0xA0,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0xA0,0xBF,0xBF,0xA0,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0xA0,0xBF,0xBF,0xA0,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0xA0,0xBF,0xBF,0xA0,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0xA0,0xBF,0xBF,0xA0,0xA0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF};void lcd_display() { uint8_t* ptr = img; for(int row = 0xb0; row < 0xb8; row++) { lcd_cmd(row); lcd_cmd(0x10); lcd_cmd(0x00); for(int col = 0; col < 128; col++) { lcd_data(*ptr++); } } delay(2000);}void lcd_clean(uint8_t color = 0x00) { for(int row = 0xb0; row < 0xb8; row++) { lcd_cmd(row); lcd_cmd(0x10); lcd_cmd(0x00); for(int col = 0; col < 128; col++) { // lcd_data(0x81); // lcd_data(0x81); lcd_data(color); } } // delay(1000);}void setup() { // put your setup code here, to run once: pinMode(CS, OUTPUT); pinMode(RST, OUTPUT); pinMode(DC, OUTPUT); pinMode(SCL, OUTPUT); pinMode(SDA, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); Serial.begin(9600);}void loop() { // put your main code here, to run repeatedly: lcd_init(); uint8_t color = 0x00; while(1) { // delay(1500); digitalWrite(LED_BUILTIN, HIGH); log("Clean"); lcd_clean(color++); // if (color == 0xFE) color = 0x00; log("Display"); lcd_display(); // reset(0); delay(100); // lcd_display(); digitalWrite(LED_BUILTIN, LOW); // reset(1); delay(100); }}