1.找到src文件夹,把里面的所有文件除了u8x8_d_xxx.c结尾的添加到kile工程里面,并包含头文件。然后根据自己的驱动添加u8x8_d_对应自己的驱动.c。
2.修改两个。c文件(这里以0.96寸oled驱动为ssd1306 128*64为例子进行说明)
1)u8g2_setup.c 屏蔽里面所有文件,只留对应文件(ssd1306只留这个函数),其余屏蔽。
void u8g2_Setup_ssd1306_128x64_noname_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
2)u8g2_d_memory.c 屏蔽里面所有文件,只留对应文件(ssd1306只留这个函数),其余屏蔽。
uint8_t *u8g2_m_16_8_f(uint8_t *page_cnt)
3. 修改对应的底层
1)如果你是使用的spi。需要重新是实现下这个函数:根据自己的实际使用的管脚来修改
uint8_t u8x8_stm32_gpio_and_delay(U8X8_UNUSED u8x8_t *u8x8,
U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int,
U8X8_UNUSED 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
for (uint16_t n = 0; n < 320; n++)
{
__NOP();
}
break;
case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second
delay_ms(1);
break;
case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
delay_us(5);
break; // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us
/*IIC接口*/
case U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pin
if(arg_int == 1) // arg_int=1: Input dir with pullup high for I2C clock pin
// HAL_GPIO_WritePin(LCD_SCLK_GPIO_Port, LCD_SCLK_Pin, GPIO_PIN_SET);
else if(arg_int == 0)
// HAL_GPIO_WritePin(LCD_SCLK_GPIO_Port, LCD_SCLK_Pin, GPIO_PIN_RESET);
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) // arg_int=1: Input dir with pullup high for I2C clock pin
//HAL_GPIO_WritePin(LCD_SDIN_GPIO_Port, LCD_SDIN_Pin, GPIO_PIN_SET);
else if(arg_int == 0)
// HAL_GPIO_WritePin(LCD_SDIN_GPIO_Port, LCD_SDIN_Pin, GPIO_PIN_RESET);
break; // arg_int=1: Input dir with pullup high for I2C data pin
/*SPI接口*/
case U8X8_MSG_GPIO_SPI_DATA:
if(arg_int == 1) // arg_int=1: Input dir with pullup high for I2C clock pin
HAL_GPIO_WritePin(LCD_SDIN_GPIO_Port, LCD_SDIN_Pin, GPIO_PIN_SET);
else if(arg_int == 0)
HAL_GPIO_WritePin(LCD_SDIN_GPIO_Port, LCD_SDIN_Pin, GPIO_PIN_RESET);
break;
case U8X8_MSG_GPIO_SPI_CLOCK:
if(arg_int == 1) // arg_int=1: Input dir with pullup high for I2C clock pin
HAL_GPIO_WritePin(LCD_SCLK_GPIO_Port, LCD_SCLK_Pin, GPIO_PIN_SET);
else if(arg_int == 0)
HAL_GPIO_WritePin(LCD_SCLK_GPIO_Port, LCD_SCLK_Pin, GPIO_PIN_RESET);
break;
case U8X8_MSG_GPIO_CS:
if(arg_int == 1) // arg_int=1: Input dir with pullup high for I2C clock pin
HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_SET);
else if(arg_int == 0)
HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET);
break;
case U8X8_MSG_GPIO_DC:
if(arg_int == 1) // arg_int=1: Input dir with pullup high for I2C clock pin
HAL_GPIO_WritePin(LCD_D_C_GPIO_Port, LCD_D_C_Pin, GPIO_PIN_SET);
else if(arg_int == 0)
HAL_GPIO_WritePin(LCD_D_C_GPIO_Port, LCD_D_C_Pin, GPIO_PIN_RESET);
break;
case U8X8_MSG_GPIO_RESET:
if(arg_int == 1) // arg_int=1: Input dir with pullup high for I2C clock pin
HAL_GPIO_WritePin(LCD_RESET_GPIO_Port, LCD_RESET_Pin, GPIO_PIN_SET);
else if(arg_int == 0)
HAL_GPIO_WritePin(LCD_RESET_GPIO_Port, LCD_RESET_Pin, GPIO_PIN_RESET);
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, 1); // default return value
break;
}
return 1;
}
4.初始化代码
u8g2_t u8g2;
u8g2_Setup_ssd1306_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_4wire_sw_spi, u8x8_stm32_gpio_and_delay);
u8g2_InitDisplay(&u8g2);
u8g2_SetPowerSave(&u8g2,0);
u8g2_ClearBuffer(u8g2);
while(1)
{
//delay_ms(100);
u8g2_ClearBuffer(&u8g2);
if(++t >= 32) t = 1;
u8g2_DrawCircle(&u8g2,64,32,t,U8G2_DRAW_ALL);
u8g2_DrawCircle(&u8g2,32,32,t,U8G2_DRAW_ALL);
u8g2_DrawCircle(&u8g2,96,32,t,U8G2_DRAW_ALL);
u8g2_SendBuffer(&u8g2);
}
5.成果展示