1.前言:
GUI含义为图形用户接口,与之对应的是CLI:命令行接口;在嵌入式系统中两种接口均各有优劣,但在产品端的角度,良好的图形用户接口是必要的,所以衍生出了许多GUI库,可供选择,选用成熟的GUI可以节省大量的开发时间,增强良好的用户体验。在进行GUI移植前,需要先验证lcd库的驱动是否正常。
项目概述:验证过程中移植了常用的字符库用于显示常见的ASCALL码,显示字符效果如下:
2.软件调试:
2.1高效工具:
2.1.1bin文件拷贝脚本
2.1.2图片文件拷贝脚本
2.2源代码
引用字库.h文件,添加接口api,等源码如下:
#include "font.h"
//LCD的画笔颜色和背景色
uint16_t POINT_COLOR=BLACK; //画笔颜色
uint16_t BACK_COLOR=WHITE; //背景色
//在指定位置显示一个字符
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16/24
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowChar(uint8_t x,uint8_t y,uint8_t num,uint8_t size,uint8_t mode)
{
uint8_t temp,t1,t;
uint8_t y0=y;
uint8_t csize=(size/8+((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数
num=num-' ';//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
for(t=0;t<csize;t++)
{
if(size==12)temp=asc2_1206[num][t]; //调用1206字体
else if(size==16)temp=asc2_1608[num][t]; //调用1608字体
else if(size==24)temp=asc2_2412[num][t]; //调用2412字体
// else return;
//没有的字库
for(t1=0;t1<8;t1++)
{
if(temp&0x80)lcd_draw_point(x,y,POINT_COLOR);
else if(mode==0)lcd_draw_point(x,y,BACK_COLOR);
temp<<=1;
y++;
// if(y>=lcddev.height)return; //超区域了
if((y-y0)==size)
{
y=y0;
x++;
// if(x>=lcddev.width)return; //超区域了
break;
}
}
}
}
//显示字符串
//x,y:起点坐标
//width,height:区域大小
//size:字体大小
//*p:字符串起始地址
void LCD_ShowString(uint8_t x,uint8_t y,uint16_t width,uint16_t height,uint8_t size,uint8_t *p)
{
uint8_t x0=x;
width+=x;
height+=y;
while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
{
if(x>=width){x=x0;y+=size;}
if(y>=height)break;//退出
LCD_ShowChar(x,y,*p,size,0);
x+=size/2;
p++;
}
}
void GUI_LcdTest(void)
{
LcdInit();
while (1)
{
LCD_ShowString(10,10,210,24,24,"NiobeU4^_^");
LCD_ShowString(10,50,200,16,16,"TFTLCD TEST");
LCD_ShowString(10,80,200,12,12,"2022/10/18");
LCD_ShowString(10,110,200,12,12,"By chenzhendong");
// DisplayTKR();
LcdPush();
LOS_Msleep(PIC_SPEED);
}
}
OHOS_APP_RUN(GUI_LcdTest);
2.3文件目录结构如下图所示:
3硬件接入:
使用开鸿智谷NiobeU4开发板套件,无需修改或添加任何元器件,即可完成本实验。
4实际效果:
实际效果如下图所示:
5结束:
Lcd驱动正常,已经具备GUI移植的前提条件,下一章将继续介绍GUI的移植。
更多回帖