适用于STM32的U8G2回调函数例程

简介

  1. U8g2 还包括 U8x8 库。U8g2 和 U8x8 的功能包括:

    • U8g2
      包括所有图形程序(线/框/圆画)
      支持很丰富的字体库
      需要微控制器中的一些内存来渲染显示屏(需要消耗较多的ram空间资源)
    • U8x8
      仅文本输出(字符)设备
      仅允许使用每个字符固定大小(8x8 像素)的字体
      直接写到显示屏上,无需微控制器中的缓冲(需要消耗较少的ram空间资源)
  2. 像素点点阵

    OLED其实就是一个M x n 的像素点阵,想显示什么就得把具体位置的像素点亮起来。对于每一个像素点,有可能是1点亮,也有可能是0点亮

  3. 坐标系

    在坐标系中,左上角是原点,向右是X轴正方向,向下是Y轴正方向。

回调函数

这里只有使用IIC驱动OLED的代码示例

软件IIC

//延时和GPIO初始化 回调函数
uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr){
  switch(msg)
  {
    case U8X8_MSG_GPIO_AND_DELAY_INIT:	// called once during init phase of u8g2/u8x8
          delay_init();//初始化延时函数 
          IIC_Init();//软件IIC的IO初始化
      break;							// can be used to setup pins
    case U8X8_MSG_DELAY_NANO:			// delay arg_int * 1 nano second
      break;
    case U8X8_MSG_DELAY_100NANO:		// delay arg_int * 100 nano seconds
		__NOP();
      break;
    case U8X8_MSG_DELAY_10MICRO:		// delay arg_int * 10 micro seconds
		delay_us(10*arg_int);
      break;
    case U8X8_MSG_DELAY_MILLI:			// delay arg_int * 1 milli second
		delay_ms(1*arg_int);
      break;
    case U8X8_MSG_DELAY_I2C:				// arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
		delay_us(5*arg_int);
      break;							// arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us
    case U8X8_MSG_GPIO_D0:				// D0 or SPI clock pin: Output level in arg_int
    //case U8X8_MSG_GPIO_SPI_CLOCK:
      break;
    case U8X8_MSG_GPIO_D1:				// D1 or SPI data pin: Output level in arg_int
    //case U8X8_MSG_GPIO_SPI_DATA:
      break;
    case U8X8_MSG_GPIO_D2:				// D2 pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_D3:				// D3 pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_D4:				// D4 pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_D5:				// D5 pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_D6:				// D6 pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_D7:				// D7 pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_E:				// E/WR pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_CS:				// CS (chip select) pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_DC:				// DC (data/cmd, A0, register select) pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_RESET:			// Reset pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_CS1:				// CS1 (chip select) pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_CS2:				// CS2 (chip select) pin: Output level in arg_int
      break;
    case U8X8_MSG_GPIO_I2C_CLOCK:		// arg_int=0: Output low at I2C clock pin
		PBout(8) = arg_int;
      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
		PBout(9) = arg_int;
      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;
}

//测试主程序
int main(void) {
	//初始化u8g2
	u8g2_t u8g2;                                                                              // 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, u8x8_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);                                                                  // wake up display
	while (1){
    /* Begin of U8G2*/
	static int x = 30,y = 10;
	u8g2_ClearBuffer(&u8g2);
	u8g2_SetFont(&u8g2, u8g2_font_10x20_mf);
	u8g2_DrawStr(&u8g2, x,y,"Data");
	if(x >= 70)
	{
		x = y = 0;
	}
	else
	{
		x++;
		y++;
	}

	u8g2_SendBuffer(&u8g2);
    /* End of U8G2 */
  	}
}

硬件IIC

下面代码适用于stm32f1系列的引脚IIC

//为u8g2提供IIC的API接口的函数
uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
	static uint8_t buffer[32];		/* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */
	static uint8_t buf_idx;
	uint8_t *data;
	u8 i;
	switch(msg){
		case U8X8_MSG_BYTE_INIT:
			//Init the IIC GPIO
			IIC_Init();
			break;
		
		case U8X8_MSG_BYTE_START_TRANSFER:
			//clear the index
			buf_idx = 0;
			break;
		
		case U8X8_MSG_BYTE_SEND:
			data = (uint8_t *)arg_ptr;
			while( arg_int > 0 ){
				buffer[buf_idx++] = *data;
				data++;
				arg_int--;
			}
			break;
			
		case U8X8_MSG_BYTE_END_TRANSFER:
			IIC_Start();
			IIC_Send_Address_Write(0x78);//write your oled address in here
			for(i = 0; i < buf_idx; i++){
				IIC_Send_Byte(buffer[i]);
			}
			IIC_Stop();
			break;
			
		case U8X8_MSG_BYTE_SET_DC:
			/* ignored for i2c */
			break;
		
		default:
			return 0;
	  }
	  return 1;
}

//为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_GPIO_AND_DELAY_INIT:
        delay_init();	    //延时函数初始化
	    break;

	case U8X8_MSG_DELAY_MILLI:
		delay_ms(arg_int);
	    break;
		
	case U8X8_MSG_GPIO_I2C_CLOCK:		
        break;							
		
    case U8X8_MSG_GPIO_I2C_DATA:			
        break;
		
	default:	
		return 0;
	}
	return 1; // command processed successfully.
}

//测试主程序
void TestIO_Init(void){
	GPIO_InitTypeDef  GPIO_InitStructure;

 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 		//使能端口时钟

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;	    		//端口配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 	//下拉输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);	  		//根据设定参数初始化
}

int main(void){
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//设置系统中断优先级分为2
    
	u8g2_t u8g2;                                                                              // a structure which will contain all the data for one display
	u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_hw_i2c, u8x8_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);                                                                  // wake up display
	while (1){
		/* Begin of U8G2*/
		static int x = 30,y = 10;
		u8g2_ClearBuffer(&u8g2);
		u8g2_SetFont(&u8g2, u8g2_font_10x20_mf);
		u8g2_DrawStr(&u8g2, x,y,"Data");
		if(x >= 70)
		{
			x = y = 0;
		}
		else
		{
			x++;
			y++;
		}

		u8g2_SendBuffer(&u8g2);
		/* End of U8G2 */
	}
}

相关推荐

  1. 适用STM32U8G2函数

    2024-06-07 09:44:05       9 阅读
  2. 技术解答 | ESP32 S2有虚拟U盘相关吗?

    2024-06-07 09:44:05       9 阅读
  3. 入门级 DataV 教适用 Vue 2

    2024-06-07 09:44:05       26 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-07 09:44:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-07 09:44:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-07 09:44:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-07 09:44:05       18 阅读

热门阅读

  1. 介绍单例模式

    2024-06-07 09:44:05       8 阅读
  2. Jitsi meet 退出房间后,用户还在房间内

    2024-06-07 09:44:05       9 阅读
  3. lua vm 四: 表达式

    2024-06-07 09:44:05       7 阅读
  4. 获取gitee上某个组织所有仓库的介绍

    2024-06-07 09:44:05       7 阅读
  5. 系统研发安全漏洞

    2024-06-07 09:44:05       6 阅读
  6. vue el-dialog封装成子组件(组件化)

    2024-06-07 09:44:05       7 阅读
  7. react-intl国际化在项目中的使用

    2024-06-07 09:44:05       6 阅读
  8. 浅谈人机交互

    2024-06-07 09:44:05       5 阅读