EmWin学习课堂_小白EmWin_EmWin快速入门_EmWin动态内存,显示和触摸屏_EmWin基础配置

EmWin学习课堂_小白EmWin_EmWin快速入门_EmWin动态内存,显示和触摸屏_EmWin基础配置一、先说说什么是EmWin,它就是一款中间软件包,弄好了之后,我们的界面设计就会变得很简单,在电脑GUI_Builder上做一个界面,生成.c文件,复制到自己的工程里面,我们的显示屏就能得到一模一样的功能。二、在我们使用一个带触摸和显示器的系统的时候,首先就是驱动他们,做完了就应该是这样的:也就是说我们的系统首先得有一个带触摸(不带也行)的系统,接着就是把这两个东西和EmWin关联起来…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、先说说什么是EmWin,它就是一款中间软件包,弄好了之后,我们的界面设计就会变得很简单,在电脑GUI_Builder上做一个界面,生成.c文件,复制到自己的工程里面,我们的显示屏就能得到一模一样的功能。

二、在我们使用一个带触摸和显示器的系统的时候,首先就是驱动他们,做完了就应该是这样的:

EmWin学习课堂_小白EmWin_EmWin快速入门_EmWin动态内存,显示和触摸屏_EmWin基础配置

也就是说我们的系统首先得有一个带触摸(不带也行)的系统,接着就是把这两个东西和EmWin关联起来。

三、EmWin基本上算是一个“系统”,一个调度显示和触摸的系统,系统也得有自己的地方,就是他需要自己的运行内存。

四、所以把EmWin移植到我们的开发板上我们需要以下三步:

       1、给EmWin一个运行内存

       2、把触摸得到的坐标点数据交给EmWin

       3、让EmWin能够在显示屏上作图,控制显示器

具体实现起来:

1、添加与EmWin有关的所有的文件,既然使用了EmWin,我们就应该可以找到文件夹,在我们的工程文件夹下加上一个EmWin文件夹,包括如下内容:

EmWin学习课堂_小白EmWin_EmWin快速入门_EmWin动态内存,显示和触摸屏_EmWin基础配置

里面具体什么不加以赘述,就是从EmWin的lib里面直接粘贴过来,最终在文件里面加上这些就可以了:

EmWin学习课堂_小白EmWin_EmWin快速入门_EmWin动态内存,显示和触摸屏_EmWin基础配置

在demo里面是一些界面,都是由GUI_Builder做出来的,再经过调用就可以显示出来了。

倒数第二个lib格式的文件对应的是keil,是EmWin的库文件,换言之我们不可见的,最核心的文件。使用IAR的话就添加一个IAR的lib就好

其余的文件就是关联和配置用的,我们下面来说说:

2、先给EmWin分配动态内存,

在GUIConfig.c文件里面:

#define USE_EXRAM  1    //    "1" 使用外部RAM
//设置EMWIN内存大小
#define GUI_NUMBYTES  (50*1024)
#define GUI_BLOCKSIZE 0X8000  //块大小


//GUI_X_Config
//初始化的时候调用,用来设置emwin所使用的内存
void GUI_X_Config(void) {
	if(USE_EXRAM) //使用外部RAM
	{
		U32 *aMemory = Mem_malloc(EXSRAM,GUI_NUMBYTES); //从外部SRAM中分配GUI_NUMBYTES
//字节的内存
		GUI_ALLOC_AssignMemory((void*)aMemory, GUI_NUMBYTES); //为存储管理系统分配一个
//存储块
		GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //设置存储快的平均尺寸,该区越大,可用的存
//储快数量越少
		GUI_SetDefaultFont(GUI_FONT_6X8); //设置默认字体
	}else        //使用内部RAM
	{
		U32 *aMemory = Mem_malloc(INSRAM,GUI_NUMBYTES); //从内部RAM中分配GUI_NUMBYTES字
//节的内存
		GUI_ALLOC_AssignMemory((U32 *)aMemory, GUI_NUMBYTES); //为存储管理系统分配一个存
//储块
		GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //设置存储快的平均尺寸,该区越大,可用的存
//储快数量越少
		GUI_SetDefaultFont(GUI_FONT_6X8); //设置默认字体
	}
}

 

