STM32G431+OLED1306+U8G2+多级菜单+EC11编码器代码

STM32G431+OLED1306+U8G2+多级菜单+EC11编码器

cubemx引脚配置

由于蓝桥杯嵌入式板子外设引脚较少,无法使用硬件IIC,故采用软件模拟IIC

IIC引脚配置

软件部分移植u8g2,网上教程很多

移植u8g2

大概描述一下

直接从github下载代码,u8g2支持c/c++ ,cppsrc是c++的,csrc文件夹下面是c的源码,在单片机上移植就只需关注csrc里面的文件:

复制到工程文件

修改"u8g2_d_setup.c"这个文件,里面有各种驱动芯片的初始化函数,删除其他函数,只留下与使用的驱动芯片相关的函数。
本文使用的ssd1306,但是与ssd1306相关的有多个函数,例如:
u8g2_Setup_ssd1306_128x64_noname_1、
u8g2_Setup_ssd1306_128x64_noname_2、
u8g2_Setup_ssd1306_128x64_noname_f,
这些都是spi接口的;
u8g2_Setup_ssd1306_i2c_128x64_noname_1、
u8g2_Setup_ssd1306_i2c_128x64_noname_2、
u8g2_Setup_ssd1306_i2c_128x64_noname_f,
这些都是i2c接口的;
后缀1、2、f代表缓冲区大小的不同:
1代表128字节,
2代表256字节,
f代表1024字节;
根据单片机空间的大小选择合适的接口,缓冲区小的,刷新lcd/oled的时候就比较耗时,反之。
本文使用u8g2_Setup_ssd1306_i2c_128x64_noname_f这个接口:

u8g2_d_setup.c 只保u8g2_Setup_ssd1306_i2c_128x64_noname_f 这个函数

u8g2_d_setup.c 

/* u8g2_d_setup.c */
/* generated code, codebuild, u8g2 project */

#include "u8g2.h"


/* ssd1306 f */
void u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2_t *u8g2, const u8g2_cb_t *rotation, u8x8_msg_cb byte_cb, u8x8_msg_cb gpio_and_delay_cb)
{
  uint8_t tile_buf_height;
  uint8_t *buf;
  u8g2_SetupDisplay(u8g2, u8x8_d_ssd1306_128x64_noname, u8x8_cad_ssd13xx_fast_i2c, byte_cb, gpio_and_delay_cb);
  buf = u8g2_m_16_8_f(&tile_buf_height);
  u8g2_SetupBuffer(u8g2, buf, tile_buf_height, u8g2_ll_hvline_vertical_top_lsb, rotation);
}

/* end of generated code */

修改“u8g2_d_memory.c”文件,这个文件里面其实就是“u8g2_d_setup.c”文件对应的缓冲区,同上面一样,屏蔽掉没用到的,留下用到的,否则会报错内存不足

 u8g2_d_memory.c 

/* u8g2_d_memory.c */
/* generated code, codebuild, u8g2 project */

#include "u8g2.h"


uint8_t *u8g2_m_16_8_f(uint8_t *page_cnt)
{
  #ifdef U8G2_USE_DYNAMIC_ALLOC
  *page_cnt = 8;
  return 0;
  #else
  static uint8_t buf[1024];
  *page_cnt = 8;
  return buf;
  #endif
}
/* end of generated code */

oled.c

#include "oled.h"

u8g2_t u8g2;

//u8g2_cb_t *rotation可选参数↓
#define U8G2_R0	(&u8g2_cb_r0)
#define U8G2_R1	(&u8g2_cb_r1)
#define U8G2_R2	(&u8g2_cb_r2)
#define U8G2_R3	(&u8g2_cb_r3)
#define U8G2_MIRROR	(&u8g2_cb_mirror)
#define U8G2_MIRROR_VERTICAL	(&u8g2_cb_mirror_vertical)

unsigned char func_index = 0; //初始显示欢迎界面
unsigned char last_index = 127; //last初始为无效值

void oled_init(void)
{
       
      //初始化u8g2
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8g2_gpio_and_delay_stm32_soft_iic);
    //屏幕初始化
    u8g2_InitDisplay(&u8g2);
    //开启电源
    u8g2_SetPowerSave(&u8g2, 0);
    //清除显存内容
    u8g2_ClearBuffer(&u8g2);
    
    u8g2_SetFontMode(&u8g2, 1);
    u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols);
    
}

