这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 第二期-智能手环DIY活动-点亮OLED屏幕

共1条 1/1 1 跳转至

第二期-智能手环DIY活动-点亮OLED屏幕

助工
2025-09-13 09:41:37     打赏

本节学习oled的驱动。

偶尔看见群里有大佬使用u8g2 开源代码驱动oled,搜索了解了一下开源库,大概了解了移植流程。

刚好拿来移植学习学习。

使用的iic 1024缓存,删除不需要的文件,iic硬件读写。

-----------------------------------------------------------------------------------------------------------------------

玩不转,硬件模拟,没点亮屏幕,通过例程iic检测到设备,写数据发不出去,程序还死掉了。

换使用gpio模拟iic点亮。

引脚:使用与电源相邻的引脚 p2-3(sda) p2-4(scl)。

接线和效果如下

1757727217816654.png

初始化代码,和引脚配置

#define SW_I2C_P        MXC_GPIO2
#define SW_I2C_SCL_PIN  MXC_GPIO_PIN_4
#define SW_I2C_SDA_PIN  MXC_GPIO_PIN_3
void u8g2Init(u8g2_t *u8g2)
{
    u8g2_Setup_ssd1315_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay);  // 初始化 u8g2 结构体
    u8g2_InitDisplay(u8g2); // 根据所选的芯片进行初始化工作,初始化完成后,显示器处于关闭状态
    u8g2_SetPowerSave(u8g2, 0); // 打开显示器
    u8g2_ClearBuffer(u8g2);
}

控引脚和延时函数

uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
    switch (msg)
    {
    case U8X8_MSG_DELAY_100NANO: // delay arg_int * 100 nano seconds
        __NOP();
        break;
    case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro seconds
        MXC_Delay(10);
        break;
    case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second
        MXC_Delay(1000);;
        break;
    case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
        break;                    // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us
    case U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pin
        if(arg_int == 1) {
            MXC_GPIO_OutSet(gpio_scl.port, gpio_scl.mask);
        }else if(arg_int == 0){
            MXC_GPIO_OutClr(gpio_scl.port, gpio_scl.mask);
        }  
        break;                    // arg_int=1: Input dir with pullup high for I2C clock pin
    case U8X8_MSG_GPIO_I2C_DATA:  // arg_int=0: Output low at I2C data pin
        if(arg_int == 1) {
            MXC_GPIO_OutSet(gpio_sda.port, gpio_sda.mask);
        }else if(arg_int == 0){
            MXC_GPIO_OutClr(gpio_sda.port, gpio_sda.mask);
        }
        break;                    // arg_int=1: Input dir with pullup high for I2C data pin
    case U8X8_MSG_GPIO_MENU_SELECT:
        u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ 0);
        break;
    case U8X8_MSG_GPIO_MENU_NEXT:
        u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ 0);
        break;
    case U8X8_MSG_GPIO_MENU_PREV:
        u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ 0);
        break;
    case U8X8_MSG_GPIO_MENU_HOME:
        u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ 0);
        break;
    default:
        u8x8_SetGPIOResult(u8x8, 1); // default return value
        break;
    }
    return 1;
}

官方的显示图像函数。

void draw(u8g2_t *u8g2)
{
    u8g2_SetFontMode(u8g2, 1); /*字体模式选择*/
    u8g2_SetFontDirection(u8g2, 0); /*字体方向选择*/
   
    u8g2_SetFont(u8g2, u8g2_font_wqy16_t_chinese2); /*字库选择*/    
    u8g2_DrawUTF8(u8g2, 90, 20, "你好啊");
 
    u8g2_SetFont(u8g2, u8g2_font_inb24_mf); /*字库选择*/
      u8g2_DrawStr(u8g2, 0, 20, "U");
   
    u8g2_SetFontDirection(u8g2, 1);
    u8g2_SetFont(u8g2, u8g2_font_inb30_mn);
    u8g2_DrawStr(u8g2, 21,8,"8");
       
    u8g2_SetFontDirection(u8g2, 0);
    u8g2_SetFont(u8g2, u8g2_font_inb24_mf);
    u8g2_DrawStr(u8g2, 51,30,"g");
    u8g2_DrawStr(u8g2, 67,30,"\xb2");
   
    u8g2_DrawHLine(u8g2, 2, 35, 47);
    u8g2_DrawHLine(u8g2, 3, 36, 47);
    u8g2_DrawVLine(u8g2, 45, 32, 12);
    u8g2_DrawVLine(u8g2, 46, 33, 12);
 
    u8g2_SetFont(u8g2, u8g2_font_4x6_tr);
    u8g2_DrawStr(u8g2, 1,54,"github.com/olikraus/u8g2");
        u8g2_SendBuffer(u8g2);
        u8g2_ClearBuffer(u8g2);
 
}

main函数,主要为初始化引脚,调用draw函数用于显示官方的例程图像。

// *****************************************************************************
int main(void)
{
    printf("\n\n******** I2C SLAVE ADDRESS SCANNER *********\n");
    printf("\nThis example finds the addresses of any I2C Slave devices connected to the");
    printf("\nsame bus as I2C%d (SCL - P0.%d, SDA - P0.%d).\n", MXC_I2C_GET_IDX(I2C_MASTER),
           I2C_SCL_PIN, I2C_SDA_PIN);


    gpio_scl.port = SW_I2C_P;
    gpio_scl.mask = SW_I2C_SCL_PIN;
    gpio_scl.pad = MXC_GPIO_PAD_WEAK_PULL_UP;
    gpio_scl.func = MXC_GPIO_FUNC_OUT;
    gpio_scl.vssel = MXC_GPIO_VSSEL_VDDIO;
    gpio_scl.drvstr = MXC_GPIO_DRVSTR_0;
    MXC_GPIO_Config(&gpio_scl);

    gpio_sda.port = SW_I2C_P;
    gpio_sda.mask = SW_I2C_SDA_PIN;
    gpio_sda.pad = MXC_GPIO_PAD_WEAK_PULL_UP;
    gpio_sda.func = MXC_GPIO_FUNC_OUT;
    gpio_sda.vssel = MXC_GPIO_VSSEL_VDDIO;
    gpio_sda.drvstr = MXC_GPIO_DRVSTR_0;
    MXC_GPIO_Config(&gpio_sda);

    u8g2_t u8g2St;

    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 -1;
    } 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 = 0x3C;
    reqMaster.tx_buf = NULL;
    reqMaster.tx_len = 0;
    reqMaster.rx_buf = NULL;
    reqMaster.rx_len = 0;
    reqMaster.restart = 0;
    reqMaster.callback = NULL;

    u8g2Init(&u8g2St);

    draw(&u8g2St);
    //  u8g2_FirstPage(&u8g2St);
     int lcunt = 0;
     while(1){
        lcunt++;
        MXC_Delay(MXC_DELAY_MSEC(1000));
        log("wait [%d]",lcunt);

     }
    for (uint8_t address = 8; address < 120; address++) {
        printf(".");
        fflush(0);

        reqMaster.addr = address;
        if ((MXC_I2C_MasterTransaction(&reqMaster)) == 0) {
            printf("\nFound slave ID %03d; 0x%02X\n", address, address);
            counter++;
        }
        MXC_Delay(MXC_DELAY_MSEC(200));
    }

    printf("\n-->Scan finished. %d devices found\n", counter);

    return 0;
}

tips:

    打印日志带了颜色,minicom如果要支持颜色显示,开启命令:minicom -c on


共1条 1/1 1 跳转至

回复

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