我这个例程里面的地址是由mem_malloc函数分配的,但是事实上我们只是把相应的内部或者是外部RAM地址交给EmWin就好了,使用的函数是这两个:

GUI_ALLOC_AssignMemory((void*)aMemory, GUI_NUMBYTES); 
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); 

3、把显示屏几交给EmWin,具体首先应该实现显示屏的驱动,也就是可以在显示屏上画色块,画点,写文字,接着就是替换函数,简言之就是告诉EmWin“我是这么画这个点的,你要是画点的话就用这个函数啊!”,EmWin在构造一个界面的时候就会“好,我们就在这里画吧,一个点一个点画,怎么画点呢?就调用程序员给我的这个函数好了”,于是就实现了EmWin对显示屏LCD的控制:

在GUIDRV_Template.c文件里:

static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int PixelIndex) 
{
   LCD_Color_DrawPoint(x,y,PixelIndex);	
}

这个函数就是EmWin用于画点的函数,里面的函数是我们画点的函数:

/****************************************************************************
* 名    称: void LCD_Color_DrawPoint(u16 x,u16 y,u16 color)
* 功    能:在设置的坐标处画相应颜色(在该点写入自定义颜色)
* 入口参数:x:x坐标
            y:y坐标
            color 此点的颜色值
* 返回参数:无
* 说    明:color:写入此点的颜色值   UCGUI调用该函数
****************************************************************************/
void LCD_Color_DrawPoint(u16 x,u16 y,u16 color)
{	       
	 if(lcd_id==0X9341)
		{
			LCD_CMD=setxcmd; 
			LCD_DATA=(x>>8); 
			LCD_DATA=(x&0XFF);	 
			LCD_CMD=setycmd; 
			LCD_DATA=(y>>8); 
			LCD_DATA=(y&0XFF);
		}
	  else
		{
			if(dir_flag==1)x=lcd_width-1-x;  //横屏就是调转x,y坐标
			LCD_WriteReg(setxcmd,x);
			LCD_WriteReg(setycmd,y);
    }			
	  LCD_CMD=write_gramcmd; 
	  LCD_DATA=color; 
}	 

能看出来,这个就是我们经常用于画点的函数,以及到了基础的寄存器写入了,就是我们平常做的画点。

至此,EmWin就可以在我们的显示屏上画图了。

4、接着就是把触摸屏的数据交个EmWin

在GUI_X_Touch_Analog.c 文件里:

int  GUI_TOUCH_X_MeasureX(void) 
{
	return RTouch_Read_XorY(0xD0);  //CMD_RDX=0XD0
}


int  GUI_TOUCH_X_MeasureY(void) 
{	
	return RTouch_Read_XorY(0x90);  //CMD_RDY=0X90
}

这两个函数都是EmWin直接调用的,返回值就是我们的触摸屏的返回值就好,打开用作返回的两个函数:

/****************************************************************************
* 名    称: u16 RTouch_Read_XorY(u8 xy)
* 功    能:读取一个坐标值(x或者y)
* 入口参数:xoy:指令(CMD_RDX/CMD_RDY
* 返回参数: 读到的数据	   
* 说    明:连续读取5次数据,对这些数据升序排列, 然后去掉最低和最1个数,取平均值       
****************************************************************************/ 
u16 RTouch_Read_XorY(u8 xoy)
{
	u16 i, j;
	u16 buf[5];
	u16 sum=0;
	u16 temp;
	
	for(i=0;i<5;i++)buf[i] = SPI_Read_AD(xoy);		 		    
	for(i=0;i<5-1; i++)  //排序
	{
		for(j=i+1;j<5;j++)
		{
			if(buf[i]>buf[j])//升序排列
			{
				temp=buf[i];
				buf[i]=buf[j];
				buf[j]=temp;
			}
		}
	}	  
	sum=0;
	for(i=1;i<5-1;i++)sum+=buf[i];
	temp=sum/(5-2*1);
	return temp;   
} 

