2475|3

501

帖子

4

TA的资源

纯净的硅(高级)

楼主
 

【国产FPGA安路 高集成低功耗SF1系列FPSoC新品】移植ZLGGUI [复制链接]

 
本帖最后由 qinyunti 于 2023-3-6 22:55 编辑

前言

  前面我们测试了OLED的显示,有了OLED我们就可以进行一些界面的开发了。

由于本OLED是黑白的,且分辨率只有128x32,所以就移植精简的gui库。

这里选择很早以前的zlggui。

 

过程

我们基于oled_screen_display工程进行。

将文件夹ZLG_GUI复制到TN810_SF102\src\oled_screen_display\sdk_project\oled_screen_display\application下,刷新

 

 

 

添加头文件包含路径

 

 

我们需要实现lcmdrv.c中的函数

void  GUI_Exec(void)  刷新显存到OLED中

uint32_t  GUI_ReadPoint(uint16 x, uint16_t y, TCOLOR *ret)  获取一点的颜色值

void  GUI_Point(uint16 x, uint16_t y, TCOLOR color)写点的颜色值

void  GUI_FillSCR(TCOLOR dat)  填充整个屏幕指定颜色

void  GUI_Initialize(void) 初始化

完整的代码如下

#include "config.h"

//#include "common.h"

uint8_t oled_draw(void);

uint8_t oled_get_pixel(uint8_t x,uint8_t y);

void oled_set_pixel(uint8_t x,uint8_t y,uint8_t color);

uint8_t oled_fill(uint8_t color);

 

/****************************************************************************

* 名称:GUI_Initialize()

* 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。

* 入口参数:无

* 出口参数:无

* 说明:用户根据LCM的实际情况编写此函数。

****************************************************************************/

void  GUI_Initialize(void)

{

    

}

/****************************************************************************

* 名称:GUI_FillSCR()

* 功能:全屏填充。直接使用数据填充显示缓冲区。

* 入口参数:dat     填充的数据

* 出口参数:无

* 说明:用户根据LCM的实际情况编写此函数。

****************************************************************************/

 

void  GUI_FillSCR(TCOLOR dat)

{

oled_fill(dat);

 

}

/****************************************************************************

* 名称:GUI_ClearSCR()

* 功能:清屏。

* 入口参数:无

* 出口参数:无

* 说明:用户根据LCM的实际情况编写此函数。

****************************************************************************/

void  GUI_ClearSCR()

{

GUI_FillSCR(back_color);

}

/****************************************************************************

* 名称:GUI_Point()

* 功能:在指定位置上画点。

* 入口参数: x      指定点所在列的位置

*            y      指定点所在行的位置

*            color  显示颜色(对于黑白色LCM,为0时灭,为1时显示)

* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有

*          效范围)

* 说明:用户根据LCM的实际情况编写此函数。

****************************************************************************/

 

void  GUI_Point(uint16 x, uint16_t y, TCOLOR color)

{

oled_set_pixel(x,y,color);

 

}

/****************************************************************************

* 名称:GUI_ReadPoint()

* 功能:读取指定点的颜色。

* 入口参数:x       指定点所在列的位置

*           y       指定点所在行的位置

*           ret     保存颜色值的指针

* 出口参数:返回0表示指定地址超出缓冲区范围

* 说明:对于单色,设置re returnt的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,

*      RGB结构则R、G、B变量有效。

****************************************************************************/

uint32_t  GUI_ReadPoint(uint16 x, uint16_t y, TCOLOR *ret)

{

return oled_get_pixel(x,y);

 

}

/****************************************************************************

* 名称:GUI_HLine()

* 功能:画水平线。

* 入口参数: x0     水平线起点所在列的位置

*           y0      水平线起点所在行的位置

*           x1      水平线终点所在列的位置

*           color   显示颜色(对于黑白色LCM,为0时灭,为1时显示)

* 出口参数:无

* 说明:对于单色、4级灰度的液晶,可通过修改此函数作图提高速度,如单色LCM,可以一次更

*      新8个点,而不需要一个点一个点的写到LCM中。

****************************************************************************/

