前言 前面我们测试了tft的显示,进行了相应的优化,有了tft我们就可以进行一些界面的开发了。由于资源有限,我们就移植精简的gui库。这里选择很早以前的zlggui。 过程我们基于之前的tft测试工程进行。 将文件夹ZLG_GUI复制到USER下,添加代码
添加头文件包含路径
我们需要实现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_Ini tialize(void) 初始化 驱动代码如下 完整代码参见附件
lcmdrv.c
- #include "config.h"
- #include "Lcd_Driver.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)
- {
- Lcd_ClearF(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)
- {
- Gui_DrawPoint(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 0;
-
- }
- /****************************************************************************
- * 名称: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)
- {
- }
复制代码
测试我们调用zlggui的接口进行测试 GUI_CONFIG.h中可以进行各模块的使能配置,我们使用8x8的字体打印HelloWorld 所以使能配置#define FONT8x8_EN 1 主函数中 #include "config.h" GUI_SetColor(RED,BLACK); GUI_PutString(0,0,"HelloWorld"); while(1) { GUI_Exec(); } 可以看到tft中正确打印
ZLGGUI相关的接口看代码即可,都比较简单,比如基本的画图,窗口,菜单等。这里不再赘述。 总结以上移植了比较小巧的gui-ZLGGUI,基于此就可以进行更多的ui交互开发,虽然驱动是使用io口模拟的,但是得益于本身还不错的性能所以刷屏效果还不错。
|