而那两个函数由GUI_TOUCH_Exec()函数,这个EmWin内部函数调用,这个函数就是扫描函数,定时扫描就好:

void TIM4_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) //溢出中断
	{
		TIM_ClearITPendingBit(TIM4,TIM_IT_Update);  //清除中断标志位
		GUI_TOUCH_Exec();
	}
}

定时器一定时间中断一次,扫描一下。
我们这样就将所有的有关于显示触摸的东西交给EmWin了

5、综上,首先有一个好使的带触摸屏系统,然后添加EmWin有关文件,之后把动态内存地址交给EmWin(动态内存地址不是片内RAM地址就是FSMC分配的片外RAM地址),把显示屏画点的权利交给EmWin,把触摸屏读点的权利交给EmWin。就可以通过在main函数里用GUI_INIT函数初始化EmWin,再调用demo里面的maintask();就可以实现票亮的界面了。

 

五、补充:以上是移植所需要的最主干的东西,具体的移植步骤我很快还会推出,另外刚才的获取触摸的方法不唯一,安富莱V6做的也很漂亮,我也会去写。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182090.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • WLAN基本知识之802.11标准「建议收藏」

    WLAN基本知识之802.11标准「建议收藏」文章目录WLAN技术基础1.4802.11标准介绍1.4.1IEEE802.11协议族成员1.4.2IEEE802.11标准与WiFi的世代1.4.3802.11a/b/g差异1.4.4802.11n1.4.5802.11n关键技术1.4.6IEEE802.11ac标准1.4.7IEEE802.ax标准(又称WiFi6)1.4.8WiFi6理论速率计算WLAN技术基础1.4802.11标准介绍1.4.1IEEE802.11协议族成员IEEE805.11无线工

  • C语言if语句的基本用法

    C语言if语句的基本用法C语言if语句的基本用法一、if…1.一般形式:if(表达式){语句;}表达式:a,用非0值表示真,用0表示真;b,if(flag)相当于if(1==flag)c,浮点数无法与0比较,只能用近似的值比较;例:(1e-6)相当于1×10的-6次方;2.用于单分支选择结构;3.如含有交叉关系,使用并列的if语句;例:输出两个整数中的最大值#inclu…

  • aspnetpager分页控件_如何自动分页

    aspnetpager分页控件_如何自动分页AspNetMvc分页控件,可自定义链接地址,开源分亨给大家先看效果图下载DLL文件,使用大家可进入讨论群160046333,进行讨论 一.如果你使用GET方式传递参数如http://www.CSDN.com/indx?id=1&page=5 调用方式如下:CSS样式:.Dcssa{padding:4px8px;border:1pxsolid#9

  • docker start容器失败_戴尔重装系统出现invalid

    docker start容器失败_戴尔重装系统出现invaliddocker出现GPGerror:Atleastoneinvalidsignaturewasencountered相关问题及解决方法。W:GPGerror:http://mirrors.tuna.tsinghua.edu.cn/debianbusterInRelease:Atleastoneinvalidsignaturewasencountered.E:Therepository’http://mirrors.tuna.tsinghua.edu.cn/d

    2022年10月13日
  • 代理模式proxy_网络代理设置

    代理模式proxy_网络代理设置代理模式 Proxy动机模式定义实例结构要点总结笔记动机在面向对象系统中,由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程额外的访问等),直接访问会给使用者,或者系统结构带来很多麻烦.如何在不是去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接曾是软件开发中常见的解决方式模式定义为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问实例朴素客户端要去使用process 但是process周围需要做很多事情class ISubject{p

  • java语言helloworld源代码[通俗易懂]

    java语言helloworld源代码[通俗易懂]java语言helloworld源代码publicclassHello{publicstaticvoidmain(String[]args){System.out.println(“hello,world”);}}

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号