ESP8266 RTOS SDK 移植 u8g2 移植代码

LED屏驱动ssd1306
屏幕128x64大小

1:移植代码核心(方法1)

port.c

#define SCL_Pin GPIO_SCL
#define SDA_Pin GPIO_SDA

void delay_us(uint32_t time) __attribute__((optimize("O0")));//关键字防止优化

void delay_us(uint32_t time)
{
  uint32_t i = 8 * time;
  while (i--)
    ;
}

#define __NOP() __asm volatile("nop")

uint8_t STM32_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
    os_delay_us(arg_int * 10);
    break;
  case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second
    vTaskDelay(1);           //1毫秒延时,必须配置freeRtos_config文件的tick为1000hz才能达到1ms
    break;
  case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
    os_delay_us(5);
    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
                                // arg_int=1: Input dir with pullup high for I2C clock pin
    gpio_control(SCL_Pin, arg_int); //引脚控制拉高拉低函数
    break;
  case U8X8_MSG_GPIO_I2C_DATA: // arg_int=0: Output low at I2C data pin
                               // arg_int=1: Input direction with pullup high for I2C data pin
    gpio_control(SDA_Pin, arg_int);
    break;
  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, 0); // default return value
    break;
  }

  return 1;
}

在使用u8g2的时候,要先初始化

void init_oled_u8g2(void)
{
    // a structure which will contain all the data for one display
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, STM32_gpio_and_delay); // init u8g2 structure
    u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,
    u8g2_SetPowerSave(&u8g2, 0);
    u8g2_ClearBuffer(&u8g2);
    
}

u8g2使用方法注意SendBuffer事项!!!

		u8g2_DrawStr(&u8g2, 1, 16, rx_buffer);//设置显示内容
        u8g2_SendBuffer(&u8g2); //发送内容到屏幕,一定要调用sendBuffer才能显示出来!!!!!!!
        //gpio_control(GPIO_LED, 1);
        u8g2_ClearBuffer(&u8g2); //清空缓存

2:移植代码核心(方法2)
自己实现模拟iic
把u8g2的iic发送接口数据截胡

port.c

uint8_t my_u8x8_byte_sw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
  static uint8_t hw_buf[32];
  static uint8_t hw_buf_idx;
  uint8_t *hw_buf_data;
  uint8_t i = 0;

  switch (msg)
  {
  case U8X8_MSG_BYTE_SEND:
  	//截胡数据存起来
    hw_buf_data = (uint8_t *)arg_ptr; // 
    while (arg_int > 0)               //
    {
      hw_buf[hw_buf_idx++] = *hw_buf_data; //
      hw_buf_data++;
      arg_int--;
    }
    break;

  case U8X8_MSG_BYTE_INIT:
    IIC_Init();
    hw_buf_idx = 0;
    break;
  case U8X8_MSG_BYTE_SET_DC:
    break;
  case U8X8_MSG_BYTE_START_TRANSFER:
    hw_buf_idx = 0;
    break;
  case U8X8_MSG_BYTE_END_TRANSFER:
  	//最后时刻一起发送,使用自己模拟iic接口
    IIC_Start();         // 
    IIC_Send_Byte(0x78); // 1306地址
    IIC_Wait_Ack();
    while (hw_buf_idx--)
    {
      IIC_Send_Byte(hw_buf[i++]); // 
      IIC_Wait_Ack();
    }
    IIC_Stop();
    hw_buf_idx = 0;
    break;
  default:
    return 0;
  }
  return 1;
}

u8g2使用方法同上!!!,一定要sendBuffer才能显示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漏洞百出

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值