EmWin学习课堂_小白EmWin_EmWin快速入门_EmWin动态内存,显示和触摸屏_EmWin基础配置
一、先說說什么是EmWin,它就是一款中間軟件包,弄好了之后,我們的界面設(shè)計就會變得很簡單,在電腦GUI_Builder上做一個界面,生成.c文件,復(fù)制到自己的工程里面,我們的顯示屏就能得到一模一樣的功能。
二、在我們使用一個帶觸摸和顯示器的系統(tǒng)的時候,首先就是驅(qū)動他們,做完了就應(yīng)該是這樣的:
也就是說我們的系統(tǒng)首先得有一個帶觸摸(不帶也行)的系統(tǒng),接著就是把這兩個東西和EmWin關(guān)聯(lián)起來。
三、EmWin基本上算是一個“系統(tǒng)”,一個調(diào)度顯示和觸摸的系統(tǒng),系統(tǒng)也得有自己的地方,就是他需要自己的運行內(nèi)存。
四、所以把EmWin移植到我們的開發(fā)板上我們需要以下三步:
1、給EmWin一個運行內(nèi)存
2、把觸摸得到的坐標(biāo)點數(shù)據(jù)交給EmWin
3、讓EmWin能夠在顯示屏上作圖,控制顯示器
具體實現(xiàn)起來:
1、添加與EmWin有關(guān)的所有的文件,既然使用了EmWin,我們就應(yīng)該可以找到文件夾,在我們的工程文件夾下加上一個EmWin文件夾,包括如下內(nèi)容:
里面具體什么不加以贅述,就是從EmWin的lib里面直接粘貼過來,最終在文件里面加上這些就可以了:
在demo里面是一些界面,都是由GUI_Builder做出來的,再經(jīng)過調(diào)用就可以顯示出來了。
倒數(shù)第二個lib格式的文件對應(yīng)的是keil,是EmWin的庫文件,換言之我們不可見的,最核心的文件。使用IAR的話就添加一個IAR的lib就好
其余的文件就是關(guān)聯(lián)和配置用的,我們下面來說說:
2、先給EmWin分配動態(tài)內(nèi)存,
在GUIConfig.c文件里面:
#define USE_EXRAM 1 // "1" 使用外部RAM
//設(shè)置EMWIN內(nèi)存大小
#define GUI_NUMBYTES (50*1024)
#define GUI_BLOCKSIZE 0X8000 //塊大小
//GUI_X_Config
//初始化的時候調(diào)用,用來設(shè)置emwin所使用的內(nèi)存
void GUI_X_Config(void) {
if(USE_EXRAM) //使用外部RAM
{
U32 *aMemory = Mem_malloc(EXSRAM,GUI_NUMBYTES); //從外部SRAM中分配GUI_NUMBYTES
//字節(jié)的內(nèi)存
GUI_ALLOC_AssignMemory((void*)aMemory, GUI_NUMBYTES); //為存儲管理系統(tǒng)分配一個
//存儲塊
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //設(shè)置存儲快的平均尺寸,該區(qū)越大,可用的存
//儲快數(shù)量越少
GUI_SetDefaultFont(GUI_FONT_6X8); //設(shè)置默認(rèn)字體
}else //使用內(nèi)部RAM
{
U32 *aMemory = Mem_malloc(INSRAM,GUI_NUMBYTES); //從內(nèi)部RAM中分配GUI_NUMBYTES字
//節(jié)的內(nèi)存
GUI_ALLOC_AssignMemory((U32 *)aMemory, GUI_NUMBYTES); //為存儲管理系統(tǒng)分配一個存
//儲塊
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); //設(shè)置存儲快的平均尺寸,該區(qū)越大,可用的存
//儲快數(shù)量越少
GUI_SetDefaultFont(GUI_FONT_6X8); //設(shè)置默認(rèn)字體
}
}
我這個例程里面的地址是由mem_malloc函數(shù)分配的,但是事實上我們只是把相應(yīng)的內(nèi)部或者是外部RAM地址交給EmWin就好了,使用的函數(shù)是這兩個:
GUI_ALLOC_AssignMemory((void*)aMemory, GUI_NUMBYTES);
GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
3、把顯示屏幾交給EmWin,具體首先應(yīng)該實現(xiàn)顯示屏的驅(qū)動,也就是可以在顯示屏上畫色塊,畫點,寫文字,接著就是替換函數(shù),簡言之就是告訴EmWin“我是這么畫這個點的,你要是畫點的話就用這個函數(shù)啊!”,EmWin在構(gòu)造一個界面的時候就會“好,我們就在這里畫吧,一個點一個點畫,怎么畫點呢?就調(diào)用程序員給我的這個函數(shù)好了”,于是就實現(xiàn)了EmWin對顯示屏LCD的控制:
在GUIDRV_Template.c文件里:
static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int PixelIndex)
{
LCD_Color_DrawPoint(x,y,PixelIndex);
}
這個函數(shù)就是EmWin用于畫點的函數(shù),里面的函數(shù)是我們畫點的函數(shù):
/****************************************************************************
* 名 稱: void LCD_Color_DrawPoint(u16 x,u16 y,u16 color)
* 功 能:在設(shè)置的坐標(biāo)處畫相應(yīng)顏色(在該點寫入自定義顏色)
* 入口參數(shù):x:x坐標(biāo)
y:y坐標(biāo)
color 此點的顏色值
* 返回參數(shù):無
* 說 明:color:寫入此點的顏色值 UCGUI調(diào)用該函數(shù)
****************************************************************************/
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; //橫屏就是調(diào)轉(zhuǎn)x,y坐標(biāo)
LCD_WriteReg(setxcmd,x);
LCD_WriteReg(setycmd,y);
}
LCD_CMD=write_gramcmd;
LCD_DATA=color;
}
能看出來,這個就是我們經(jīng)常用于畫點的函數(shù),以及到了基礎(chǔ)的寄存器寫入了,就是我們平常做的畫點。
至此,EmWin就可以在我們的顯示屏上畫圖了。
4、接著就是把觸摸屏的數(shù)據(jù)交個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
}
這兩個函數(shù)都是EmWin直接調(diào)用的,返回值就是我們的觸摸屏的返回值就好,打開用作返回的兩個函數(shù):
/****************************************************************************
* 名 稱: u16 RTouch_Read_XorY(u8 xy)
* 功 能:讀取一個坐標(biāo)值(x或者y)
* 入口參數(shù):xoy:指令(CMD_RDX/CMD_RDY
* 返回參數(shù): 讀到的數(shù)據(jù)
* 說 明:連續(xù)讀取5次數(shù)據(jù),對這些數(shù)據(jù)升序排列, 然后去掉最低和最1個數(shù),取平均值
****************************************************************************/
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;
}
而那兩個函數(shù)由GUI_TOUCH_Exec()函數(shù),這個EmWin內(nèi)部函數(shù)調(diào)用,這個函數(shù)就是掃描函數(shù),定時掃描就好:
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) //溢出中斷
{
TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清除中斷標(biāo)志位
GUI_TOUCH_Exec();
}
}
定時器一定時間中斷一次,掃描一下。
我們這樣就將所有的有關(guān)于顯示觸摸的東西交給EmWin了
5、綜上,首先有一個好使的帶觸摸屏系統(tǒng),然后添加EmWin有關(guān)文件,之后把動態(tài)內(nèi)存地址交給EmWin(動態(tài)內(nèi)存地址不是片內(nèi)RAM地址就是FSMC分配的片外RAM地址),把顯示屏畫點的權(quán)利交給EmWin,把觸摸屏讀點的權(quán)利交給EmWin。就可以通過在main函數(shù)里用GUI_INIT函數(shù)初始化EmWin,再調(diào)用demo里面的maintask();就可以實現(xiàn)票亮的界面了。
五、補充:以上是移植所需要的最主干的東西,具體的移植步驟我很快還會推出,另外剛才的獲取觸摸的方法不唯一,安富萊V6做的也很漂亮,我也會去寫。
總結(jié)
以上是生活随笔為你收集整理的EmWin学习课堂_小白EmWin_EmWin快速入门_EmWin动态内存,显示和触摸屏_EmWin基础配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xmind 使用教程[通俗易懂](Xmi
- 下一篇: 华硕悄悄推出新款 H510 主板,基于旧