//u8x8_msg_cb 是一个函数指针编写此函数的状态:
uint8_t u8g2_gpio_and_delay_stm32_soft_iic(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr)
{
	switch(msg){
		//初始化GPIO
		case U8X8_MSG_GPIO_AND_DELAY_INIT:        //此状态下初始化IO以及延时函数
		//本人用HAL库进行配置未使用到这里配置io与延时
       	break;
		case U8X8_MSG_DELAY_MILLI:                //此状态下对接ms延时函数,延时arg_int ms
			HAL_Delay_us(arg_int);
		break;
		case U8X8_MSG_DELAY_10MICRO:              //此状态下对接10usus延时函数
			HAL_Delay_us(10);
		break;
		case U8X8_MSG_DELAY_100NANO:              //此状态下对接100ns延时函数
		    __NOP();
		break;
		case U8X8_MSG_DELAY_I2C:                  //此状态下对接IIC延时函数
		 HAL_Delay_us(1);
		break;
		case U8X8_MSG_GPIO_I2C_DATA:              //此状态下修改IIC SDA信号线电平
        if (arg_int) HAL_GPIO_WritePin(I2C_SDA_GPIO_Port, I2C_SDA_Pin, GPIO_PIN_SET);
			else HAL_GPIO_WritePin(I2C_SDA_GPIO_Port, I2C_SDA_Pin, GPIO_PIN_RESET);
		break;
		case U8X8_MSG_GPIO_I2C_CLOCK:             //此状态下修改IIC SCL信号线电平
			if (arg_int) HAL_GPIO_WritePin(I2C_SCL_GPIO_Port, I2C_SCL_Pin, GPIO_PIN_SET);
			else HAL_GPIO_WritePin(I2C_SCL_GPIO_Port, I2C_SCL_Pin, GPIO_PIN_RESET);
		break;
    default:
        u8x8_SetGPIOResult(u8x8, 1); // default return value
        break;
	}

	return 1; // command processed successfully.
}





移植还需要一个us级的延时

可以参考

 

void HAL_Delay_us(uint32_t us)//延时us函数
{//需要cubemx配置时SYS时基源选择SysTick
    __IO uint32_t currentTicks = SysTick->VAL;
  /* Number of ticks per millisecond */
  const uint32_t tickPerMs = SysTick->LOAD + 1;
  /* Number of ticks to count */
  const uint32_t nbTicks = ((us - ((us > 0) ? 1 : 0)) * tickPerMs) / 1000;
  /* Number of elapsed ticks */
  uint32_t elapsedTicks = 0;
  __IO uint32_t oldTicks = currentTicks;
  do {
    currentTicks = SysTick->VAL;
    elapsedTicks += (oldTicks < currentTicks) ? tickPerMs + oldTicks - currentTicks :
                    oldTicks - currentTicks;
    oldTicks = currentTicks;
  } while (nbTicks > elapsedTicks);
}

移植基本结束,然后编写动画文件

动画文件

cartoon.c

#include "cartoon.h"


//---------------U8g2测试函数

#define SEND_BUFFER_DISPLAY_MS(u8g2, ms)\
do {\
	u8g2_SendBuffer(u8g2); \
	HAL_Delay(ms);\
}while(0);


//进度条显示
void testDrawProcess(u8g2_t *u8g2)
{
	for(int i=10;i<=80;i=i+2)
	{
		u8g2_ClearBuffer(u8g2); 
			
		char buff[20];
		
		u8g2_SetFont(u8g2,u8g2_font_ncenB12_tf);
		u8g2_DrawStr(u8g2,8,32,"STM32 U8g2");//字符显示
		
		u8g2_SetFont(u8g2,u8g2_font_ncenB08_tf);
		u8g2_DrawStr(u8g2,100,49,buff);//当前进度显示
		
		u8g2_DrawRBox(u8g2,24,40,i,10,4);//圆角填充框矩形框
		u8g2_DrawRFrame(u8g2,24,40,80,10,4);//圆角矩形
		
		u8g2_SendBuffer(u8g2);
	}
    HAL_Delay(500);
}


//字体测试 数字英文可选用 u8g2_font_ncenB..(粗) 系列字体
//u8g2_font_unifont_t_symbols/u8g2_font_unifont_h_symbols(细 圆润)
void testShowFont(u8g2_t *u8g2)
{
	int t = 1000;
	char testStr[14] = "STM32F103ZET6";
	
	u8g2_ClearBuffer(u8g2);
	
	u8g2_SetFont(u8g2,u8g2_font_u8glib_4_tf);
	u8g2_DrawStr(u8g2,0,5,testStr);
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	
	u8g2_SetFont(u8g2,u8g2_font_ncenB08_tf);
	u8g2_DrawStr(u8g2,0,30,testStr);
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	
    u8g2_SetFont(u8g2,u8g2_font_ncenB10_tr);
	u8g2_DrawStr(u8g2,0,60,testStr);
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
}

//画空心矩形
void testDrawFrame(u8g2_t *u8g2)
{
	int t = 1000;
	int x = 16;
	int y = 32;
	int w = 50;
	int h = 20;
	u8g2_ClearBuffer(u8g2);
	u8g2_DrawStr(u8g2,0, 15, "DrawFrame");

	u8g2_DrawFrame(u8g2, x, y, w, h);
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	u8g2_DrawFrame(u8g2, x+w+5, y-10, w-20, h+20);
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
}

//画实心圆角矩形
void testDrawRBox(u8g2_t *u8g2)
{
	int t = 1000;
	int x = 16;
	int y = 32;
	int w = 50;
	int h = 20;
	int r = 3;
	u8g2_ClearBuffer(u8g2);
	u8g2_DrawStr(u8g2,0, 15, "DrawRBox");

	u8g2_DrawRBox(u8g2, x, y, w, h, r);
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	u8g2_DrawRBox(u8g2, x+w+5, y-10, w-20, h+20, r);
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
}

