步骤1:在github上下载u8g2库的压缩包GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2

步骤2:只需要解压缩csrc文件夹

步骤3:将u8x8_d_**************.c的文件只保留所用到的屏幕使用的文件 u8x8_d_ssd1306_128x64_noname.c

步骤4:将csrc文件夹复制到esp32-s3的工程中,并改名为U8g2_1306_128_64(这里我是为了方便知道我现在用的是支持那种屏幕的u8g2才改的这个名字。也可以用其他的)

步骤5:找到并打开u8g2_d_setup.c文件夹,

只保留 u8g2_Setup_ssd1306_i2c_128x64_noname_f函数
 
步骤6:找到并打开u8g2_d_memory.c

只保留*u8g2_m_16_8_f函数

步骤7:编写软件IIC的初始化代码,编写scl和sda两个引脚的置高低电平的函数
void OLED_W_SCL(uint8_t BitValue)
{
	/*根据BitValue的值,将SCL置高电平或者低电平*/
	if(BitValue==1){
		gpio_set_level(9, 1);
		LED(0);
	}
	
	else if(BitValue==0){
		gpio_set_level(9, 0);
		LED(1);
	}	
	
	/*如果单片机速度过快,可在此添加适量延时,以避免超出I2C通信的最大速度*/
	//...
}
void OLED_W_SDA(uint8_t BitValue)
{
	/*根据BitValue的值,将SDA置高电平或者低电平*/
	if(BitValue==1){
		gpio_set_level(10, 1);
	}
	else if(BitValue==0){
		gpio_set_level(10, 0);
	}	
	
	/*如果单片机速度过快,可在此添加适量延时,以避免超出I2C通信的最大速度*/
	//...
}
/**
  * 函    数:OLED引脚初始化
  * 参    数:无
  * 返 回 值:无
  * 说    明:当上层函数需要初始化时,此函数会被调用
  *           用户需要将SCL和SDA引脚初始化为开漏模式,并释放引脚
  */
void OLED_GPIO_Init(void)
{
	uint32_t i, j;
	
	/*在初始化前,加入适量延时,待OLED供电稳定*/
	for (i = 0; i < 1000; i ++)
	{
		for (j = 0; j < 100; j ++);
	}
	
	/*将SCL和SDA引脚初始化为开漏模式*/
    gpio_config_t gpio_init_struct = {0};
    gpio_init_struct.intr_type = GPIO_INTR_DISABLE;         /* 失能引脚中断 */
    gpio_init_struct.mode = GPIO_MODE_OUTPUT_OD;            /* 开漏输出模式 */
    gpio_init_struct.pull_up_en = GPIO_PULLUP_ENABLE;       /* 使能上拉 */
    gpio_init_struct.pull_down_en = GPIO_PULLDOWN_DISABLE;  /* 失能下拉 */
    gpio_init_struct.pin_bit_mask = 1ull << 9|1ull << 10;   /* 设置的引脚的位掩码 */
    gpio_config(&gpio_init_struct);                         /* 配置GPIO */
	/*释放SCL和SDA*/
	OLED_W_SCL(1);
	OLED_W_SDA(1);
}步骤9:编写一个给u8g2调用的延时函数
// 自定义延时函数,通过多次执行nop指令
void ns_delay(int ns) {
    // 假设一个nop指令执行时间约为12.5ns(具体时间取决于时钟频率)
    int nop_count = ns / 4.16; 
    for (int i = 0; i < nop_count; i++) {
        __asm__ __volatile__("nop");
    }
}
uint8_t u8g2_gpio_and_delay_esp32(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_MILLI://Function which implements a delay, arg_int contains the amount of ms
				vTaskDelay(arg_int);
			break;
		
			case U8X8_MSG_DELAY_10MICRO://Function which delays 10us
				vTaskDelay(pdMS_TO_TICKS(10));
			break;
		
			case U8X8_MSG_DELAY_100NANO://Function which delays 100ns
				ns_delay(100);
			break;
			case U8X8_MSG_GPIO_I2C_CLOCK:
				if (arg_int) OLED_W_SCL(1);
				else OLED_W_SCL(0);
			break;
			case U8X8_MSG_GPIO_I2C_DATA:
				if (arg_int) OLED_W_SDA(1);
				else OLED_W_SDA(0);
			break;
			default:
				return 0; //A message was received which is not implemented, return 0 to indicate an error
	}
	return 1; // command processed successfully.
}步骤10:初始化u8g2
u8g2_t u8g2;
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2,U8G2_R0,u8x8_byte_sw_i2c,u8g2_gpio_and_delay_esp32);
u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,
u8g2_SetPowerSave(&u8g2, 0); // wake up display 步骤11:测试。这里用的是正点原子的esp32-s3开发板,main函数如下:
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "nvs_flash.h"
#include "led.h"
#include "oled.h"
#include "key.h"
#include "iic.h"
#include "xl9555.h"
#include "u8g2.h"
#include <xtensa/xtruntime.h>
// 自定义延时函数,通过多次执行nop指令
void ns_delay(int ns) {
    // 假设一个nop指令执行时间约为12.5ns(具体时间取决于时钟频率)
    int nop_count = ns / 4.16; 
    for (int i = 0; i < nop_count; i++) {
        __asm__ __volatile__("nop");
    }
}
uint8_t u8g2_gpio_and_delay_esp32(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_MILLI://Function which implements a delay, arg_int contains the amount of ms
				vTaskDelay(arg_int);
			break;
		
			case U8X8_MSG_DELAY_10MICRO://Function which delays 10us
				vTaskDelay(pdMS_TO_TICKS(10));
			break;
		
			case U8X8_MSG_DELAY_100NANO://Function which delays 100ns
				ns_delay(100);
			break;
			case U8X8_MSG_GPIO_I2C_CLOCK:
				if (arg_int) OLED_W_SCL(1);
				else OLED_W_SCL(0);
			break;
			case U8X8_MSG_GPIO_I2C_DATA:
				if (arg_int) OLED_W_SDA(1);
				else OLED_W_SDA(0);
			break;
			default:
				return 0; //A message was received which is not implemented, return 0 to indicate an error
	}
	return 1; // command processed successfully.
}
i2c_obj_t i2c0_master;
void app_main(void)
{
    esp_err_t ret;
    
    ret = nvs_flash_init(); /* 初始化NVS */
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    led_init();             /* 初始化LED */
    OLED_Init();
    // key_init();
    i2c0_master = iic_init(I2C_NUM_0);                  /* 初始化IIC0 */
    xl9555_init(i2c0_master);                           /* 初始化IO扩展芯片 */ 
    u8g2_t u8g2;
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2,U8G2_R0,u8x8_byte_sw_i2c,u8g2_gpio_and_delay_esp32);
    u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,
	u8g2_SetPowerSave(&u8g2, 0); // wake up display 
    u8g2_ClearBuffer(&u8g2);
	vTaskDelay(1000);
	u8g2_DrawLine(&u8g2, 0,0, 127, 63);
	u8g2_DrawLine(&u8g2, 127,0, 0, 63);
	u8g2_SendBuffer(&u8g2);
	u8g2_ClearBuffer(&u8g2);
    uint8_t keynum=0;
    while(1)
    {
        // keynum=xl9555_key_scan(0);        
        
        // OLED_W_SCL(1);
        // gpio_set_level(GPIO_NUM_7,1);
        // OLED_W_SDA(0);
        // LED_TOGGLE();
        // OLED_W_SCL(0);
        // OLED_W_SDA(1);
        vTaskDelay(10);   /* 延时500ms */
       
    }
}

 
                   
                   
                   
                   
                             
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   3189
					3189
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            