void  GUI_HLine(uint16 x0, uint16_t y0, uint16 x1, TCOLOR color)

{

    uint8  temp;

    if(x0>x1)               // 对x0、x1大小进行排列,以便画图

    {

        temp = x1;

        x1 = x0;

        x0 = temp;

    }

    do

    {

        GUI_Point(x0, y0, color);   // 逐点显示,描出垂直线

        x0++;

    }

    while(x1>=x0);

}

/****************************************************************************

* 名称:GUI_RLine()

* 功能:画垂直线。

* 入口参数: x0     垂直线起点所在列的位置

*           y0      垂直线起点所在行的位置

*           y1      垂直线终点所在行的位置

*           color   显示颜色

* 出口参数:无

* 说明:对于单色、4级灰度的液晶,可通过修改此函数作图提高速度,如单色LCM,可以一次更

*      新8个点,而不需要一个点一个点的写到LCM中。

****************************************************************************/

void  GUI_RLine(uint16 x0, uint16_t y0, uint8 y1, TCOLOR color)

{

    uint8  temp;

    if(y0>y1)       // 对y0、y1大小进行排列,以便画图

    {

        temp = y1;

        y1 = y0;

        y0 = temp;

    }

    do

    {

        GUI_Point(x0, y0, color);   // 逐点显示,描出垂直线

        y0++;

    }

    while(y1>=y0);

}

/****************************************************************************

* 名称:GUI_Exec()

* 功能:刷新屏幕          

*           

*           

*

*

*

****************************************************************************/

void  GUI_Exec(void)

{

oled_draw();

}

 

上述几个接口实际调用的是

uint8_t oled_draw(void);

uint8_t oled_get_pixel(uint8_t x,uint8_t y);

void oled_set_pixel(uint8_t x,uint8_t y,uint8_t color);

uint8_t oled_fill(uint8_t color);

 

其实现在

oled_display.c

 

产看手册SSD1306中显存与显示的对应关系

 

 

 

我们设置0x20指令值为0即水平地址映射模式,所以先COL0->COL127然后PAGE递增继续COL0->COL127。

一个PAGE对应8行即8个COM,bit0对应第一行,bit7对应第8行。

一个PAGE的第一个字节对应COL0,...第127字节对应COL127

void OLED_Frame(uint8_t* buffer)

{

int i,j;

int index = 0;

OLED_WriteC(0X20); // 设置GDDRAM模式

OLED_WriteC(0X00); // 水平寻址模式

OLED_WriteC(0X21); // 设置列起始和结束地址

OLED_WriteC(0X00); // 列起始地址 0

OLED_WriteC(0X7F); // 列终止地址 127

OLED_WriteC(0X22); // 设置页起始和结束地址

OLED_WriteC(0X04); // 页起始地址 0

OLED_WriteC(0X07); // 页终止地址 7

 

for(i=0; i<4; i++) // 写入一帧数据

{

for(j=0; j<128; j++)

{

OLED_WriteDat(buffer[index++]);

}

}

 

IIC_STOP();

}

 

命令0X21 设置col的范围0x00~0x7f即 0~127

命令0x22设置page的范围,从0x04~0x07开始,这是因为硬件上是接的从COM32~COM63即对应PAG4~PAGE7(这个是测试出来的)。

 

所以设计显存为volatile static uint8_t oled_display_data[4][128];

PAGE对应二维数组的下标0~3, COL对应二维i数组的下表0~127.

每一个字节数据对应8个bit,对应PAGE COL[j] 对应竖着的8个点,而在字节中的偏移对应从上往下的第几个点。

也就是点的操作如下 x为横坐标,y为纵坐标

void oled_set_pixel(uint8_t x,uint8_t y,uint8_t color)

{

uint8_t rcolor = oled_display_data[y>>3][x];

uint8_t offset = y&0x07;

if(color)

{

oled_display_data[y>>3][x] |= ((uint8_t)1<<offset);

}

else

{

oled_display_data[y>>3][x] &= (~((uint8_t)1<<offset));

}

}

 

