linux应用程序_1_文本浏览器_4_display_2_两种显示设备

本文深入剖析了Linux中两种显示设备驱动的实现细节,包括ARM板连接的LCD和控制台的图片模式。通过具体示例on_pc.c和fb.c,详细讲解了设备初始化、像素绘制和屏幕清理等功能的代码实现,以及调色板设置和颜色转换过程。

 linux应用程序_1_文本浏览器_4_display_2_两种显示设备

 

显示设备:

1、ARM板连接的LCD

2、linux中的控制台(图片模式)

 

以on_pc.c为例分析

设置显示结构体

static T_DispOpr g_tOnpucDispOpr = {
	.pcName      = "onpc",

	.iBpp        = BPP;
	.iXres       = XRES;
	.iYres       = YRES;

	.DeviceInit  = OnpucDeviceInit,
	.DeviceExit  = OnpucDeviceExit,
	.ShowPixel   = OnpucShowPixel,
	.CleanScreen = OnpucCleanScreen,
};

 

设备初始化:

初始化vga库

进入图片模式(320*200,8位真彩色)

static int OnpucDeviceInit(void)
{
	vga_init();
	vga_setmode(G320x200x256);	

	return 0;
}

设备出口:

切换为文本显示模式

static void OnpucDeviceExit(void)
{
	vga_setmode(TEXT);
}

 

设置调色板(顺便取色):

在画点、清屏之前,先设置调色板、并选择颜色,再进行操作

static void SetPalette(unsigned int dwColor, unsigned int iNum)
{
	int iR, iG, iB;
	
	iR = (dwColor >> 16) & 0xff;
	iG = (dwColor >> 8) & 0xff;	
	iB = (dwColor >> 0) & 0xff;	
	
	gl_setpalettecolor(iNum, iR>>2, iG>>2, iB>>2);
	vga_setcolor(iNum);

}

 

 

对于fb.c,这里只分析设备初始化:

1、打开设备

2、获取不变参数fix、可变参数var

3、设置结构体参数,供上层使用

static int FBDeviceInit(void)
{
	g_iFBFd = open(FB_DEVICE_NAME,O_RDWR);
	if(g_iFBFd < 0)
	{
		DBG_PRINT("can't open /dev/fb0\r\n");
		return -1;
	}
	
	if(ioctl(g_iFBFd,FBIOGET_VSCREENINFO,&g_tVar))	
	{
		DBG_PRINT("can't get g_tVar\r\n");
		return -1;
	}	
	if(ioctl(g_iFBFd,FBIOGET_FSCREENINFO,&g_tVFix))
	{
		DBG_PRINT("can't get g_tVFix\r\n");
		return -1;	
	}	
	g_iScreenZize = g_tVar.xres * g_tVar.yres * g_tVar.bits_per_pixel / 8;	
	g_ucFbMem = (unsigned char *)mmap(NULL,g_iScreenZize,PROT_READ | PROT_WRITE , MAP_SHARED, g_iFBFd, 0);	
	if(g_ucFbMem == (unsigned char *)-1)
	{
		DBG_PRINT("can't mmap\r\n");
		return -1;
	}
	g_tFBDispOpr.iXres = g_tVar.xres;
	g_tFBDispOpr.iYres = g_tVar.yres;
	g_tFBDispOpr.iBpp  = g_tVar.bits_per_pixel;
	DBG_PRINT("xres:%d , yres:%d , bpp:%d\r\n", g_tFBDispOpr.iXres, g_tFBDispOpr.iYres, g_tFBDispOpr.iBpp);
	g_iPixelWidth = g_tVar.bits_per_pixel / 8;
	g_iLineWidth = g_tVar.xres * g_iPixelWidth;

	return 0;
}

 

 

 

完整代码:

fb.c

#include <config.h>
#include <disp_manager.h>
#include <fonts_manager.h>
#include <encoding_manager.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <string.h>


static int FBDeviceInit(void);
static int FBShowPixel(int iPenX, int iPenY,unsigned int dwColor);
static int FBCleanScreen(unsigned int dwColor);

