这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Let'Sdo第二期智能手环DIY—实现OLED屏幕显示信息

共1条 1/1 1 跳转至

Let'Sdo第二期智能手环DIY—实现OLED屏幕显示信息

工程师
2025-10-04 20:04:47     打赏

       本期DIY在显示上使用了一块驱动芯片为SSD1315的0.96英寸OLED屏幕。屏幕分辨率为128*64,通信方式为IIC或SPI。论坛管理员也将屏幕的相关资料(包括驱动)一并打包发给参与人员,在此非常感谢,可以节省一些调试时间。以下是我借用管理员给的驱动程序来驱动屏幕的步骤

       首先考虑到的是使用MAX78000官方开发资料如何添加自定义的.c和.h文件到工程中,在使用百度搜索后没有找到相关的教程,之前也没用过Eclipse编译单片机工程,所以就简单的尝试了一下,发现可以。就是直接将.c和.h文件复制到工程根目录下,这里我没有新建文件夹,直接复制过来的。主要复制资料中DIY智能手环\程序\OLED文件夹下的以下文件到工程中,复制后的文件结构如下

image.png

       在这个目录下也看到有Makefile的文件,对应的修改方式的教程也没去找,没有变动也是可以的。复制好后如果工程没有出现这些文件可以右键工程选择Refresh刷新一下就可以。

       我新建的工程是使用Hellow_World例程,在main.c文件主要是添加了这几行代码。

        在.h文件包含中添加了这些文件,代码如下

#include "oled.h"

#include "gui.h"

        在main函数中添加了如下的代码

OLED_Init();

OLED_Clear(0);

GUI_ShowString(0,0,(uint8_t *)"OLED show",16,0);

OLED_Display();

       首先是OLED的初始化,也包括芯片IIC的初始化,源码如下

void OLED_Init(void) {
// 	delay_ms(200);
	i2cm_Init();
///**************初始化SSD1306*****************/
 	OLED_WR_Byte(0xAE, 0); // 关闭显示
	OLED_WR_Byte(0x20, 0); // 设置内存寻址模式
	OLED_WR_Byte(0x00, 0); // 水平寻址模式
	OLED_WR_Byte(0xB0, 0); // 设置页地址
	OLED_WR_Byte(0xC8, 0); // 设置扫描方向
	OLED_WR_Byte(0x00, 0); // 设置列地址低 4 位
	OLED_WR_Byte(0x10, 0); // 设置列地址高 4 位
	OLED_WR_Byte(0x40, 0); // 设置显示起始行
	OLED_WR_Byte(0x81, 0); // 设置对比度
	OLED_WR_Byte(0xFF, 0); // 最大对比度
	OLED_WR_Byte(0xA1, 0); // 设置段重映射
	OLED_WR_Byte(0xA6, 0); // 设置正常显示
	OLED_WR_Byte(0xA8, 0); // 设置多路复用率
	OLED_WR_Byte(0x3F, 0); // 1/64 多路复用
	OLED_WR_Byte(0xA4, 0); // 恢复整体显示
	OLED_WR_Byte(0xD3, 0); // 设置显示偏移
	OLED_WR_Byte(0x00, 0); // 无偏移
	OLED_WR_Byte(0xD5, 0); // 设置时钟分频比/振荡器频率
	OLED_WR_Byte(0xF0, 0); // 设置分频比
	OLED_WR_Byte(0xD9, 0); // 设置预充电周期
	OLED_WR_Byte(0x22, 0); // 设置预充电周期
	OLED_WR_Byte(0xDA, 0); // 设置 COM 引脚硬件配置
	OLED_WR_Byte(0x12, 0); // 设置 COM 引脚硬件配置
	OLED_WR_Byte(0xDB, 0); // 设置 VCOMH 取消选择级别
	OLED_WR_Byte(0x20, 0); // 设置 VCOMH 取消选择级别
	OLED_WR_Byte(0x8D, 0); // 设置电荷泵
	OLED_WR_Byte(0x14, 0); // 启用电荷泵
	OLED_WR_Byte(0xAF, 0); // 开启显示
}

       可以明显的看到有初始化SSD1306的字眼,说明SSD1315的驱动程序和1306的一样。芯片IIC的初始化主要是i2cm_Init()函数,对应的源码是

void i2cm_Init(void)
{
	   int error;

	    //Setup the I2CM
	    error = MXC_I2C_Init(I2C_MASTER, 1, 0);
	    if (error != E_NO_ERROR) {
	        printf("-->I2C Master Initialization failed, error:%d\n", error);
	        return;
	    } else {
	        printf("\n-->I2C Master Initialization Complete\n");
	    }

	    printf("-->Scanning started\n");
	    MXC_I2C_SetFrequency(I2C_MASTER, I2C_FREQ);

	    reqMaster.i2c = I2C_MASTER;
	    reqMaster.addr = 0;
	    reqMaster.tx_buf = NULL;
	    reqMaster.tx_len = 0;
	    reqMaster.rx_buf = NULL;
	    reqMaster.rx_len = 0;
	    reqMaster.restart = 0;
	    reqMaster.callback = NULL;

}

       其中I2C_MASTER为MXC_I2C1的句柄,MXC_I2C_Init函数在MaximSDK\Libraries\PeriphDrivers\Source\I2C文件夹下i2c_me17.c文件中,对应的源代码如下

int MXC_I2C_Init(mxc_i2c_regs_t *i2c, int masterMode, unsigned int slaveAddr)
{
    if (i2c == NULL) {
        return E_NULL_PTR;
    }

#ifndef MSDK_NO_GPIO_CLK_INIT
    MXC_I2C_Shutdown(i2c); // Clear everything out

    if (i2c == MXC_I2C0) {
        MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_I2C0);
        MXC_GPIO_Config(&gpio_cfg_i2c0);
    } else if (i2c == MXC_I2C1) {
        MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_I2C1);
        MXC_GPIO_Config(&gpio_cfg_i2c1);
    } else if (i2c == MXC_I2C2) {
        MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_I2C2);
        MXC_GPIO_Config(&gpio_cfg_i2c2);
    } else {
        return E_NO_DEVICE;
    }
#endif // MSDK_NO_GPIO_CLK_INIT

    return MXC_I2C_RevA_Init((mxc_i2c_reva_regs_t *)i2c, masterMode, slaveAddr);
}

       首先是对应的时钟,然后是配置对应的I/O口。在配置I/O口时使用了结构体gpio_cfg_i2c1,在找了很久才在MaximSDK\Libraries\PeriphDrivers\Source\SYS文件夹下的pins_ai85.c文件中找到定义,定义如下

const mxc_gpio_cfg_t gpio_cfg_i2c1 = { MXC_GPIO0, (MXC_GPIO_PIN_16 | MXC_GPIO_PIN_17), MXC_GPIO_FUNC_ALT1,
                                       MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIO, MXC_GPIO_DRVSTR_0 };

       可以看到对应的I/O口为P0_16和P0_17,这样在硬件连接时确定所连接的I/O口没有问题。

       回到main函数中,初始化完成后就是清屏,这是防止下次显示时屏幕会出现错乱。然后是在坐标0,0上显示OLED show字符,字符大小是16;最后一个参数是显示方式,0是白底黑字,1是黑底白字。

       修改完成后编译程序一般是没有问题。

        然后是烧写程序查看一下,接线方式资料中也是有的。对应控制板的分布图可以进行连接。OLED屏幕的电源接的是3.3V。显示效果如下

image.png




关键词: 智能     手环    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]