目录
介绍
OLED 模块
上图中所示的OLED模块是市场上非常流行的模块。
市场上有许多该模块的变体,具有不同的分辨率,通信协议或像素颜色。
这些OLED模块由SSD1306 IC驱动,后者是128×64点阵式OLED段的驱动IC。SSD1306拥有自己的控制器,支持SPI和I2C通信协议。因此,市场上有各种OLED模块,一些仅支持SPI通信,一些仅支持I2C通信,一些支持I2C和SPI通信。(不同模块的引脚数量不同)
由于驱动器IC支持128×64分辨率,因此有些变体的分辨率较低,如128×32。
不同的模块支持不同的颜色,如蓝色,黄色,白色。一些模块也支持多种颜色。您需要检查显示模块的规格,以了解支持的颜色。
我们使用的是4针I2C支持的128×64 OLED模块,类似于上图所示。
引脚说明
上图显示了基于128×64 I2C的OLED模块。
VCC: 这是模块的电源引脚。可以为此引脚提供3.3V或5V电源,为显示器供电。
GND: 这是模块的接地引脚。
SCL和SDA: 这些是用于I2C通信的串行时钟和串行数据引脚。
电路连接图
OLED与MSP-EXP430G2 TI Launchpad连接
重要提示: MSP-EXP430G2 TI Launchpad的SCL和SDA分别位于引脚14(P1_6)和15(P1_7)上。Energia IDE利用基于软件的I2C实现(twi_sw)为MSP-EXP430G2 TI Launchpad。这种基于软件的I2C实现通过引脚9(P2_1)和10(P2_2)定义为SCL和SDA引脚。因此,我们需要将这些引脚用于Energia的I2C功能(在大多数库中使用),以便在MSP-EXP430G2 TI Launchpad板上工作。这已在Energia 17和18上完成(我们尚未检查IDE的早期版本)。
所有Launchpad主板都不是这种情况。这样做是为了使TI提供的助推器包适用于所有的发射台。
注意:这里,我们使用了MSP-EXP430G2板的硬件I2C引脚。硬件I2C实现比软件I2C实现更快。对于硬件I2C,很容易将I2C速度从100 kHz更改为更高的速度(101-400 kHz)。对于软件I2C,实现相同并不容易。
需要更高的速度,以便以更快的速率清除OLED,并且图像之间的过渡更平滑。
为了使用硬件I2C引脚,需要对Energia中的某些文件进行一些更改。还需要对以更高速度使用硬件I2C进行一些更改。
用于将默认I2C从软件I2C更改为硬件I2C
- 在Energia IDE文件夹中找到名为pins_energia.h的文件。
- 我们在D驱动器中将Energia IDE解压缩到一个名为TI_Launchpad_MSP430G2的文件夹中。找到MSP-EXP430G2553LP的pins_energia.h文件,如下面的路径所示。
- D:\TI_Launchpad_MSP430G2\energia-1.6.10E18\hardware\energia\msp430\cores\msp430
- 同样,在IDE的文件夹中找到该文件。
- 在pins_energia.h文件中,查找
#define DEFAULT_I2C -1
并替换它#define DEFAULT_I2C 0
- 在再次上载草图之前需要保存文件以使更改生效。
- (使用find选项并在文件中搜索DEFAULT_I2C,而不是搜索整个文件。此定义只有一个实例,因此找到它时应该没有问题。)
如果使用上面给出的接口图,下面给出的草图现在将完美地工作。
如果使用软件I2C(未进行上述更改),则必须分别使用引脚9(P2_1)和10(P2_2)作为SCL和SDA引脚。即使在这种情况下,草图也会起作用,但与使用硬件I2C时相比,图像之间的转换和显示的清除将不会那么快速和平滑。
用于将硬件I2C速度更改为100kHz以上(最大400kHz)
通过使用上面提到的硬件I2C,您可以在图像之间获得平滑和快速的过渡以及快速清除图像。
通过提高硬件I2C的速度,可以做得更好。
- 在Energia IDE文件夹中找到名为twi.h的文件。
- 在IDE中的两个不同文件夹中有2个具有此名称的文件。按照下面路径中给出的文件夹结构查找要编辑的文件。
- 我们在D驱动器中将Energia IDE解压缩到一个名为TI_Launchpad_MSP430G2的文件夹中。可以找到要编辑的twi.h文件,如下面的路径所示。
- D:\TI_Launchpad_MSP430G2\energia-1.6.10E18\hardware\energia\msp430\cores\msp430
- 同样在IDE的文件夹中找到该文件。
- 在twi.h文件中,查找
#define TWI_FREQ 100000L
并替换它#define TWI_FREQ 400000L
(400000L是最大值,您甚至可以使用较小的值,如200000L) - 在再次上载草图之前需要保存文件以使更改生效。
- (使用find选项并在文件中搜索TWI_FREQ而不是搜索整个文件。此定义只有一个实例,因此找到它时应该没有问题。)
上传程序后,您可以在进行此更改后看到速度的差异。
例
在SSD1306 OLED显示屏上显示文本和图像。
在这里,我们将在SSD1306 OLED显示屏上显示简单文本,然后显示一些将在循环中显示的图像。
用于OLED的程序
#include <Wire.h>
#include "Font.h"
#include <string.h>
#include "images.h"
#define OLED_Write_Address 0x3C
void OLED_Data(char *DATA) /* Function for sending data to OLED */
{int len = strlen(DATA);
for (int g=0; g<len; g++)
{ for (int index=0; index<5; index++)
{
Wire.beginTransmission(OLED_Write_Address); /* Begin transmission to slave device */
/* Queue data to be transmitted */
Wire.write(0x40); /* For Data Transmission, C = 0 and D/C = 1 */
Wire.write(ASCII[DATA[g] - 0x20][index]);
Wire.endTransmission(); /* Transmit the queued bytes and end transmission to slave device */
}
}
}
void OLED_Command(char DATA) /* Function for sending command to OLED */
{
Wire.beginTransmission(OLED_Write_Address); /* Begin transmission to slave device *//* Queue data to be transmitted */
Wire.write(0x00); /* For Data Transmission, C = 0 and D/C = 0 */
Wire.write(DATA);
Wire.endTransmission(); /* Transmit the queued bytes and end transmission to slave device */
}
void OLED_clear(void) /* Function for clearing OLED */
{
OLED_setXY(0x00, 0x7F, 0x00, 0x07); /* Column Start Address 0, Column End Address 127, Page Start Address 0, Page End Address 7 */for (int k=0; k<=1023; k++)
{
Wire.beginTransmission(OLED_Write_Address); /* Begin transmission to slave device */
/* Queue data to be transmitted */
Wire.write(0x40); /* For Data Transmission, C = 0 and D/C = 1 */
Wire.write(0x00);
Wire.endTransmission(); /* Transmit the queued bytes and end transmission to slave device */
}
}
void OLED_setXY(char col_start, char col_end, char page_start, char page_end) /* Function for setting cursor for writing data */
{
Wire.beginTransmission(OLED_Write_Address); /* Begin transmission to slave device *//* Queue data to be transmitted */
Wire.write(0x00); /* For Data Transmission, C = 0 and D/C = 0 */
Wire.write(0x21); /* Set Column Start and End Address */
Wire.write(col_start); /* Column Start Address col_start */
Wire.write(col_end); /* Column End Address col_end */
Wire.write(0x22); /* Set Page Start and End Address */
Wire.write(page_start); /* Page Start Address page_start */
Wire.write(page_end); /* Page End Address page_end */
Wire.endTransmission(); /* Transmit the queued bytes and end transmission to slave device */
}
void OLED_init(void) /* Function for initializing OLED */
{
OLED_Command(0xAE); /* Entire Display OFF */
OLED_Command(0xD5); /* Set Display Clock Divide Ratio and Oscillator Frequency */
OLED_Command(0x80); /* Default Setting for Display Clock Divide Ratio and Oscillator Frequency that is recommended */
OLED_Command(0xA8); /* Set Multiplex Ratio */
OLED_Command(0x3F); /* 64 COM lines */
OLED_Command(0xD3); /* Set display offset */
OLED_Command(0x00); /* 0 offset */
OLED_Command(0x40); /* Set first line as the start line of the display */
OLED_Command(0x8D); /* Charge pump */
OLED_Command(0x14); /* Enable charge dump during display on */
OLED_Command(0x20); /* Set memory addressing mode */
OLED_Command(0x00); /* Horizontal addressing mode */
OLED_Command(0xA1); /* Set segment remap with column address 127 mapped to segment 0 */
OLED_Command(0xC8); /* Set com output scan direction, scan from com63 to com 0 */
OLED_Command(0xDA); /* Set com pins hardware configuration */
OLED_Command(0x12); /* Alternative com pin configuration, disable com left/right remap */
OLED_Command(0x81); /* Set contrast control */
OLED_Command(0x80); /* Set Contrast to 128 */
OLED_Command(0xD9); /* Set pre-charge period */
OLED_Command(0xF1); /* Phase 1 period of 15 DCLK, Phase 2 period of 1 DCLK */
OLED_Command(0xDB); /* Set Vcomh deselect level */
OLED_Command(0x20); /* Vcomh deselect level ~ 0.77 Vcc */
OLED_Command(0xA4); /* Entire display ON, resume to RAM content display */
OLED_Command(0xA6); /* Set Display in Normal Mode, 1 = ON, 0 = OFF */
OLED_Command(0x2E); /* Deactivate scroll */
OLED_Command(0xAF); /* Display on in normal mode */
}
void OLED_image(const unsigned char *image_data) /* Function for sending image data to OLED */
{
OLED_setXY(0x00, 0x7F, 0x00, 0x07);
for (int k=0; k<=1023; k++)
{
Wire.beginTransmission(OLED_Write_Address); /* Begin transmission to slave device */
/* Queue data to be transmitted */
Wire.write(0x40); /* For Data Transmission, C = 0 and D/C = 1 */
Wire.write(image_data[k]);
Wire.endTransmission(); /* Transmit the queued bytes and end transmission to slave device */
}
}
余下程序:
MSP-EXP430G2ET也是同样的操作吗,开发板盖帽跟OLED上有需要动的吗
看看MSP-EXP430G2ET的引脚功能,是IIC引脚就不用变动,也是可以的
软件I2C和硬件I2C都试过了,OLED还是没反应;是不是要改写一下OLED_Init初始化那段程序?
你试着改一下吧!我现在手上没这个板子了,不然我试试看
OLED_setXY(char col_start, char col_end, char page_start, char page_end)这四个参数分别代表什么
这是显示的列开始地址、列结束地址、页开始地址、页结束地址
也可以理解为行和列显示的位置
大佬,用Energia开发430可以添加OLED库吗?没有找到教程?
你瞅瞅这个库:https://github.com/battosai30/Oled_SSD1306
大佬,没有 font.h这个库,开发板管理器里面也找不到
跟着大神学习