static int g_iFBFd;
static struct fb_var_screeninfo g_tVar;
static struct fb_fix_screeninfo g_tVFix;
static int g_iPixelWidth;
static int g_iLineWidth;
static int g_iScreenZize;
static unsigned char *g_ucFbMem;

static T_DispOpr g_tFBDispOpr = {
	.pcName 		 = "fb",
	.DeviceInit  = FBDeviceInit,
	.ShowPixel   = FBShowPixel,
	.CleanScreen = FBCleanScreen,
};
	
static int FBDeviceInit(void)
{
	g_iFBFd = open(FB_DEVICE_NAME,O_RDWR);
	if(g_iFBFd < 0)
	{
		DBG_PRINT("can't open /dev/fb0\r\n");
		return -1;
	}
	
	if(ioctl(g_iFBFd,FBIOGET_VSCREENINFO,&g_tVar))	
	{
		DBG_PRINT("can't get g_tVar\r\n");
		return -1;
	}	
	if(ioctl(g_iFBFd,FBIOGET_FSCREENINFO,&g_tVFix))
	{
		DBG_PRINT("can't get g_tVFix\r\n");
		return -1;	
	}	
	g_iScreenZize = g_tVar.xres * g_tVar.yres * g_tVar.bits_per_pixel / 8;	
	g_ucFbMem = (unsigned char *)mmap(NULL,g_iScreenZize,PROT_READ | PROT_WRITE , MAP_SHARED, g_iFBFd, 0);	
	if(g_ucFbMem == (unsigned char *)-1)
	{
		DBG_PRINT("can't mmap\r\n");
		return -1;
	}
	g_tFBDispOpr.iXres = g_tVar.xres;
	g_tFBDispOpr.iYres = g_tVar.yres;
	g_tFBDispOpr.iBpp  = g_tVar.bits_per_pixel;
	DBG_PRINT("xres:%d , yres:%d , bpp:%d\r\n", g_tFBDispOpr.iXres, g_tFBDispOpr.iYres, g_tFBDispOpr.iBpp);
	g_iPixelWidth = g_tVar.bits_per_pixel / 8;
	g_iLineWidth = g_tVar.xres * g_iPixelWidth;

	

	return 0;
}

static int FBShowPixel(int iPenX, int iPenY,unsigned int dwColor)
{
	unsigned char *pucPen8 = g_ucFbMem + iPenY * g_iLineWidth + iPenX * g_iPixelWidth;
	unsigned short *pwPen16;
	unsigned int *pdwPen32;
	unsigned int dwR,dwG,dwB;
	
	pwPen16 = (unsigned short *)pucPen8;
	pdwPen32 = (unsigned int *)pucPen8;	

	switch(g_tVar.bits_per_pixel)
	{
		case 8:
		{
			*pucPen8 = dwColor;
			break;
		}
		case 16:
		{
			dwR = (dwColor>>19) & 0x1f;
			dwG = (dwColor>>10) & 0x3f;
			dwB = (dwColor>>3) & 0x1f;
			dwColor = (dwR<<11) | (dwG<<5) | (dwB);
			*pwPen16 = dwColor;		
			break;
		}
		case 32:
		{
			*pdwPen32 = dwColor;
			break;
		}
		default:
		{
			DBG_PRINT("can't support %dbpp\r\n",g_tVar.bits_per_pixel);
			return -1;
		}
	}
	return 0;
}

static int FBCleanScreen(unsigned int dwColor)
{
	unsigned char *pwPen8 =  g_ucFbMem;
	unsigned short *pwPen16 = (unsigned short *)pwPen8;
	unsigned int *pdwPen32 = (unsigned int *)pwPen16;
	unsigned int dwR,dwG,dwB;
	int i;
		

	switch(g_tVar.bits_per_pixel)
	{
		case 8:
		{
			memset(pwPen8,dwColor,g_iScreenZize);
			break;
		}
		case 16:
		{
			dwR = (dwColor>>19) & 0x1f;
			dwG = (dwColor>>10) & 0x3f;
			dwB = (dwColor>>3) & 0x1f;
			dwColor = (dwR<<11) | (dwG<<5) | (dwB);
			for(i = 0;i < g_iScreenZize;i+=2)
			{
				*pwPen16 = dwColor;									
				pwPen16++;
			}
			break;
		}
		case 32:
		{
			for(i = 0;i < g_iScreenZize;i+=4)
			{
				*pdwPen32 = dwColor;									
				pdwPen32++;
			}
			break;
		}
		default:
		{
			DBG_PRINT("can't support %dbpp\r\n",g_tVar.bits_per_pixel);
			break;
		}
	}

	return 0;
}