//画空心圆
void testDrawCircle(u8g2_t *u8g2)
{
	int t = 600;
	int stx = 0;  //画图起始x
	int sty = 16; //画图起始y
	int with = 16;//一个图块的间隔
	int r = 15;   //圆的半径
	u8g2_ClearBuffer(u8g2);
	u8g2_DrawStr(u8g2, 0, 15, "DrawCircle");

	u8g2_DrawCircle(u8g2, stx, sty - 1 + with, r, U8G2_DRAW_UPPER_RIGHT); //右上
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	u8g2_DrawCircle(u8g2, stx + with, sty, r, U8G2_DRAW_LOWER_RIGHT); //右下
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	u8g2_DrawCircle(u8g2, stx - 1 + with * 3, sty - 1 + with, r, U8G2_DRAW_UPPER_LEFT); //左上
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	u8g2_DrawCircle(u8g2, stx - 1 + with * 4, sty, r, U8G2_DRAW_LOWER_LEFT); //左下
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	u8g2_DrawCircle(u8g2, stx - 1 + with * 2, sty - 1 + with * 2, r, U8G2_DRAW_ALL);//整个圆
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	
  u8g2_DrawCircle(u8g2, 32*3, 32, 31, U8G2_DRAW_ALL);//右侧整个圆
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
}

//画实心椭圆
void testDrawFilledEllipse(u8g2_t *u8g2)
{
	int t = 800;
	int with = 16;//一个图块的间隔
	int rx = 27;  //椭圆x方向的半径
	int ry = 22;  //椭圆y方向的半径
	u8g2_ClearBuffer(u8g2);
	u8g2_DrawStr(u8g2,0, 14, "DrawFilledEllipse");

	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	u8g2_DrawFilledEllipse(u8g2, 0, with, rx, ry, U8G2_DRAW_LOWER_RIGHT);//右下
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	u8g2_DrawFilledEllipse(u8g2, with * 4 - 1, with, rx, ry, U8G2_DRAW_LOWER_LEFT); //左下
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	u8g2_DrawFilledEllipse(u8g2, 0, with * 4 - 1, rx, ry, U8G2_DRAW_UPPER_RIGHT); //右上
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	u8g2_DrawFilledEllipse(u8g2, with * 4 - 1, with * 4 - 1, rx, ry, U8G2_DRAW_UPPER_LEFT); //左上
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
	u8g2_DrawFilledEllipse(u8g2, with * 6, with * 2.5, rx, ry, U8G2_DRAW_ALL);//整个椭圆
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
}

//环形测试
void testDrawMulti(u8g2_t *u8g2)
{
	u8g2_ClearBuffer(u8g2);
	for (int j = 0; j < 64; j+=16)
	{
		for (int i = 0; i < 128; i+=16)
		{
			u8g2_DrawPixel(u8g2, i, j);
			u8g2_SendBuffer(u8g2);
		}
	}
  
	//实心矩形逐渐变大
    u8g2_ClearBuffer(u8g2);
	for(int i=30; i>0; i-=2)
	{
		u8g2_DrawBox(u8g2,i*2,i,128-i*4,64-2*i);
		u8g2_SendBuffer(u8g2);
	}
	//空心矩形逐渐变小
	u8g2_ClearBuffer(u8g2);
	for(int i=0; i<32; i+=2)
	{
		u8g2_DrawFrame(u8g2,i*2,i,128-i*4,64-2*i);
		u8g2_SendBuffer(u8g2);
	}
	
	//实心圆角矩形逐渐变大
	u8g2_ClearBuffer(u8g2);
	for(int i=30; i>0; i-=2)
	{
		u8g2_DrawRBox(u8g2,i*2,i,128-i*4,64-2*i,10-i/3);
		u8g2_SendBuffer(u8g2);
	}
    //空心圆角矩形逐渐变小
	u8g2_ClearBuffer(u8g2);
	for(int i=0; i<32; i+=2)
	{
		u8g2_DrawRFrame(u8g2,i*2,i,128-i*4,64-2*i,10-i/3);
		u8g2_SendBuffer(u8g2);
	}
	
	//实心圆逐渐变大
	u8g2_ClearBuffer(u8g2);
	for(int i=2; i<64; i+=3)
	{
		u8g2_DrawDisc(u8g2,64,32,i, U8G2_DRAW_ALL);
		u8g2_SendBuffer(u8g2);
	}
	//空心圆逐渐变小
	u8g2_ClearBuffer(u8g2);
	for(int i=64; i>0; i-=3)
	{
		u8g2_DrawCircle(u8g2,64,32,i, U8G2_DRAW_ALL);
		u8g2_SendBuffer(u8g2);
	}
	
	//实心椭圆逐渐变大
    u8g2_ClearBuffer(u8g2);
	for(int i=2; i<32; i+=3)
	{
		u8g2_DrawFilledEllipse(u8g2,64,32, i*2, i, U8G2_DRAW_ALL);
		u8g2_SendBuffer(u8g2);
	}
    //空心椭圆逐渐变小
    u8g2_ClearBuffer(u8g2);
	for(int i=32; i>0; i-=3)
	{
		u8g2_DrawEllipse(u8g2,64,32, i*2, i, U8G2_DRAW_ALL);
		u8g2_SendBuffer(u8g2);
	}
}