最终驱动代码如下

#include <stdint.h>

#include "./inc/gpio_controler.h"

#include "./inc/oled_display.h"

#include <machine/_default_types.h>

 

 

volatile static uint8_t oled_display_data[4][128];

 

void oled_set_pixel(uint8_t x,uint8_t y,uint8_t color)

{

uint8_t rcolor = oled_display_data[y>>3][x];

uint8_t offset = y&0x07;

if(color)

{

oled_display_data[y>>3][x] |= ((uint8_t)1<<offset);

}

else

{

oled_display_data[y>>3][x] &= (~((uint8_t)1<<offset));

}

}

 

uint8_t oled_get_pixel(uint8_t x,uint8_t y)

{

uint8_t rcolor = oled_display_data[y>>3][x];

uint8_t offset = y&0x07;

if(oled_display_data[y>>3][x] & ((uint8_t)1<<offset))

{

return 1;

}

else

{

return 0;

}

}

 

uint8_t oled_draw(void)

{

OLED_Frame(oled_display_data);  //写入图像

}

 

uint8_t oled_fill(uint8_t color)

{

for(int i=0; i<4; i++)

{

for(int j=0; j<128; j++)

{

oled_display_data[j] = (color==0)?0:0xFF;

}

}

}

 

void anlogic_log_display(void)

