淘宝上买的9.9包邮的GMG12864-03A单色LCD屏,ST7567驱动,12864分辨率,SPI接口,显示面积有33.2520.45mm,性价比还不错。但是这个屏u8g2库不支持,有一个U8G2_ST7567_OS12864_1_4W_SW_SPI,可以显示,但是直接使用显示上下颠倒,对比度有问题。好在店家提供了示例代码,按照示例代码把u8g2库改下就可以了。
找到libraries\U8g2\src\clib\u8x8_d_st7567.c文件,打开找到屏幕初始化代码。
static const uint8_t u8x8_st7567_os12864_init_seq[] = {
U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
U8X8_C(0x0e2), /* soft reset */
U8X8_C(0x0ae), /* display off */
U8X8_C(0x040), /* set display start line to 0 */
U8X8_C(0x0a1), /* ADC set to reverse */
U8X8_C(0x0c0), /* common output mode */
// Flipmode
//U8X8_C(0x0a0), /* ADC set to reverse */
//U8X8_C(0x0c8), /* common output mode */
U8X8_C(0x0a6), /* display normal, bit val 0: LCD pixel off. */
U8X8_C(0x0a3), /* LCD bias 1/7 */
/* power on sequence from paxinstruments */
U8X8_C(0x028|4), /* all power control circuits on */
U8X8_DLY(50),
U8X8_C(0x028|6), /* all power control circuits on */
U8X8_DLY(50),
U8X8_C(0x028|7), /* all power control circuits on */
U8X8_DLY(50),
U8X8_C(0x026), /* v0 voltage resistor ratio */
U8X8_CA(0x081, 50>>2), /* set contrast, contrast value*/
U8X8_C(0x0ae), /* display off */
U8X8_C(0x0a5), /* enter powersafe: all pixel on, issue 142 */
U8X8_END_TRANSFER(), /* disable chip */
U8X8_END() /* end of sequence */
};
改成如下代码。
static const uint8_t u8x8_st7567_os12864_init_seq[] = {
U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
//从这里开始修改
U8X8_C(0x0e2),
U8X8_C(0x0a6),
U8X8_C(0x0c8),
U8X8_C(0x02f),
U8X8_C(0x026),
U8X8_C(0x0a2),
U8X8_C(0x0a1),
U8X8_C(0x0f8),
U8X8_C(0x000),
U8X8_C(0x081),
U8X8_C(0x009),
U8X8_C(0x0af),
//到这里修改结束
U8X8_END_TRANSFER(), /* disable chip */
U8X8_END() /* end of sequence */
};
改好库以后打开u8g2库的Hello World示例代码,编辑如下。
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
//这里用的合宙esp32c3开发板,根据接线修改引脚定义
U8G2_ST7567_OS12864_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 2, /* data=*/ 3, /* cs=*/ 7, /* dc=*/ 6, /* reset=*/ 11);
void setup(void) {
u8g2.begin();
u8g2.setContrast(20);//这里设置对比度,自行调整,直至显示效果最佳
}
void loop(void) {
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB10_tr);
u8g2.drawStr(0,24,"Hello World!");
} while ( u8g2.nextPage() );
}
显示效果如下。