// width: 128, height: 48
const unsigned char bilibili[] U8X8_PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xe0, 0x03, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xf0, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x01, 0xfc, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfc, 0x00, 0x00, 0x3c, 0xc0, 0x0f, 0x00, 0x80, 0x03, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfc, 0x00, 0x00, 0x3c, 0xc0, 0x0f, 0x00, 0xc0, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0x00, 0x00, 0x3c, 0x80, 0x0f, 0x00, 0xc0, 0x07, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x80, 0x0f, 0xf8, 0x00, 0x00, 0x3c, 0x80, 0x0f, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x78, 0x80, 0x0f, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x78, 0x80, 0x0f, 0x00, 0x80, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x80, 0x79, 0x80, 0x0f, 0x00, 0x98, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0xe0, 0x79, 0x9f, 0x0f, 0x00, 0xbe, 0xe7, 0x01, 0xc0, 0x07, 0x10, 0x40, 0x00, 0x1f, 0xf8, 0x00, 0xe0, 0x7b, 0x1f, 0x0f, 0x00, 0xbe, 0xe7, 0x01, 0xc0, 0x87, 0x1f, 0xe0, 0x0f, 0x1f, 0xf8, 0x00, 0xe0, 0x7b, 0x1e, 0x0f, 0x00, 0x3e, 0xe7, 0x01, 0xc0, 0xe7, 0x3f, 0xe0, 0x3f, 0x1f, 0xf0, 0x00, 0xe0, 0x7b, 0x1e, 0x0f, 0x00, 0x3e, 0xe7, 0x01, 0xc0, 0xe7, 0x3f, 0xe0, 0x3f, 0x1f, 0xf0, 0x00, 0x60, 0x71, 0x1e, 0x0f, 0x00, 0x34, 0xe7, 0x01, 0xc0, 0xe7, 0x07, 0x00, 0x3f, 0x1f, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x1f, 0x00, 0x00, 0x07, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0xc0, 0x73, 0x1e, 0x1f, 0x00, 0x3c, 0xc7, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0xc0, 0x73, 0x1e, 0x1f, 0x00, 0x7c, 0xe7, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0xc0, 0x73, 0x1e, 0x1f, 0x00, 0x7c, 0xef, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x01, 0xc0, 0x77, 0x1e, 0x1e, 0x00, 0x7c, 0xef, 0x01, 0xc0, 0x07, 0x00, 0x03, 0x00, 0x1f, 0xf0, 0xff, 0xc1, 0xf7, 0x1e, 0xfe, 0x1f, 0x78, 0xef, 0x01, 0xc0, 0x07, 0x70, 0x37, 0x00, 0x1f, 0xe0, 0xff, 0x87, 0xf7, 0x1e, 0xfe, 0xff, 0x78, 0xee, 0x01, 0xc0, 0x07, 0xe0, 0x3f, 0x00, 0x1f, 0xe0, 0xff, 0x9f, 0xf7, 0x1e, 0xfe, 0xff, 0x79, 0xce, 0x01, 0xc0, 0x07, 0xc0, 0x18, 0x00, 0x1f, 0xe0, 0xff, 0xbf, 0xe7, 0x1e, 0xfe, 0xff, 0x7b, 0xce, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0xc7, 0xbf, 0xe7, 0x1e, 0xfe, 0xf8, 0x77, 0xce, 0x01, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x0f, 0x3f, 0xe7, 0x1c, 0xfe, 0xf0, 0x77, 0xce, 0x03, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0xcf, 0x3f, 0xe7, 0x1c, 0xfe, 0xf8, 0xf3, 0xce, 0x03, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xe0, 0xef, 0x1f, 0xe7, 0x1c, 0xfe, 0xfe, 0xf1, 0xce, 0x03, 0x80, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xe0, 0xff, 0x0f, 0xcf, 0x1c, 0xfc, 0xff, 0xf0, 0xc0, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0x07, 0xe0, 0xff, 0x03, 0x06, 0x1c, 0xfc, 0x7f, 0x60, 0xc0, 0x01, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x03, 0xe0, 0xff, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
// width: 128, height: 48
const unsigned char three_support[] U8X8_PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x80, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x80, 0x0f, 0xf0, 0x01, 0x00, 0x00, 0xfc, 0xff, 0x01, 0x00, 0x00, 0xc0, 0xfd, 0xff, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0x01, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x01, 0x00, 0xc0, 0x1f, 0xf8, 0x03, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x01, 0x00, 0xc0, 0x0f, 0xf0, 0x03, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x01, 0x00, 0xc0, 0x67, 0xe6, 0x03, 0x00, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x01, 0x00, 0xc0, 0x67, 0xe6, 0x03, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x00, 0x00, 0xc0, 0x67, 0xe6, 0x03, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x00, 0x00, 0xc0, 0x67, 0xee, 0x03, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x00, 0x00, 0x80, 0x7f, 0xfe, 0x01, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0xff, 0x00, 0x00, 0x80, 0x7f, 0xfe, 0x01, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0xf8, 0xf9, 0x01, 0x00, 0x00, 0xe0, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x1f, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x30, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