{

int index=0;

#if 0

static int anlogic_log_data[512] =    {0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00,

0x0f, 0x80, 0x00, 0x00, 0x0f, 0x80, 0x00, 0xf0, 0x0f, 0x80, 0x00, 0xf8, 0x0f, 0x80, 0x00, 0x78,

0x07, 0x80, 0x00, 0x78, 0x07, 0xc0, 0x00, 0x78, 0x07, 0xc0, 0x00, 0x78, 0x07, 0xc0, 0x00, 0x78,

0x03, 0xe0, 0x00, 0x78, 0x03, 0xf0, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xfc, 0x01, 0xf8,

0x00, 0x7f, 0xc7, 0xf0, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xc0,

0x00, 0x03, 0xff, 0x80, 0x07, 0x00, 0x18, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00,

0x07, 0xff, 0xf8, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xf8,

0x00, 0x00, 0x7f, 0xf8, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00,

0x07, 0xc1, 0xe0, 0x00, 0x07, 0xc0, 0xff, 0x00, 0x07, 0x80, 0xff, 0xf0, 0x07, 0x80, 0xff, 0xf0,

0x07, 0x80, 0x7f, 0xf0, 0x07, 0x80, 0x71, 0xf8, 0x07, 0x80, 0x20, 0xf8, 0x07, 0x80, 0x20, 0x78,

0x07, 0x80, 0x00, 0x78, 0x07, 0xc0, 0x00, 0x78, 0x03, 0xc0, 0x00, 0x78, 0x03, 0xe0, 0x00, 0xf8,

0x03, 0xf0, 0x00, 0xf8, 0x01, 0xf8, 0x00, 0xf8, 0x00, 0xfc, 0x01, 0xf8, 0x00, 0x7f, 0x87, 0xf0,

0x00, 0x3f, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xc0, 0x00, 0x03, 0xff, 0x80,

0x00, 0x00, 0x7f, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0xff, 0xf8, 0x00,

0x01, 0xff, 0xfe, 0x00, 0x03, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x07, 0xf0, 0x3f, 0xe0,

0x0f, 0xc0, 0x0f, 0xe0, 0x0f, 0x80, 0x03, 0xf0, 0x0f, 0x80, 0x01, 0xf0, 0x0f, 0x80, 0x00, 0xf8,

0x0f, 0x80, 0x00, 0x78, 0x07, 0x80, 0x00, 0x78, 0x07, 0x80, 0x00, 0x78, 0x07, 0xc0, 0x00, 0x78,

0x03, 0xe0, 0x00, 0x78, 0x03, 0xf8, 0x00, 0xf8, 0x01, 0xfe, 0x01, 0xf8, 0x00, 0xff, 0x07, 0xf8,

0x00, 0x7f, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x07, 0xff, 0xc0,

0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x78,

0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x07, 0x00, 0x00, 0x78,

0x07, 0xf0, 0x00, 0x78, 0x07, 0xff, 0x80, 0x78, 0x07, 0xff, 0xf8, 0x78, 0x07, 0xff, 0xff, 0xf8,

0x07, 0xff, 0xff, 0xf8, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00, 0x0f, 0xf8,

0x08, 0x00, 0x00, 0x78, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00,

0x09, 0x24, 0x00, 0x00, 0x09, 0x24, 0x00, 0x00, 0x09, 0x24, 0x80, 0x00, 0x09, 0x24, 0x90, 0x00,

0x09, 0x24, 0x90, 0x00, 0x09, 0x24, 0x94, 0x00, 0x09, 0x24, 0x94, 0x80, 0x09, 0x24, 0x94, 0x90,

0x09, 0x24, 0x94, 0x80, 0x09, 0x24, 0x94, 0x30, 0x09, 0x24, 0x90, 0xf0, 0x09, 0x24, 0x93, 0xf0,

0x09, 0x24, 0x8f, 0xf0, 0x09, 0x24, 0x3f, 0xf0, 0x09, 0x24, 0xff, 0xe0, 0x09, 0x23, 0xff, 0x80,

0x09, 0x0f, 0xfe, 0x00, 0x08, 0x3f, 0xf8, 0x10, 0x08, 0xff, 0xe0, 0x70, 0x03, 0xff, 0x80, 0xf0,

0x07, 0xff, 0x00, 0xf0, 0x03, 0xff, 0xc0, 0xf0, 0x00, 0x7f, 0xf0, 0xf0, 0x00, 0x1f, 0xfc, 0xf0,

0x00, 0x07, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 0x1f, 0xf0,

0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x10};

 

    //图像数据映射为SSD1306的显示数据

for(int j=0; j<128; j++)

{

for(int i=7; i>=0; i--)

{

if(i > 3)

{

oled_display_data[j] = anlogic_log_data[index];

index++;

}

else

oled_display_data[j] = 0x00;

}

}

#endif

//memset(oled_display_data,0,sizeof(oled_display_data));

OLED_Init();      //初始化

OLED_WriteC(0x2e);//关闭滚动

oled_fill(1);

oled_draw();

oled_fill(0);

oled_draw();

//OLED_Clear(0x00);     //清屏

//OLED_Clear(0xFF);

 

 

//OLED_Frame(oled_display_data);  //写入图像

 

//OLED_WriteC(0x27);  //水平向左或者右滚动 26/27

//OLED_WriteC(0x00);  //虚拟字节

//OLED_WriteC(0x00);  //起始页 0

//OLED_WriteC(0x07);  //滚动时间间隔

//OLED_WriteC(0x07);  //终止页 7

//OLED_WriteC(0x00);  //虚拟字节

//OLED_WriteC(0xff);  //虚拟字节

//OLED_WriteC(0x2f);  //开启滚动

}

 

void display_horizontal_scroll_enable()

{

OLED_WriteC(0x2f);//开启滚动

}

 

void display_horizontal_scroll_disable()

{

OLED_WriteC(0x2e);//关闭滚动

}

 

void oled_display_reset()

{

gpio_wr(4,0);

delay_1us(10000);

gpio_wr(4,1);

delay_1us(10000);

}

 

void OLED_WriteD(int dat)

{

IIC_START(); // 通信开始

IIC_Write(0X78); // 写从机地址'0111 100' 读写符号'0'

IIC_WaitACK();

IIC_Write(0X40); // 写数据 Co='0' C/D='100 0000'

IIC_WaitACK();

IIC_Write(dat); // 写入数据

IIC_WaitACK();

}

 

void OLED_WriteC(int cmd)

{

IIC_START(); // 通信开始

IIC_Write(0X78); // 写从机地址'0111 100' 读写符号'0'

IIC_WaitACK();

IIC_Write(0X00); // 写命令 Co='0' C/D='000 0000'

IIC_WaitACK();

IIC_Write(cmd); // 写入命令

IIC_WaitACK();

}

 

