开云-手把手教你在单片机上移植GuiLite

手把手教你在单片机上移植GuiLite 时候:2024-12-14 19:53:48 手机看文章

扫描二维码随时随地手机看文章

比来在Github找到一个有趣的开源Gui框架:GuiLite。依照申明移植了GuiLite到STM32F4OLED屏幕上,阐发一下移植经验。 1、GuiLite介绍 GuiLite是一个开源的Gui框架,只依靠在一个单一的头文件库(GuiLite.h),不需要很复杂的文件治理,代码量和蔼可掬,GuiLite由4千行C++代码编写,单片机上也能流利运行,其最低的硬件运行要求以下:CPU主频ROM巨细RAM巨细 24 MHZ 29KB 9KB 同时GuiLite具有很强的跨平台特征: 撑持的操作系统:iOS/macOS/WatchOS,Android,Linux(ARM/x86-64),Windows(包括VR),RTOS… 乃至无操作系统的单片机 撑持的开辟说话:C/C++, Swift, Java, Javascript, C#, Golang… 撑持的第3方库:Qt, MFC, Winforms, CoCoa… 除此以外,GuiLite 供给一系列辅助开辟东西: ☁️完善的“云” + “物联网”解决方案:让你轻松把握全球IoT营业 撑持多说话,采取 UTF-8 编码;????撑持视频播放 资本建造东西为你定制本身的字体/图片资本 所见即所得的GUI结构东西 编译活跃度统计,和及时阐发 撑持3D Web 撑持Docker,一条号令启动。 2、GuiLite移植 2.1 硬件预备 STM32F407开辟板OLED屏幕 2.2 驱动预备 这里我利用STM32CubeMX 对开辟板进行外设设置装备摆设,开启STM32的硬件IIC,这里我用CubeMX开启后以下:设置装备摆设完成生成代码,同时将分派的堆空间增年夜:代码生成后,我们复制正点原子的OLED驱开工程代码到Hardware硬件目次下(本身建立一个该目次)在MDK里面添加文件,然后我们进行点窜,注释失落头文件里面关在端口的界说,同时添加三个类型宏界说然后我们进入oled.c文件,将void OLED_WR_Byte(u8 dat,u8 cmd)和 void OLED_Init(void)函数别离替代为下面的内容:OLED_WR_Byte:
void OLED_WR_Byte(u8dat,u8cmd) { if(cmd)HAL_I2C_Mem_Write( hi2c1,0x78,0x40,I2C_MEMADD_SIZE_8BIT, dat,1,0x100); else HAL_I2C_Mem_Write( hi2c1,0x78,0x00,I2C_MEMADD_SIZE_8BIT, dat,1,0x100);}
OLED_Init:
//初始化SSD1306 void OLED_Init(void) {OLED_WR_Byte(0xAE,OLED_CMD); //封闭显示 OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震动频率 OLED_WR_Byte(80,OLED_CMD); //[3:0],分频因子;[7:4],震动频率 OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数 OLED_WR_Byte(0X3F,OLED_CMD); //默许0X3F(1/64) OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移 OLED_WR_Byte(0X00,OLED_CMD); //默许为0 OLED_WR_Byte(0x40,OLED_CMD); //设置显示最先行[5:0],行数. OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置 OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/封闭 OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式 OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默许10; OLED_WR_Byte(0xA1,OLED_CMD); //段重界说设置,bit0:0,0- 1,0- OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描标的目的;bit3:0,通俗模式;1,重界说模式COM[N-1]- COM0;N:驱动路数 OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚设置装备摆设 OLED_WR_Byte(0x12,OLED_CMD); //[5:4]设置装备摆设 OLED_WR_Byte(0x81,OLED_CMD); //对照度设置 OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默许0X7F(亮度设置,越年夜越亮) OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期 OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE1;[7:4],PHASE2; OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH电压倍率 OLED_WR_Byte(0x30,OLED_CMD); //[6:4]000,0.65*vcc;001,0.77*vcc;011,0.83*vcc; OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,封闭;(白屏/黑屏) OLED_WR_Byte(0xA6,OLED_CMD); //设置显示体例;bit0:1,反相显示;0,正常显示 OLED_WR_Byte(0xAF,OLED_CMD); //开启显示 OLED_Clear();}
然后在main.c文件以下位置添加oled测试代码(记得添加头文件和头文件路径)下载法式,不雅看现象此 OLED 驱动的预备已完成,下一步就是移植 GuiLite 2.3 例程移植 起首,我们上GuiLite的例程展现官网:GuiLiteDemo,选择Hello例程,将此中的 UI_Code文件夹复制到 Hardware 下:在 MDK 工程里面导入UICode下的GuiLite.h和UIcode.cpp文件我们在 main.c 文件开首添加 GuiLite 接口代码,接口代码以下:
//画点函数接口 void gfx_draw_pixel(int x, int y, unsigned int rgb) {OLED_DrawPoint(x,y,rgb);} //画面函数(未利用) void gfx_draw_fill(int x, int y,int w, int q, unsigned int rgb) {} //建立一个函数指针布局体 struct EXTERNAL_GFX_OP { void (*draw_pixel)(int x, int y, unsigned int rgb); void (*fill_rect)(int x0, int y0, int x1, int y1, unsigned int rgb);}my_gfx_op; extern void startHelloCircle(void*phy_fb, int width, int height, int color_bytes,structEXTERNAL_GFX_OP*gfx_op); //设定延时函数接口 void delay_ms(int milli_seconds) {HAL_Delay(milli_seconds);}
以后在main函数中添加以下代码
//传递函数指针 my_gfx_op.draw_pixel=gfx_draw_pixel;my_gfx_op.fill_rect= NULL;//gfx_fill_rect; //启动画圆 startHelloCircle(NULL, 128, 64, 1, my_gfx_op);
然后我们点窜UIcode.cpp文件中的代码,添加OLED头文件,和在UI履行函数界面处添加OLED刷新函数以后在UIcode的第8行点窜3D圆的参数,由于OLED巨细128x64 ,所以我的设置装备摆设以下:设置装备摆设完成后,我们封闭Use MicroLIB选项,编译代码编译成功,下载代码 3、Gui移植成果 下载完成后法式复位,可以在OLED上看到Demo的示例动画。 一些其他的演示结果 摆布滑动见更多 摆布滑动见更多

欲知详情,请下载word文档 下载文档

上一篇:开云-TopSemic嵌入式 下一篇:开云-FPGA 上使用 SVM 进行图像处理