void testDrawXBM(u8g2_t *u8g2)
{
	int t = 1000;
	u8g2_ClearBuffer(u8g2);
	u8g2_DrawStr(u8g2,0, 14, "DrawXBM");

	u8g2_DrawXBM(u8g2,0, 16, 128, 48, bilibili);
	SEND_BUFFER_DISPLAY_MS(u8g2,t);

	u8g2_ClearBuffer(u8g2);
	u8g2_DrawStr(u8g2,0, 14, "bilibili");
	u8g2_DrawXBM(u8g2,0, 16, 128, 48, three_support);
	SEND_BUFFER_DISPLAY_MS(u8g2,t);
}

void u8g2DrawTest(u8g2_t *u8g2)
{
	testDrawProcess(u8g2);
	testDrawMulti(u8g2);
	//testDrawFrame(u8g2);
	//testDrawRBox(u8g2);
	//testDrawCircle(u8g2);
	//testDrawFilledEllipse(u8g2);
	testShowFont(u8g2);
	testDrawXBM(u8g2);

}

其他可自行测试

多级菜单

multi_menu.c

#include "multi_menu.h"   
//typedef struct
//{
//	unsigned char current;
//	unsigned char up;//向上翻索引号
//	unsigned char down;//向下翻索引号
//	unsigned char enter;//确认索引号
//	void (*current_operation)();
//} key_table;


key_table table[30]=
{
	//第0层
	{0,0,0,1,0,(*fun_0)},//0
	
    //第1层
	{1,4,2, 5,0,(*fun_a1)},//1
	{2,1,3, 9,0,(*fun_b1)},//2
	{3,2,4,13,0,(*fun_c1)},//3	
	{4,3,1, 0,0,(*fun_d1)},//4
	
    //第2层
	{5,8,6,17,0,(*fun_a21)},//5				
	{6,5,7,18,0,(*fun_a22)},//6
	{7,6,8,19,0,(*fun_a23)},//7					                	
	{8,7,5, 1,0,(*fun_a24)},//8
	
	{ 9,12,10,20,0,(*fun_b21)},//9					
	{10, 9,11,21,0,(*fun_b22)},//10
	{11,10,12,22,0,(*fun_b23)},//11					                	
	{12,11, 9, 2,0,(*fun_b24)},//12
	
	{13,16,14,23,0,(*fun_c21)},//13				
	{14,13,15,24,0,(*fun_c22)},//14			                	
	{15,14,16,25,0,(*fun_c23)},//15			                	
	{16,15,13, 3,0,(*fun_c24)},//16
	
    //第3层
	{17,17,17,5,0,(*fun_a31)},//17		                	
	{18,18,18,6,0,(*fun_a32)},//18	                	
	{19,19,19,7,0,(*fun_a33)},//19
	
	{20,20,20, 9,0,(*fun_b31)},//20			                	
	{21,21,21,10,0,(*fun_b32)},//21		                	
	{22,22,22,11,0,(*fun_b33)},//22
	
	{23,23,23,13,0,(*fun_c31)},//23		                	
	{24,24,24,14,0,(*fun_c32)},//24		                	
	{25,25,25,15,0,(*fun_c33)},//25							
};

/*********第1层***********/
void fun_a1()   
{	
	u8g2_DrawStr(&u8g2,0,16,">");
	u8g2_DrawStr(&u8g2,16,16,"Weather");
	u8g2_DrawStr(&u8g2,16,32,"Music");
	u8g2_DrawStr(&u8g2,16,48,"Device Info");
	u8g2_DrawStr(&u8g2,16,64,"return");																					
}

void fun_b1()   
{	
	u8g2_DrawStr(&u8g2,0,32,">");
	u8g2_DrawStr(&u8g2,16,16,"Weather");
	u8g2_DrawStr(&u8g2,16,32,"Music");
	u8g2_DrawStr(&u8g2,16,48,"Device Info");
	u8g2_DrawStr(&u8g2,16,64,"return");																						
}

void fun_c1()     
{	
	u8g2_DrawStr(&u8g2,0,48,">");
	u8g2_DrawStr(&u8g2,16,16,"Weather");
	u8g2_DrawStr(&u8g2,16,32,"Music");
	u8g2_DrawStr(&u8g2,16,48,"Device Info");
	u8g2_DrawStr(&u8g2,16,64,"return");																					
}

void fun_d1()     
{	
	u8g2_DrawStr(&u8g2,0,64,">");
	u8g2_DrawStr(&u8g2,16,16,"Weather");
	u8g2_DrawStr(&u8g2,16,32,"Music");
	u8g2_DrawStr(&u8g2,16,48,"Device Info");
	u8g2_DrawStr(&u8g2,16,64,"return");																						
}

