U8G2库是一个开源图形库,去github上查询了支持的显示屏驱动芯片,发现没有CH1115,但是发现网上有人使用SSD1306的驱动跑起来了,于是我在SSD1306的驱动上改,事实证明可行。
首先就是修改初始化指令,在u8x8 _ssd1306_126x64_noname.c里,有一个数组u8x8_d_ssd1306_128x64_noname_init_seq,修改成如图所示,如果有其他需求,比如有其他规格的屏幕,也可以修改成对应的。想要了解更详细的可以在网上找CH1115芯片的手册。
/* more or less generic setup of all these small OLEDs */
static const uint8_t u8x8_d_ssd1306_128x64_noname_init_seq[] = {
U8X8_START_TRANSFER(), /* enable chip, delay is part of the transfer start */
U8X8_C(0xAE),
U8X8_CA(0x81, 0x30), // 亮度 00-FFH
U8X8_CA(0xA8, 0x2F), // 屏幕行数 = x+1,0x2F=47+1
U8X8_CA(0x20, 0x00), // 水平寻址/垂直寻址/页寻址 00/01/02H
U8X8_CA(0xD3, 0x08), // 屏幕偏移行数 00-3FH
U8X8_CA(0xD5, 0xA0), // 时钟分频比/振荡器频率
U8X8_CA(0xD9, 0x22), // 预充放电周期
U8X8_CA(0xDB, 0x35), // 输出电压档位 00-FFH
U8X8_CA(0xAD, 0x8B), // DCDC不使能/使能 8A/8B
U8X8_CA(0x82, 0x00), // 外部电阻
U8X8_C(0x2e), // 屏幕滚动关闭
U8X8_C(0xA2), // OLED硬件列方向 A2/A3H
U8X8_C(0x40), // 显示的起始行 40-7FH
U8X8_C(0xA0), // 行方向 A0/A1H
U8X8_C(0xC8), // 列方向 C8/C0H
U8X8_C(0xA6), // 正常/反转显示 A6/A7H
U8X8_C(0x31), // 充电泵输出电压 30-33H
U8X8_C(0xA4), // 正常/全亮 A4/A5H
U8X8_END_TRANSFER(), /* disable chip */
U8X8_END() /* end of sequence */
};
还有一个就是修改同一个文件里的另一个数组,u8x8_ssd1306_128x64_noname_display_info,配置显示参数,也是要配置屏幕对应的宽度和高度。不然,有可能会出现部分地方显示花屏的情况。
static const u8x8_display_info_t u8x8_ssd1306_128x64_noname_display_info =
{
/* chip_enable_level = */ 0,
/* chip_disable_level = */ 1,
/* post_chip_enable_wait_ns = */ 1,
/* pre_chip_disable_wait_ns = */ 1,
/* reset_pulse_width_ms = */ 1, /* SSD1306: 3 us */
/* post_reset_wait_ms = */ 1, /* far east OLEDs need much longer setup time */
/* sda_setup_time_ns = */ 1, /* SSD1306: 15ns, but cycle time is 100ns, so use 100/2 */
/* sck_pulse_width_ns = */ 1, /* SSD1306: 20ns, but cycle time is 100ns, so use 100/2, AVR: below 70: 8 MHz, >= 70 --> 4MHz clock */
/* sck_clock_hz = */ 32000000UL, /* since Arduino 1.6.0, the SPI bus speed in Hz. Should be 1000000000/sck_pulse_width_ns */
/* spi_mode = */ 0, /* active high, rising edge */
/* i2c_bus_clock_100kHz = */ 1,
/* data_setup_time_ns = */ 1,
/* write_pulse_width_ns = */ 1, /* SSD1306: cycle time is 300ns, so use 300/2 = 150 */
/* tile_width = */ 11, // pixel_width/8 = 88/8=11
/* tile_height = */ 6, // pixel_height/8 = 48/8=6
/* default_x_offset = */ 0, // 初始化的时候,已经让显示区域居中,这里就不需要再偏移了
/* flipmode_x_offset = */ 0,
/* pixel_width = */ 88, // 屏幕宽度
/* pixel_height = */ 48, // 屏幕高度
};
最后,就是按照例程调用U8G2库接口,就可以愉快的显示想要的效果了