int FBInit(void)
{
	RegisterDispOpr(&g_tFBDispOpr);
	return 0;
}


 

on_pc.c

#include <config.h>
#include <disp_manager.h>
#include <fonts_manager.h>
#include <encoding_manager.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <string.h>

#include <stdlib.h>
#include <vga.h>
#include <vgagl.h>

#define XRES	320
#define YRES	200
#define BPP     8

static int OnpucDeviceInit(void);
static int OnpucShowPixel(int iPenX, int iPenY,unsigned int dwColor);
static int OnpucCleanScreen(unsigned int dwColor);
static void OnpucDeviceExit(void);

static T_DispOpr g_tOnpucDispOpr = {
	.pcName      = "onpc",

	.iBpp        = BPP;
	.iXres       = XRES;
	.iYres       = YRES;

	.DeviceInit  = OnpucDeviceInit,
	.DeviceExit  = OnpucDeviceExit,
	.ShowPixel   = OnpucShowPixel,
	.CleanScreen = OnpucCleanScreen,
};
	
static int OnpucDeviceInit(void)
{
	vga_init();
	vga_setmode(G320x200x256);	

	return 0;
}

static void OnpucDeviceExit(void)
{
	vga_setmode(TEXT);
}

static void SetPalette(unsigned int dwColor, unsigned int iNum)
{
	int iR, iG, iB;
	
	iR = (dwColor >> 16) & 0xff;
	iG = (dwColor >> 8) & 0xff;	
	iB = (dwColor >> 0) & 0xff;	
	
	gl_setpalettecolor(iNum, iR>>2, iG>>2, iB>>2);
	vga_setcolor(iNum);

}

static int OnpucShowPixel(int iPenX, int iPenY,unsigned int dwColor)
{

	SetPalette(dwColor, 5);

	vga_drawpixel(iPenX, iPenY);


	return 0;
}

static int OnpucCleanScreen(unsigned int dwColor)
{
	int iX,iY;

	SetPalette(dwColor, 4);

	for(iY = 0;iY < g_tOnpucDispOpr.iYres;iY++)
		for(iX = 0;iX < g_tOnpucDispOpr.iXres;iX++)
			vga_drawpixel(iX, iY);			
		
	return 0;
}

int OnpucInit(void)
{
	RegisterDispOpr(&g_tOnpucDispOpr);
	
	return 0;
}



 

 

 

 

 

