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)
blank

相关推荐

  • realsense深度图像保存方法[通俗易懂]

    realsense深度图像保存方法[通俗易懂]一般使用realsense时会保存视频序列,当保存深度图像时,需要注意保存的图像矩阵的格式,不然可能造成深度值的丢失。在众多图像库中,一般会使用opencv中的imwrite()函数进行深度图像的保存。一般深度图像中深度值的单位是mm,因此一般使用np.uint16作为最终数据格式保存。例子:importnumpyasnpimportcv2deffun1(…

  • 大整数乘法的详解

    大整数乘法的详解一.问题由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算。尤其是乘法运算,下面就是大整数的乘法的过程(加减法都一样的原理)。二.解决问题的方法方法一(传统的相乘逐步相加)乘法规律,一个数的第i位和另一个数的第j位相乘,一定会累加到结果的第i+j位,结果的数组一个数组元素存2位数,最后对结果整除得到进位,mod得到余数就是i+j位的数字,最后打印出来。对于大整数比较方便的输入方法是,.

  • 【spring框架】spring的几个Annotation实现(下)

    【spring框架】spring的几个Annotation实现(下)

  • 网站接入微信扫码登录并获取用户基本信息(微信开放平台)

    网站接入微信扫码登录并获取用户基本信息(微信开放平台)现在的网站基本都接入微信登陆了,就好像下面这样的。只需要用微信扫一下二维码,这个网站就可以展示你的微信昵称和头像,免去注册账号和输入密码登录的步骤,还免去设置头像和昵称的步骤,所以是挺方便的。那么如何把自己的网站接入这个呢?首先咱们得先在微信开放平台注册账号并且创建一个网站应用,等待审核通过后就可以获得Appid和AppSecretbingqie并且还要设置回调域名,这个不多说。首…

  • JQuery-学习笔记03【基础——DOM操作】「建议收藏」

    JQuery-学习笔记03【基础——DOM操作】「建议收藏」JQuery-学习笔记03【基础——DOM操作】

  • Vue子组件调用父组件的方法「建议收藏」

    Vue子组件调用父组件的方法「建议收藏」Vue中子组件调用父组件的方法,这里有三种方法提供参考第一种方法是直接在子组件中通过this.$parent.event来调用父组件的方法父组件<template><div><child></child></div></template><script>importc…

发表回复

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

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