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才能显示