12864屏与ESP8266应用笔记
本帖最后由 bomb 于 2019-1-4 20:22 编辑花了好几天研究12864和8266,终于驯服了这几个模块,中间遇到了不少问题,特写下本文,一来备忘,二来抛砖引玉,有什么不足不对的地方还望坛友们批评建议。
10.96寸 IIC 12864 OLED显示屏模块
手头这块oled12864主控芯片为SSD1306,IIC通讯,有四个引脚,分别是VCC电源,GND接地,SCL时钟和SDA信号。
1.1 oled12864与arduino
arduino使用u8g2库的话驱动起来十分简单,arduino的A4和A5引脚分别对应SDA和SCL,只要接好对应引脚,随意打开u8g2的一个例程将U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
前的注释去掉,上传即可。(注:上传完毕后必须重启arduino才能显示)
1.2 oled12864与ESP8266
由于ESP8266可以使用arduino的IDE所以用法和uno无异,手头刚好有一块ESP8266-12,这次我改用Adafruit_ssd1306syp这个库(库文件见附件),该库是专为ssd1306写的,而且可以在代码处自定义SDA和SCL不用修改库文件,使用十分方便。(注:使用ESP8266-12一般不会用串口连12864,这样接只是我在试验串口能不能驱动12864)
8266-12管脚图如下
当然ESP8266-01也能驱动12864,但是ESP8266-01只有2个IO管脚,分别是GPIO0和GPIO2,其中GPIO0用于下载不能使用,而驱动12864OLED使用IIC通讯的话需要至少两个管脚,SCL和SDA。 不过如果不使用串口通讯的话,我们可以利用RX和TX口,TX对应内部管脚GPIO1,RX对应内部管脚GPIO3;我们在和12864通讯的时候,可以直接使用这两个管脚,只需要把SCL定义为1,SDA定义为3即可。这里我花了一晚上才成功,犯了两个错误:一是忘记将CH_PD拉高结果8266不工作;二是连接的杜邦线质量差,信号不稳定,换了好几根才解决。
烧录ESP8266-01用的是某宝烂大街的8266转接器,烧录时GPIO0必须接地,但是这个转接器没有这个功能,所以我在两个引脚接口之间加了根铜丝做桥,再把8266插上去就能成功烧录了。
连接图如下:
以下为示例代码:
#include <Adafruit_ssd1306syp.h>
#define SDA_PIN 3
#define SCL_PIN 1
Adafruit_ssd1306syp display(SDA_PIN,SCL_PIN);
void setup()
{
delay(1000);
display.initialize();
}
void loop()
{
display.drawLine(0, 0, 127, 63,WHITE);
display.update();
delay(1000);
display.clear();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Hello, world!");
display.setTextColor(BLACK, WHITE); // 'inverted' text
display.println(5201314);
display.setTextSize(2);
display.setTextColor(WHITE);
display.print("0x"); display.println(0xFFFFFFFF, HEX);
display.update();
delay(2000);
display.clear();
}
212864点阵 COB SPI模块
除了上述OLED屏外,手头还有一块COB屏,13个引脚,带中文字库,不过目前只研究到普通的SPI方式驱动。
2.1 引脚判别
当时需要这个尺寸的屏幕就买了,没想到店家不提供任何资料(说没有还说得理直气壮我也是无语了)一切只能自己摸索,从为数不多的信息得知,该模块的驱动IC是ST7565R。本以为SPI模式引脚都差不多,但是拿到这个模块我就犯迷糊了,一个CS,一个RS您俩哪个是片选啊。
后来在网上查了些资料,才发现SPI引脚的命名那叫一个混乱,大致总结如下,大家感受一下。
名称 符号 功能
片选CS、RS 低电平有效
复位 RSE 低电平复位
数据/指令选择
A0、DC、RSH:数据,L:指令
时钟SCK、SCL、 D0、CLK、E 串行时钟信号
数据SDA、D1、SI、MOSI 、DATA、R\W 串行数据信号
电源正极VDD、VCC输入电源
电源负极 VSS、GND 电源地
可以发现,RS即用来表示片选,也用来表示数据/命令选择,但是,CS一定是片选,以这个规律,我使用u8g2库,按以下对应接线
SCL—>clock
SI—>data
CS—>cs
RS—>dc
RSE—>reset
如此接线后写入u8g2例程屏幕就能显示了。经我测试该模块使用
U8X8_ST7565_NHD_C12864_4W_SW_SPI u8x8(/* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
显示效果最好。
2.2 调整V0电压
解决引脚问题后又遇到一个新问题,液晶显示很淡,一般12864对比度是通过调整V0引脚电压控制的,但SPI屏没有V0引脚,需要修改u8g2库里的参数。
如果u8g2是通过arduino库管理器安装的话,打开路径C:\Users\administrator\Documents\Arduino\libraries\U8g2\src\clib就能找到对应的c语言文件。
st7565对应的的是:u8x8_d_st7565.c。
打开后找到对应的常数赋值,我上面用的是ST7565_NHD_C12864,所以找到
static const uint8_t u8x8_d_st7565_nhd_c12864_init_seq[],发现里面有一条代码
U8X8_C(0x024),/* set V0 voltage resistor ratio to large*/
这里可以设置V0,加大括号里的16进制数就能让屏幕颜色变浓。
完整代码如下,还有很多可以设置的地方以后慢慢研究:
static const uint8_t u8x8_d_st7565_nhd_c12864_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(0x0a2), /* LCD bias 1/9 */
U8X8_C(0x02f), /* all powercontrol circuits on */
U8X8_CA(0x0f8, 0x000), /* set booster ratio to 4x */
U8X8_C(0x024), /* set V0 voltage resistor ratio to large调整对比度*/
U8X8_CA(0x081, 180), /* set contrast, contrast value NHD C12864, see issue 186, increased contrast to 180 (issue 219) */
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 */
};
楼主你好,问下Adafruit_ssd1306syp库可以显示中文吗?
楼主你好,问下Adafruit_ssd1306syp库怎么不可以绘图呀】 djnz 发表于 2020-3-10 10:57
楼主你好,问下Adafruit_ssd1306syp库怎么不可以绘图呀】
可以的,你打开Adafruit_GFX.h文件,里面都有定义
drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
uint16_t color),
fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
int16_t delta, uint16_t color),
drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
int16_t x2, int16_t y2, uint16_t color),
fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
int16_t x2, int16_t y2, uint16_t color),
drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
int16_t radius, uint16_t color),
fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
int16_t radius, uint16_t color),
drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap,
int16_t w, int16_t h, uint16_t color),
drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,
uint16_t bg, uint8_t size),
setCursor(int16_t x, int16_t y),
setTextColor(uint16_t c),
setTextColor(uint16_t c, uint16_t bg),
setTextSize(uint8_t s),
setTextWrap(boolean w),
setRotation(uint8_t r);
页:
[1]