/*********第2层***********/
void fun_a21()     
{	
	u8g2_DrawStr(&u8g2,0,16,">");
	u8g2_DrawStr(&u8g2,16,16,"HangZhou");
	u8g2_DrawStr(&u8g2,16,32,"BeiJing");
	u8g2_DrawStr(&u8g2,16,48,"ShangHai");
	u8g2_DrawStr(&u8g2,16,64,"return");																						
}

void fun_a22()      
{	
	u8g2_DrawStr(&u8g2,0,32,">");
	u8g2_DrawStr(&u8g2,16,16,"HangZhou");
	u8g2_DrawStr(&u8g2,16,32,"BeiJing");
	u8g2_DrawStr(&u8g2,16,48,"ShangHai");
	u8g2_DrawStr(&u8g2,16,64,"return");																							
}

void fun_a23()    
{	
	u8g2_DrawStr(&u8g2,0,48,">");
	u8g2_DrawStr(&u8g2,16,16,"HangZhou");
	u8g2_DrawStr(&u8g2,16,32,"BeiJing");
	u8g2_DrawStr(&u8g2,16,48,"ShangHai");
	u8g2_DrawStr(&u8g2,16,64,"return");																							
}

void fun_a24()    
{	
	u8g2_DrawStr(&u8g2,0,64,">");
	u8g2_DrawStr(&u8g2,16,16,"HangZhou");
	u8g2_DrawStr(&u8g2,16,32,"BeiJing");
	u8g2_DrawStr(&u8g2,16,48,"ShangHai");
	u8g2_DrawStr(&u8g2,16,64,"return");																								
}

void fun_b21()    
{	
    u8g2_DrawStr(&u8g2,0,16,">");
	u8g2_DrawStr(&u8g2,16,16,"WindyHill");
	u8g2_DrawStr(&u8g2,16,32,"New Boy");
	u8g2_DrawStr(&u8g2,16,48,"Kiss The Rain");
	u8g2_DrawStr(&u8g2,16,64,"return");																								
}

void fun_b22()    
{	
    u8g2_DrawStr(&u8g2,0,32,">");
	u8g2_DrawStr(&u8g2,16,16,"WindyHill");
	u8g2_DrawStr(&u8g2,16,32,"New Boy");
	u8g2_DrawStr(&u8g2,16,48,"Kiss The Rain");
	u8g2_DrawStr(&u8g2,16,64,"return");																							
}

void fun_b23()    
{	
    u8g2_DrawStr(&u8g2,0,48,">");
	u8g2_DrawStr(&u8g2,16,16,"WindyHill");
	u8g2_DrawStr(&u8g2,16,32,"New Boy");
	u8g2_DrawStr(&u8g2,16,48,"Kiss The Rain");
	u8g2_DrawStr(&u8g2,16,64,"return");																							
}

void fun_b24()    
{	
    u8g2_DrawStr(&u8g2,0,64,">");
	u8g2_DrawStr(&u8g2,16,16,"WindyHill");
	u8g2_DrawStr(&u8g2,16,32,"New Boy");
	u8g2_DrawStr(&u8g2,16,48,"Kiss The Rain");
	u8g2_DrawStr(&u8g2,16,64,"return");																					
}

void fun_c21()    
{	
	u8g2_DrawStr(&u8g2,0,16,">");
	u8g2_DrawStr(&u8g2,16,16,"WiFi Info");
	u8g2_DrawStr(&u8g2,16,32,"Volume");
	u8g2_DrawStr(&u8g2,16,48,"Version");
	u8g2_DrawStr(&u8g2,16,64,"return");																						
}

void fun_c22()    
{	
	u8g2_DrawStr(&u8g2,0,32,">");
	u8g2_DrawStr(&u8g2,16,16,"WiFi Info");
	u8g2_DrawStr(&u8g2,16,32,"Volume");
	u8g2_DrawStr(&u8g2,16,48,"Version");
	u8g2_DrawStr(&u8g2,16,64,"return");																						
}

void fun_c23()    
{	
	u8g2_DrawStr(&u8g2,0,48,">");
	u8g2_DrawStr(&u8g2,16,16,"WiFi Info");
	u8g2_DrawStr(&u8g2,16,32,"Volume");
	u8g2_DrawStr(&u8g2,16,48,"Version");
	u8g2_DrawStr(&u8g2,16,64,"return");																						
}

void fun_c24()    
{	
	u8g2_DrawStr(&u8g2,0,64,">");
	u8g2_DrawStr(&u8g2,16,16,"WiFi Info");
	u8g2_DrawStr(&u8g2,16,32,"Volume");
	u8g2_DrawStr(&u8g2,16,48,"Version");
	u8g2_DrawStr(&u8g2,16,64,"return");																				
}

/*********第3层***********/
void fun_a31()    
{	
	u8g2_DrawStr(&u8g2,0,16,"HangZhou Weather");
	u8g2_DrawStr(&u8g2,0,32,"Sunny");
	u8g2_DrawStr(&u8g2,0,48,"");
	u8g2_DrawStr(&u8g2,0,64,"Enter to Return");																						
}

void fun_a32()    
{	
	u8g2_DrawStr(&u8g2,0,16,"BeiJing Weather");
	u8g2_DrawStr(&u8g2,0,32,"Sunny");
	u8g2_DrawStr(&u8g2,0,48,"");
	u8g2_DrawStr(&u8g2,0,64,"Enter to Return");																					
}

