关于c++:LX-COG-12864R1-LCD-Sample-Code

9次阅读

共计 8403 个字符,预计需要花费 22 分钟才能阅读完成。

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);
  }
}

Good Luck!

正文完
 0