#include "lvgl/lvgl.h" #include "lvgl/demos/lv_demos.h" #include <unistd.h> #include <pthread.h> #include <time.h> #include <stdio.h> #include <stdlib.h> static const char * getenv_default(const char * name, const char * dflt) { return getenv(name) ?: dflt; } #if LV_USE_LINUX_FBDEV static void lv_linux_disp_init(void) { const char * device = getenv_default("LV_LINUX_FBDEV_DEVICE", "/dev/fb0"); lv_display_t * disp = lv_linux_fbdev_create(); lv_linux_fbdev_set_file(disp, device); } #elif LV_USE_LINUX_DRM static void lv_linux_disp_init(void) { const char * device = getenv_default("LV_LINUX_DRM_CARD", "/dev/dri/card0"); lv_display_t * disp = lv_linux_drm_create(); lv_linux_drm_set_file(disp, device, -1); } #elif LV_USE_SDL//当前使用的是SDL框架 static void lv_linux_disp_init(void) { const int width = atoi(getenv("LV_SDL_VIDEO_WIDTH") ?: "800"); const int height = atoi(getenv("LV_SDL_VIDEO_HEIGHT") ?: "480"); lv_sdl_window_create(width, height); } #else #error Unsupported configuration #endif /* //按钮点击事件处理函数 void btn_event(lv_event_t * e) { printf("button clicked\n"); } */ lv_obj_t * label;//把标签定义为全局变量,让所有函数都可以访问 lv_obj_t * img;//把图片定义为全局变量,让所有函数都可以访问 /* //定义一个颜色数组 static lv_color_t colors[10] = {0};//10种颜色 int color_index = 0;//颜色索引 void btn_event_1(lv_event_t * e) { printf("prev button clicked\n"); color_index++; if(color_index > 10)//防止越界 { color_index = 0; } lv_obj_set_style_text_color(label, arry[color_index], 0); } void btn_event_2(lv_event_t * e) { printf("next button clicked\n"); color_index++; if(color_index > 10)//防止越界 { color_index = 0; } lv_obj_set_style_text_color(label, arry[color_index], 0); } //初始化用户的UI界面 void init_ui(void) { //初始化颜色数组 arry[0] = lv_color_make(255, 0, 0); arry[1] = lv_color_make(0, 255, 0); arry[2] = lv_color_make(0, 0, 255); arry[3] = lv_color_make(255, 255, 0); arry[4] = lv_color_make(255, 0, 255); arry[5] = lv_color_make(0, 255, 255); arry[6] = lv_color_make(255, 255, 255); arry[7] = lv_color_make(0, 0, 0); arry[8] = lv_color_make(128, 128, 128); arry[9] = lv_color_make(64, 64, 64); //创建一个标签 lv_obj_t * label = lv_label_create(lv_scr_act()); //标签居中显示 lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); //设置标签的字体大小 lv_obj_set_style_text_font(label, &lv_font_montserrat_16, 0); //设置标签的文本内容 lv_label_set_text(label, "Hello, LVGL!"); //设置两个按钮 lv_obj_t * btn1 = lv_btn_create(lv_scr_act()); lv_obj_t * btn2 = lv_btn_create(lv_scr_act()); //设置按钮的大小 lv_obj_set_size(btn1, 100, 50); lv_obj_set_size(btn2, 100, 50); //设置按钮的位置 lv_obj_align(btn1, LV_ALIGN_CENTER, -100, 50); lv_obj_align(btn2, LV_ALIGN_CENTER, 100, 50); //创建两个标签在按钮上 lv_obj_t * label1 = lv_label_create(btn1); lv_obj_t * label2 = lv_label_create(btn2); //设置标签的文本内容 lv_label_set_text(label1, "prev"); lv_label_set_text(label2, "next"); //设置标签在按钮居中 lv_obj_align(label1, LV_ALIGN_CENTER, 0, 0); lv_obj_align(label2, LV_ALIGN_CENTER, 0, 0); //给按钮事件函数 lv_obj_add_event_cb(btn1, btn_event_1, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn2, btn_event_2, LV_EVENT_CLICKED, NULL); } */ /* //实现按钮切换图片的例 //初始化用户的UI界面 // 全局图片对象和索引 int current_img_index = 0; // 当前图片索引 const char *img_list[] = { // 图片路径列表 "A:./pic/1.bmp", "A:./pic/2.bmp", // 根据实际图片数量扩展 }; int img_count = sizeof(img_list) / sizeof(img_list[0]); // 图片总数 //图片事件 //制作一个图片浏览器,点击按钮实现图片上下切换 // prev按钮:切换到上一张图片(循环) void btn_event_1(lv_event_t *e) { current_img_index = (current_img_index - 1 + img_count) % img_count; lv_image_set_src(img, img_list[current_img_index]); // 更新图片 printf("prev button clicked, show image %d\n", current_img_index + 1); } // next按钮:切换到下一张图片(循环) void btn_event_2(lv_event_t *e) { current_img_index = (current_img_index + 1) % img_count; lv_image_set_src(img, img_list[current_img_index]); // 更新图片 printf("next button clicked, show image %d\n", current_img_index + 1); } void init_ui(void) { img = lv_image_create(lv_screen_active()); // 赋值给全局变量 lv_image_set_src(img, img_list[current_img_index]); // 初始显示第一张 lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); //设置两个按钮 lv_obj_t * btn1 = lv_btn_create(lv_scr_act()); lv_obj_t * btn2 = lv_btn_create(lv_scr_act()); //设置按钮的大小 lv_obj_set_size(btn1, 100, 50); lv_obj_set_size(btn2, 100, 50); //设置按钮的位置 lv_obj_align(btn1, LV_ALIGN_BOTTOM_LEFT, 10, 10); lv_obj_align(btn2, LV_ALIGN_BOTTOM_RIGHT, -10, 10); //创建两个标签在按钮上 lv_obj_t * label1 = lv_label_create(btn1); lv_obj_t * label2 = lv_label_create(btn2); //设置标签的文本内容 lv_label_set_text(label1, "prev"); lv_label_set_text(label2, "next"); //设置标签在按钮居中 lv_obj_align(label1, LV_ALIGN_CENTER, 0, 0); lv_obj_align(label2, LV_ALIGN_CENTER, 0, 0); //给按钮事件函数 lv_obj_add_event_cb(btn1, btn_event_1, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn2, btn_event_2, LV_EVENT_CLICKED, NULL); } */ // 电脑本地图片路径(替换为实际图片文件名) #define LOGIN_IMG_PATH "A:E:/Users/ASUS/Pictures/5.bmp" // 登录提示图 #define REGISTER_IMG_PATH "A:E:/Users/ASUS/Pictures/4.bmp" // 注册提示图 static void create_auto_del_img(const char *img_path) { // 创建图片对象 lv_obj_t *tips_img = lv_img_create(lv_scr_act()); // 设置图片源(直接使用电脑本地路径) lv_img_set_src(tips_img, img_path); // 图片居中显示 lv_obj_align(tips_img, LV_ALIGN_CENTER, 0, 0); // 调整图片大小(根据实际图片尺寸,这里以300x200为例) lv_obj_set_size(tips_img, 300, 200); // 3秒后自动删除图片 lv_timer_create( [](lv_timer_t *timer) { lv_obj_del(timer->user_data); // 删除图片 lv_timer_del(timer); // 删除定时器 }, 3000, // 3000ms = 3秒 tips_img ); } static void login_btn_event(lv_event_t *e) { printf("登录按钮点击,显示图片:%s\n", LOGIN_IMG_PATH); create_auto_del_img(LOGIN_IMG_PATH); } // 注册按钮点击:显示4.bmp static void register_btn_event(lv_event_t *e) { printf("注册按钮点击,显示图片:%s\n", REGISTER_IMG_PATH); create_auto_del_img(REGISTER_IMG_PATH); } //键盘例子 static void ta_event_cb(lv_event_t * e) { //获取事件号 lv_event_code_t code = lv_event_get_code(e); //获取触发事件的对象 lv_obj_t * ta = lv_event_get_target(e); //获取键盘对象 lv_obj_t * kb = lv_event_get_user_data(e); if(code == LV_EVENT_FOCUSED) //判断焦点是否进入 { lv_keyboard_set_textarea(kb, ta);//把键盘设置到对应的输入框 lv_obj_remove_flag(kb, LV_OBJ_FLAG_HIDDEN);//显示键盘 } if(code == LV_EVENT_DEFOCUSED) //判断是否焦点离开 { lv_keyboard_set_textarea(kb, NULL);//把键盘离开输入框 lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);//隐藏键盘 } } void my_keyboard(void) { /*Create a keyboard to use it with an of the text areas*/ lv_obj_t * kb = lv_keyboard_create(lv_screen_active());//创建键盘对象 /*Create a text area. The keyboard will write here*/ lv_obj_t * ta1; ta1 = lv_textarea_create(lv_screen_active());//创建文本输入框 lv_obj_align(ta1, LV_ALIGN_CENTER,0, -100);//设置输入框的位置 lv_obj_add_event_cb(ta1, ta_event_cb, LV_EVENT_ALL, kb);//添加文本输入框的事件,传递键盘对象 lv_textarea_set_placeholder_text(ta1, "Hello");//设置文本输入框的提示信息 //lv_obj_set_size(ta1, 140, 30);//设置文本输入框的大小 lv_textarea_set_one_line(ta1, true);//设置文本输入框为单行 lv_obj_t * ta2; ta2 = lv_textarea_create(lv_screen_active()); lv_obj_align(ta2, LV_ALIGN_CENTER, 0, -50); lv_obj_add_event_cb(ta2, ta_event_cb, LV_EVENT_ALL, kb); //lv_obj_set_size(ta2, 140, 30); lv_textarea_set_one_line(ta2, true);//设置文本输入框为单行 lv_obj_add_event_cb(ta2, ta_event_cb, LV_EVENT_ALL, kb);//添加第二个文本输入框的事件,传递键盘对象 lv_obj_add_event_cb(ta1, ta_event_cb, LV_EVENT_ALL, kb);//添加文本输入框的事件,传递键盘对象 //创建一个登录按钮 lv_obj_t *btn = lv_btn_create(lv_screen_active()); lv_obj_align_to(btn, ta2,LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); lv_obj_t *label = lv_label_create(btn); lv_label_set_text(label, "loin"); //创建一个注册按钮 lv_obj_t *btn2 = lv_btn_create(lv_screen_active()); lv_obj_align_to(btn2, ta2,LV_ALIGN_OUT_BOTTOM_RIGHT, -60, 0); lv_obj_t *label2 = lv_label_create(btn2); lv_label_set_text(label2, "register"); //给按钮事件函数 lv_obj_add_event_cb(btn, btn_event_1, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn2, btn_event_2, LV_EVENT_CLICKED, NULL); } int main(void) { lv_init();//初始化LVGL库 /*Linux display device init*/ lv_linux_disp_init();//Linux显示设备初始化 #if LV_USE_SDL printf("init input\n"); //初始化输入设备 //init input device lv_sdl_mouse_create(); //初始化鼠标 lv_sdl_keyboard_create(); //初始化键盘 lv_sdl_mousewheel_create(); //初始化鼠标滚轮 printf("init input end\n"); #endif /*Create a Demo*/ //创建一个Demo(例子) // lv_example_button_1(); // lv_demo_widgets(); // lv_demo_widgets_start_slideshow(); //lv_example_ime_pinyin_2(); /*Handle LVGL tasks*/ //在屏幕中创建一个对象 //例子:设置一个对象的位置与大小 //Create a Demo 创建例子 /*lv_obj_t *obj = lv_obj_create(lv_screen_active()); // 在当前显示器中创建一个对象 lv_obj_set_size(obj, 100, 100);// 设置对象的大小 lv_obj_align(obj,LV_ALIGN_CENTER,0,0); //lv_obj_set_pos(obj, 350, 190);// 设置对象的位置 //void lv_obj_set_align(obj, LV_ALIGN_TOP_LEFT,) //快速设置当前对象的位置 //lv_obj_align(obj,LV_ALIGN_BOTTOM_RIGHT,-30,-30); //快速设置当前对象的位置,且可以设置偏移量 lv_obj_t *obj1 = lv_obj_create(lv_screen_active()); // 在当前显示器中创建一个对象 lv_obj_set_size(obj1, 100, 100);// 设置对象的大小 lv_obj_align_to(obj1,obj,LV_ALIGN_OUT_BOTTOM_RIGHT,-100,0); */ /*Create a Demo 创建例子*/ /* lv_obj_t *obj = lv_obj_create(lv_screen_active()); // 在当前显示器中创建一个对象 // 设置对象的大小 lv_obj_set_size(obj, 300, 300); // 设置大对象的位置 lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0); // 在obj对象上再创建一个对象 lv_obj_t *obj1 = lv_obj_create(obj); lv_obj_set_size(obj1, 60, 60); lv_obj_align(obj1, LV_ALIGN_CENTER, 0, 0); lv_obj_t *obj2 = lv_obj_create(obj); lv_obj_set_size(obj2, 60, 60); lv_obj_align_to(obj2, obj1, LV_ALIGN_OUT_LEFT_MID,-40, 0); lv_obj_t *obj3 = lv_obj_create(obj); lv_obj_set_size(obj3, 60, 60); lv_obj_align_to(obj3, obj1, LV_ALIGN_OUT_RIGHT_MID,40, 0); lv_obj_t *obj4 = lv_obj_create(obj); lv_obj_set_size(obj4, 60, 60); lv_obj_align_to(obj4, obj1, LV_ALIGN_OUT_TOP_MID,0, -40); lv_obj_t *obj5 = lv_obj_create(obj); lv_obj_set_size(obj5, 60, 60); lv_obj_align_to(obj5, obj1, LV_ALIGN_OUT_BOTTOM_MID,0, 40); lv_obj_t *obj6 = lv_obj_create(obj); lv_obj_set_size(obj6, 60, 60); lv_obj_align_to(obj6, obj4, LV_ALIGN_OUT_LEFT_MID,-40, 0); lv_obj_t *obj7 = lv_obj_create(obj); lv_obj_set_size(obj7, 60, 60); lv_obj_align_to(obj7, obj4, LV_ALIGN_OUT_RIGHT_MID,40, 0); lv_obj_t *obj8 = lv_obj_create(obj); lv_obj_set_size(obj8, 60, 60); lv_obj_align_to(obj8, obj5, LV_ALIGN_OUT_LEFT_MID,-40, 0); lv_obj_t *obj9 = lv_obj_create(obj); lv_obj_set_size(obj9, 60, 60); lv_obj_align_to(obj9, obj5, LV_ALIGN_OUT_RIGHT_MID,40, 0); */ /* //创建一个标签对象 lv_obj_t *name = lv_label_create(lv_screen_active()); lv_label_set_text(name,"zhangsiman"); lv_obj_align(name,LV_ALIGN_CENTER,0,0); lv_obj_t *class = lv_label_create(lv_screen_active()); lv_label_set_text(class,"wulian4221"); lv_obj_align(class,LV_ALIGN_CENTER,0,30); lv_obj_t *xuehao = lv_label_create(lv_screen_active()); lv_label_set_text_fmt(xuehao,"202244021131"); lv_obj_align(xuehao,LV_ALIGN_CENTER,0,60); */ /* lv_obj_t *xuehao = lv_label_create(lv_screen_active()); lv_label_set_text_fmt(xuehao,"202244021131"); lv_obj_align(xuehao,LV_ALIGN_CENTER,0,0); lv_obj_set_style_text_font(xuehao,&lv_font_montserrat_24,0); lv_obj_set_style_text_color(xuehao, lv_color_make(255,0,0),0); */ /* 按钮事件 lv_obj_t *btn = lv_btn_create(lv_screen_active()); lv_obj_set_size(btn, 100, 50); lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0); lv_obj_t *label = lv_label_create(btn); lv_label_set_text(label, "Click me"); lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); lv_obj_add_event_cb(btn, btn_event, LV_EVENT_CLICKED, NULL); */ /* //图片例子 lv_obj_t *img = lv_image_create(lv_screen_active()); //设置图片路径名 //lv_img_set_src(img, "E:\\Users\\ASUS\\1.bmp"); lv_image_set_src(img, "A:./pic/1.bmp"); lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); */ /*实现按钮切换图片的例子 init_ui(); */ /*触摸屏按钮事件 #if LV_USE_LINUX_FBDEV //创建触摸屏驱动设备 lv_indev_t *touch = lv_evdev_create(LV_INDEV_TYPE_POINTER, "/dev/input/event0"); //校准触摸屏坐标 lv_evdev_set_calibration(touch, 0, 0, 1024, 600);//黑色边框的屏幕 #endif //创建一个按钮 lv_obj_t *btn = lv_button_create(lv_screen_active()); //设置按钮的大小 lv_obj_set_size(btn, 100, 50); //居中显示按钮 lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0); //添加按钮的事件函数 lv_obj_add_event_cb(btn, btn_event, LV_EVENT_CLICKED, NULL); */ my_keyboard(); while(1) { lv_timer_handler(); usleep(5000); } return 0; }
最新发布
10-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值