void fun_a33()    
{	
	u8g2_DrawStr(&u8g2,0,16,"ShangHai Weather");
	u8g2_DrawStr(&u8g2,0,32,"Sunny");
	u8g2_DrawStr(&u8g2,0,48,"");
	u8g2_DrawStr(&u8g2,0,64,"Enter to Return");																						
}

void fun_b31()    
{	
	u8g2_DrawStr(&u8g2,0,16,"*** Music ***");
	u8g2_DrawStr(&u8g2,0,32,"WindyHill");
	u8g2_DrawStr(&u8g2,0,48,"");
	u8g2_DrawStr(&u8g2,0,64,"Enter to Return");																						
}

void fun_b32()    
{	
	u8g2_DrawStr(&u8g2,0,16,"*** Music ***");
	u8g2_DrawStr(&u8g2,0,32,"New Boy");
	u8g2_DrawStr(&u8g2,0,48,"");
	u8g2_DrawStr(&u8g2,0,64,"Enter to Return");																						
}

void fun_b33()    
{	
	u8g2_DrawStr(&u8g2,0,16,"*** Music ***");
	u8g2_DrawStr(&u8g2,0,32,"Kill The Rain");
	u8g2_DrawStr(&u8g2,0,48,"");
	u8g2_DrawStr(&u8g2,0,64,"Enter to Return");																							
}

void fun_c31()    
{	
	u8g2_DrawStr(&u8g2,0,16,"WiFI info");
	u8g2_DrawStr(&u8g2,0,32,"ssid:xxx");
	u8g2_DrawStr(&u8g2,0,48,"passwd:xxx");
	u8g2_DrawStr(&u8g2,0,64,"Enter to Return");																						
}

void fun_c32()    
{	
	u8g2_DrawStr(&u8g2,0,16,"Volume info");
	u8g2_DrawStr(&u8g2,0,32,"volume:xx");
	u8g2_DrawStr(&u8g2,0,48,"");
	u8g2_DrawStr(&u8g2,0,64,"Enter to Return");																						
}

void fun_c33()    
{	
	u8g2_DrawStr(&u8g2,0,16,"Version info");
	u8g2_DrawStr(&u8g2,0,32,"version:V1.0.0");
	u8g2_DrawStr(&u8g2,0,48,"");
	u8g2_DrawStr(&u8g2,0,64,"Enter to Return");																					
}

/*********第0层***********/
void fun_0()
{
	u8g2_DrawStr(&u8g2,0,16,"STM32");
	u8g2_DrawStr(&u8g2,0,32,"Multi Menu Test");
	u8g2_DrawStr(&u8g2,0,48,"");
	u8g2_DrawStr(&u8g2,0,64,"Enter to Test");		
}

ec11&key控制菜单

 

ec11设置encoder模式对应PA11\PA12按键对于PA3         

TIM4初始化

    __HAL_TIM_CLEAR_IT(&htim4,TIM_IT_UPDATE);
	HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_ALL);
	__HAL_TIM_ENABLE_IT(&htim4,TIM_IT_UPDATE);

TIM4回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	
 if(htim==&htim4)
	{
		val=(uint32_t)(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim4));
		if(val==1)
		{
			enc++;
            func_index = table[func_index].down;    //向下翻
		}
		else
        {
            enc--;
            func_index = table[func_index].up;    //向上翻
        }
	}
}

key.c

#include "key.h"




KEY Key[6];




void Task_Key(void)
{
	uint8_t i=0;
	for(i=1;i<6;i++)
	{
		switch(Key[i].flag)
		{
			case 's'://短按松手
			{
				
				switch(i)
				{
					
					case 1:
					{
                        func_index = table[func_index].up;    //向上翻
						
					}	break;
					case 2:
					{
						func_index = table[func_index].down;    //向下翻
			
                            
				
					}	break;
					case 3:
					{
                        func_index = table[func_index].enter;    //确认
						
					}	break;
					case 4:
					{
                        func_index = table[func_index].menu;    
					}	break;
                    case 5:
					{
                        func_index = table[func_index].enter;    //确认
					}break;
				}
				Key[i].flag='n';//等待
				
			}
			break;
			case 'l'://长按松手
			{
				switch(i)
				{
					
					case 1:
					{
	
					}	break;
					case 2:
					{
				
					}	break;
					case 3:
					{
		
					}	break;
					
                    case 4:
					{
			
					}	break;
                    case 5:
					{
                          func_index = table[func_index].menu;  
					}	break;
                    
				}
				Key[i].flag='n';
				
			}	
			break;
			case 'w'://长按
			{
				switch(i)
				{
					
					case 1:
					{

					}	break;
					case 2:
					{
				
					}	break;
					case 3:
					{
		
					}	break;
					case 4:
					{
			
					}	break;
                    case 5:
					{
                        func_index = table[func_index].down;    //向下翻
					}	break;
				}	
			}
			break;	
		}
		
	}
		
}