void OLED_WriteDat(int dat)

{

OLED_WriteD(dat);

IIC_STOP(); // 通信结束

}

 

void OLED_WriteCmd(int cmd)

{

OLED_WriteC(cmd);

IIC_STOP(); // 通信结束

}

 

void OLED_Init(void)

{

oled_display_reset();

 

OLED_WriteC(0XAE); // 关OLED显示

// 基础设置

OLED_WriteC(0XA4); // 输出GDDRAM内容

OLED_WriteC(0XA6); // 正常显示(1亮0灭)

OLED_WriteC(0X81); // 设置对比度

OLED_WriteC(0X7F); // 第127级对比度

// COM和SEG输出设置

OLED_WriteC(0XD3); // 设置垂直显示偏移(向上)

OLED_WriteC(0X00); // 偏移0行

OLED_WriteC(0X40); // 设置GDDRAM起始行 0

OLED_WriteC(0XA8); // 设置MUX数 (显示行数)

OLED_WriteC(0X3F); //  MUX=63  (显示63行)

OLED_WriteC(0XA1); // 左右反置关(段重映射)

OLED_WriteC(0XC8); // 上下反置关(行重映射)

OLED_WriteC(0XDA); // 设置COM引脚配置

OLED_WriteC(0X02); // 序列COM配置,禁用左右反置

// 时钟设置

OLED_WriteC(0XD5); // 设置DCLK分频和OSC频率

OLED_WriteC(0X80); // 无分频,第8级OSC频率

// 开OLED

OLED_WriteC(0X8D); // 启用电荷泵

OLED_WriteC(0X14); // 启用电荷泵

OLED_WriteC(0XAF); // 开OLED显示

 

IIC_STOP();

}

 

void OLED_Clear(uint8_t color)

{

int i,j;

OLED_WriteC(0X20);     // 设置GDDRAM模式

OLED_WriteC(0X00); // 水平寻址模式

OLED_WriteC(0X21); // 设置列起始和结束地址

OLED_WriteC(0X00); // 列起始地址 0

OLED_WriteC(0X7F); // 列终止地址 127

OLED_WriteC(0X22); // 设置页起始和结束地址

OLED_WriteC(0X04); // 页起始地址 0

OLED_WriteC(0X07); // 页终止地址 7

 

for(i=0; i<4; i++) // 写入一帧数据

{

for(j=0; j<128; j++)

{

OLED_WriteDat(color);

}

}

 

IIC_STOP();

}

 

void OLED_Frame(uint8_t* buffer)

{

int i,j;

int index = 0;

OLED_WriteC(0X20); // 设置GDDRAM模式

OLED_WriteC(0X00); // 水平寻址模式

OLED_WriteC(0X21); // 设置列起始和结束地址

OLED_WriteC(0X00); // 列起始地址 0

OLED_WriteC(0X7F); // 列终止地址 127

OLED_WriteC(0X22); // 设置页起始和结束地址

OLED_WriteC(0X04); // 页起始地址 0

OLED_WriteC(0X07); // 页终止地址 7

 

for(i=0; i<4; i++) // 写入一帧数据

{

for(j=0; j<128; j++)

{

OLED_WriteDat(buffer[index++]);

}

}

 

IIC_STOP();

}

 

//----------------------------------内部函数内容-----------------------------------//

 

void IIC_START(void)

{

SCL_Low(); // SCL拉低 防止可能出现的各种误动作

delay1us();

SDA_High(); // SDA拉高

SCL_High(); // SCL拉高 准备发出起始信号

delay1us();

SDA_Low(); // SDA拉低 发出起始信号

SCL_Low(); // SCL拉低 开始传输

}

 

void IIC_STOP(void)

{

SCL_Low(); // SCL拉低 防止可能出现的各种误动作

SDA_Low(); // SDA拉低

delay1us();

SCL_High(); // SCL拉高 准备发出结束信号

delay1us();

SDA_High(); // SDA拉高 发出结束信号

}

 

