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); }
作者:特立独行独角兽