void KeyScan(void)
{
	uint8_t i=0;
	Key[1].press=B1;
	Key[2].press=B2;
	Key[3].press=B3;
	Key[4].press=B4;
    Key[5].press=B5;
	for(i=1;i<6;i++)
	{
		switch(Key[i].state)
		{
			case 0:
			{
				if(Key[i].press==0)Key[i].state=1;
			}
			break;
			case 1:
			{
				if(Key[i].press==0)
				{
					Key[i].val=1;
					Key[i].state=2;	
					
				}
				else Key[i].state=0;
			}	
			break;		
			case 2:
			{
				if(Key[i].press==0)
				{
						Key[i].Press_TIME=Key[i].Press_TIME+10;	
						if(Key[i].Press_TIME> 1000) { if(++Key[i].longPress_TIME%10 == 0) Key[i].flag = 'w' ; }
				}
				else 
				{
					Key[i].state=0;
					if(Key[i].Press_TIME <= 1000) {Key[i].flag = 's' ;  Key[i].Press_TIME=20; }
					if(Key[i].Press_TIME > 1000) { Key[i].flag = 'l' ; Key[i].longPress_TIME = 0 ; Key[i].Press_TIME=20; } 
				}
			}	
			break;
			default:break;	
		}
	}
	
}


最后app.c

#include "APP.h"

void (*current_operation_index)();
uint16_t key_tt=0;
uint16_t lcd_tt=0;
uint16_t lcd_ref=0;
uint32_t val=0;
int32_t enc=0;
uint8_t str[20];
uint8_t LCD_Show=0;
void TASKTIME(void)
{
    if(++lcd_tt==300){lcd_tt=0;lcd_ref=1;}
     if(++key_tt==10){key_tt=0;KeyScan();}
}


void INIT(void)
{
    LED_Close();
    LCD_Init();
     LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	LCD_ClearLine(Line0);
	LCD_ClearLine(Line1);
	LCD_ClearLine(Line2);
	LCD_ClearLine(Line3);
	LCD_ClearLine(Line4);
	LCD_ClearLine(Line5);
	LCD_ClearLine(Line6);
	LCD_ClearLine(Line7);
	LCD_ClearLine(Line8);
	LCD_ClearLine(Line9);
    oled_init();
    LEDx_ON(LED);
    
    __HAL_TIM_CLEAR_IT(&htim4,TIM_IT_UPDATE);
	HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_ALL);
	__HAL_TIM_ENABLE_IT(&htim4,TIM_IT_UPDATE);
    
    testDrawProcess(&u8g2);
}

void Task_Display(void)
{
    switch (LCD_Show)
    {
    case 0:
    {
        LCD_DisplayStringLine(Line3, (unsigned char *)"         TEXT           ");
      
        sprintf((char *)str, "  enc:%2d     ", enc);
        LCD_DisplayStringLine(Line9, (uint8_t *)str);
    }
    break;
    case 1:
    {


        sprintf((char *)str, "           " );
        LCD_DisplayStringLine(Line9, str);
    }
    break;
    case 2:
    {
    }
    break;
    default:
        break;
    }
}
void appfunction(void) // 主函数while(1)中调用
{
//    u8g2_DrawCircle(&u8g2,64,32,10,U8G2_DRAW_ALL);  //在62,32位置画一个半径为10的圆
//    u8g2_SendBuffer(&u8g2);//发送显存到屏幕上
    if(lcd_ref==1)
    {
        lcd_ref=0;
        Task_Display();
    }
    Task_Key();
    if (func_index != last_index)
    {
        current_operation_index = table[func_index].current_operation;
        
        u8g2_ClearBuffer(&u8g2); 
        (*current_operation_index)();//执行当前操作函数
        u8g2_SendBuffer(&u8g2);
        
        last_index = func_index;
    }
    if(enc%10==0)
    {
        
    }
}



void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	
 if(htim==&htim4)
	{
		val=(uint32_t)(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim4));
		if(val==1)
		{
			enc++;
            func_index = table[func_index].down;    //向下翻
		}
		else
        {
            enc--;
            func_index = table[func_index].up;    //向上翻
        }
	}
}






void HAL_Delay_us(uint32_t us)//延时us函数
{//需要cubemx配置时SYS时基源选择SysTick
    __IO uint32_t currentTicks = SysTick->VAL;
  /* Number of ticks per millisecond */
  const uint32_t tickPerMs = SysTick->LOAD + 1;
  /* Number of ticks to count */
  const uint32_t nbTicks = ((us - ((us > 0) ? 1 : 0)) * tickPerMs) / 1000;
  /* Number of elapsed ticks */
  uint32_t elapsedTicks = 0;
  __IO uint32_t oldTicks = currentTicks;
  do {
    currentTicks = SysTick->VAL;
    elapsedTicks += (oldTicks < currentTicks) ? tickPerMs + oldTicks - currentTicks :
                    oldTicks - currentTicks;
    oldTicks = currentTicks;
  } while (nbTicks > elapsedTicks);
}



作者:特立独行独角兽

物联沃分享整理
物联沃-IOTWORD物联网 » STM32G431+OLED1306+U8G2+多级菜单+EC11编码器代码

发表回复