int IIC_WaitACK(void)

{

int s;

SCL_Low(); // 拉低SCL

delay1us();

SDA_High(); // 拉高SDA 主机释放总线

delay1us();

SCL_High(); // 拉高SCL

delay1us();

s = SDA_read(); // 采集SDA信号线状态

delay1us();

SCL_Low(); // 拉低SCL 结束询问ACK

if(s)

return 0; // 无应答(ACK)

else

return 1; // 有应答(ACK)

}

 

void IIC_Write(int dat)

{

int i;

int temp;

 

for(i=0; i<8; i++)

{

temp = dat & 0x80;

if(temp == 0x80)

SDA_High();

else

SDA_Low();

dat <<= 1; // 数据格式:高位在前

delay1us();

SCL_High(); // 拉高SCL 发送数据

delay1us();

SCL_Low(); // 拉低SCL 结束发送

}

}

 

void delay1us(void)

{

delay_1us(2);

}

 

 

void SCL_Low(void)

{

gpio_wr(0,0);

}

 

void SCL_High(void)

{

gpio_wr(0,1);

}

 

void SDA_Low(void)

{

gpio_wr(1,0);

}

 

void SDA_High(void)

{

// gpio_wr(1,1);

gpio_rd(1);

}

 

void LED_High(void)

{

gpio_wr(2,1);

}

 

void LED_Low(void)

{

gpio_wr(2,0);

}

 

int SDA_read(void)

{

int temp;

 

temp = gpio_rd(1);

 

if(temp == 1)

return 1;

else

return 0;

}

 

测试

我们调用zlggui的接口进行测试

GUI_CONFIG.h中可以进行各模块的使能配置,我们使用8x8的字体打印Hello SF1-FPSoC

所以使能配置#define  FONT8x8_EN 1

 

主函数中

int main(void)

{  

//printf("Hello World\r\n");

anlogic_log_display();

 

GUI_SetColor(1,0);

GUI_PutString(0,0,"Hello SF1-FPSoC");

    while(1)

    {

     GUI_Exec();

    }

 

    return 0;

}

 

可以看到oled中正确打印

 

 

ZLGGUI相关的接口看代码即可,都比较简单,比如基本的画图,窗口,菜单等。这里不再赘述。

总结

以上移植了比较小巧的gui-ZLGGUI,基于此就可以进行更多的ui交互开发,虽然iic驱动是使用io口模拟的,但是得益于RISC-V核本身还不错的性能所以刷屏效果还不错。

完整工程和oled的参考手册见附件

oled_screen_display.zip (25.72 MB, 下载次数: 1) SSD1306.pdf (1.79 MB, 下载次数: 0)

最新回复

好的,明白了,谢谢解释   详情 回复 发表于 2023-3-13 07:26
点赞(1) 关注(1)
 
 

回复
举报

6587

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

选择以前的zlggui是个什么意思呢

点评

很多年前周立功出的一个很精简的gui组件库,在mcu上用的也比较多。当时是uCGUI/emWIN最流行的时候,zlggui比其简单很多,一些小的应用上也比较合适。  详情 回复 发表于 2023-3-12 17:33
 
 
 

回复

501

帖子

4

TA的资源

纯净的硅(高级)

板凳
 
Jacktang 发表于 2023-3-12 10:06 选择以前的zlggui是个什么意思呢

很多年前周立功出的一个很精简的gui组件库,在mcu上用的也比较多。当时是uCGUI/emWIN最流行的时候,zlggui比其简单很多,一些小的应用上也比较合适。

点评

好的,明白了,谢谢解释  详情 回复 发表于 2023-3-13 07:26
 
 
 

回复

6587

帖子

0

TA的资源

五彩晶圆(高级)

4
 
qinyunti 发表于 2023-3-12 17:33 很多年前周立功出的一个很精简的gui组件库,在mcu上用的也比较多。当时是uCGUI/emWIN最流行的时候,zlggu ...

好的,明白了,谢谢解释

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表