(二十五)msp430进阶:OLED图形显示器与MSP-EXP430G2 TI Launchpad连接

释放双眼,带上耳机,听听看~!

介绍

(二十五)msp430进阶:OLED图形显示器与MSP-EXP430G2 TI Launchpad连接

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模块,类似于上图所示。

 

引脚说明

(二十五)msp430进阶:OLED图形显示器与MSP-EXP430G2 TI Launchpad连接

上图显示了基于128×64 I2C的OLED模块。

VCC:  这是模块的电源引脚。可以为此引脚提供3.3V或5V电源,为显示器供电。

GND: 这是模块的接地引脚。

SCL和SDA: 这些是用于I2C通信的串行时钟和串行数据引脚。

 

电路连接图

(二十五)msp430进阶:OLED图形显示器与MSP-EXP430G2 TI Launchpad连接

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 */ 
  }   
}

余下程序:

 

结果演示

(二十五)msp430进阶:OLED图形显示器与MSP-EXP430G2 TI Launchpad连接

完整程序下载

 

给TA打赏
共{{data.count}}人
人已打赏
msp430/Arduino-进阶

(二十四)msp430进阶:Nokia5110图形显示器与MSP -EXP430G2 TI Launchpad连接

2019-7-5 20:09:41

msp430/Arduino-进阶

(二十六)msp430进阶:XBee S2(ZigBee)与MSP-EXP430G2 TI Launchpad连接

2019-7-8 20:03:33

11 条回复 A文章作者 M管理员
  1. mine

    MSP-EXP430G2ET也是同样的操作吗,开发板盖帽跟OLED上有需要动的吗

    • Luca

      看看MSP-EXP430G2ET的引脚功能,是IIC引脚就不用变动,也是可以的

    • mine

      软件I2C和硬件I2C都试过了,OLED还是没反应;是不是要改写一下OLED_Init初始化那段程序?

    • Luca

      你试着改一下吧!我现在手上没这个板子了,不然我试试看

  2. 呵忒

    OLED_setXY(char col_start, char col_end, char page_start, char page_end)这四个参数分别代表什么

    • Luca

      这是显示的列开始地址、列结束地址、页开始地址、页结束地址

    • Luca

      也可以理解为行和列显示的位置

  3. ꧁༺李༻꧂

    大佬,用Energia开发430可以添加OLED库吗?没有找到教程?

    • Luca

      你瞅瞅这个库:https://github.com/battosai30/Oled_SSD1306

  4. 大佬,没有 font.h这个库,开发板管理器里面也找不到

  5. 注册成功了吗

    跟着大神学习

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
'); })();