劉 勇,王學(xué)俊,孔新偉,周晨晨
(大連工業(yè)大學(xué) 機械工程與自動化學(xué)院,遼寧 大連 116034)
隨著工業(yè)控制技術(shù)的迅猛發(fā)展,在控制中人們越來越多的用到液晶觸摸屏,液晶觸摸屏作為新型人機交互裝置具有堅固耐用、反應(yīng)速度快、節(jié)省空間、操作直觀等諸多優(yōu)點。利用這種技術(shù),用戶只要用手指碰觸屏上的圖符或文字就能實現(xiàn)對主機控制,從而實現(xiàn)人機交互功能,這種技術(shù)大大方便了那些不懂操作的用戶。 觸摸屏作為一種最新的輸入設(shè)備,它是目前最簡單、方便、自然的一種人機交互方式[1]。
雖然觸摸屏的操作簡單,但是觸摸屏的圖形界面的設(shè)計部分,對于不懂觸摸屏原理以及不精通編程的普通用戶來說,卻是一個晦澀難懂的難題。本文正是基于這一點,結(jié)合UCGUI嵌入式圖形支持系統(tǒng)技術(shù),開發(fā)研制一款操作設(shè)計簡單的智能觸摸顯示屏,用戶只需要掌握很少的電腦操作知識,在電腦上執(zhí)行幾步簡單的操作,即可設(shè)計出自己想要的圖形界面,并且可以下載到下位機上運行并顯示出來。
圖1 系統(tǒng)總流程圖Fig.1 Overall system flow chart
本設(shè)計的主要流程是先在上位機上產(chǎn)生圖形界面數(shù)據(jù)庫,然后通過RS232加載到下位機主控制器上,下位機主控制器將圖形界面數(shù)據(jù)經(jīng)過分析處理后再在液晶觸摸屏上顯示出來,并同時在下位機主控制器上運行監(jiān)控程序,當(dāng)液晶觸摸屏上發(fā)生觸碰事件時,把信號反饋給下位機主控制器,下位機主控制器根據(jù)不同的信號做出相應(yīng)的反應(yīng)并在液晶屏上顯示出來。
其主流程圖如圖1所示。
本設(shè)計分為硬件和軟件兩大部分。
3.1.1 液晶屏控制器
本設(shè)計采用RA8875芯片作為液晶屏控制器。RA8875是一個文字與繪圖模式的雙圖層液晶顯示 (TFT-LCD) 控制器,可結(jié)合文字或2D圖形應(yīng)用,最大可支持到800×480 點分辨率的中小尺寸數(shù)字面板。內(nèi)建 768 KB 顯示內(nèi)存,可為大多數(shù)使用者提供一個更具彈性的解決方案。此外,使用者可藉由選用外部串行式Flash 接口,支持BIG5/GB 編碼,最大可提供達(dá)32×32 pixel的字型輸入。在圖形的使用上,RA8875 支持2D 的BTE 引擎 (Block Transfer Engine),此功能兼容于一般通用的2D BitBLT 功能,可處理大量圖形數(shù)據(jù)轉(zhuǎn)換與傳送。同時RA8875 也內(nèi)建幾何圖形加速引擎 (Geometric Speed-up Engine),提供使用者透過簡單的設(shè)定輕松畫出直線、矩形、圓形和橢圓的幾何圖形[2]。
相對于其他的TFT控制器解決方案,RA8875是一個功能強大及低成本的彩色TFT 控制器,讓使用者順利解決軟硬件開發(fā)上的困難,同時達(dá)成低成本、高效能的系統(tǒng)方案。
3.1.2 觸摸屏控制器
本設(shè)計采用TSC2046作為觸摸屏的控制器。觸摸屏一般分為電容、電阻、矢量壓力傳感、表面聲波以及紅外線掃描等類型,使用最多的是四線和五線電阻式觸摸屏。四線電阻式觸摸屏由2個透明的電阻薄膜組成[3],當(dāng)水平和垂直方向電阻網(wǎng)有電壓時,就可以通過A/D轉(zhuǎn)換面板在觸摸點測量出電壓從而求出對應(yīng)的坐標(biāo)值[3-4]。TSC2046是新一代四線觸摸屏控制器,是典型的逐次逼近寄存器型A/D 變換器。其結(jié)構(gòu)以電容再分布為基礎(chǔ),包含了取樣/保持功能,支持低電壓的I/O接口。
TS2046接口電路圖如圖2所示。
圖2 觸摸屏控制器接口電路Fig.2 Touch screen controller interface circuit
3.1.3 下位機主控制器
圖3 上位機與下位機信息交換電路Fig.3 Upper machine and lower machine information exchange circuit
本設(shè)計采用STM32103VET6芯片作為下位機主控制器。STM32系列32位閃存微控制器使用來自于ARM公司的具有突破性Cortex-M3內(nèi)核,該內(nèi)核是專門設(shè)計于滿足集高性能、低功耗、實時應(yīng)用、具有競爭性價格于一體的嵌入式領(lǐng)域要求。STM32103VET6芯片CPU可達(dá)72 MHz,具有512 KB內(nèi)部存儲空間、64 KB RAM、100個引腳,可以充分滿足程序設(shè)計者的要求[5]。由于該芯片集成了更豐富的資源、方便使用的架構(gòu)以及低功耗等特性,加上有競爭力的價格,使得從16位升級到32位變得容易,使該系列芯片正在逐步取代ARM7系列芯片。使用該芯片開發(fā)產(chǎn)品更簡便快捷。
上位機與下位機主控制器信息加載電路如圖3所示。其中PA9為STM32芯片的串口數(shù)據(jù)發(fā)送端USART1_TX,PA10為STM32芯片的串口數(shù)據(jù)接收端USART1_RX。
3.2.1 移植UCGUI到主控制器
UCGUI是一種嵌入式應(yīng)用中的圖形支持系統(tǒng)。能夠為任何使用LCD圖形顯示的應(yīng)用提供高效的獨立于處理器及LCD控制器的圖形用戶接口,它適用單任務(wù)以及多任務(wù)系統(tǒng)環(huán)境, 并適用于任意LCD控制器和CPU控制的真實顯示或虛擬顯示[6]。
3.2.2 建立用戶圖形界面數(shù)據(jù)庫
用戶想要在屏幕上顯示的窗口、文字、控件等的集合稱為用戶圖形界面。用戶圖形界面數(shù)據(jù)庫就是這些窗口、文字、控件的屬性的集合。通過用戶圖形界面數(shù)據(jù)庫,可以實現(xiàn)用戶想要設(shè)計的界面的顯示。
3.2.3 觸摸屏、圖形界面、監(jiān)控程序設(shè)計
軟件部分重點在于UCGUI的移植與配置,液晶屏的初始化以及下位機主控制器的監(jiān)控程序設(shè)計。
其中,UCGUI的移植與配置是根據(jù)選用的液晶屏參數(shù)對GUIConf.h、LCDConf.h、LCDDummy.c 3個文件進行相關(guān)的配置[7]。
GUIConf.h文件主要是對ucgui進行相關(guān)的配置,具體如下:
#ifndef GUICONF_H
#define GUICONF_H
#define GUI_OS (0)/*這里指的是對操作系統(tǒng)的支持,因為只有單純的移植UCGUI,所以要把這個設(shè)置為0*/
#define GUI_SUPPORT_TOUCH (1)
/* 是否支持觸摸 */
#define GUI_SUPPORT_UNICODE(1)
/*UNICODE編碼支持*/
#define GUI_ALLOC_SIZE 5000 /*
動態(tài)內(nèi)存機制 */
#define GUI_WINSUPPORT 1
/*支持窗口*/
#define GUI_SUPPORT_MEMDEV 1
/* 內(nèi)存控制*/
#define GUI_SUPPORT_AA 1
/* 抗鋸齒*/
#endif
LCDConf.h文件是對液晶屏做相應(yīng)的配置,具體如下:
#defineLCD_XSIZE (800) /*定義液晶屏長度為800*/
#defineLCD_YSIZE (480) /*定義液晶屏寬度為480*/
#defineLCD_CONTROLLER (8875) /*控制器編號*/
#defineLCD_BITSPERPIXEL (16) /*16位點顯示格式*/
#defineLCD_FIXEDPALETTE (565) /*對應(yīng)紅綠藍(lán)為565位*/
#defineLCD_INIT_CONTROLLER() /*定義控制器型號RA8875*/
配置層的相關(guān)配置都已完成,然后就是接口層,LCDDummy.c文件為接口層配置文件,具體如下:
將其中的LCD_L0_Init函數(shù)定義如下:
int LCD_L0_Init(void)
{
RA875_Init ();//液晶屏初始化函數(shù)
return0;
}
將其中的LCD_L0_SetPixelIndex函數(shù)定義如下:
void(intx,inty,intPixelIndex)
{
RA875_SetPoint(u16 x,u16 y,u16 point);//調(diào)用置點程序
}
將其中的LCD_L0_GetPixelIndex函數(shù)定義如下
unsignedintLCD_L0_GetPixelIndex(intx,inty)
{
return RA875_GetPoint(u16 x,u16 y);//調(diào)用取點程序
}
至此,UCGUI的移植完畢,移植的難點在于設(shè)備驅(qū)動函數(shù)的編寫以及接口層的設(shè)計。
液晶屏的初始化主要是在Init_RA875()中實現(xiàn)的,首先程序調(diào)用GPIO_Configuration()函數(shù)對液晶屏使用的GPIO管腳進行初始化,具體代碼如下:
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIOA到E口時鐘使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_AF_PP;
GPIO_Init(GPIOE,&GPIO_InitStructure); // RS指令/數(shù)據(jù)選擇控制訊號端口
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_11 ;
GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_AF_PP;
GPIO_Init(GPIOD,&GPIO_InitStructure);
…………
GPIO_SetBits(GPIOD,GPIO_Pin_4);//MCU選用的是6800系列時置1
GPIO_SetBits(GPIOD,GPIO_Pin_5);
}
在對TFT LCD使用的GPIO管腳進行初始化后就可以正常的訪問液晶屏驅(qū)動芯片了,程序根據(jù)驅(qū)動芯片的ID進行初始化[8],其初始化部分程序如下:
void Init_RA875(void)
{
WriteCommand(0x88);
WriteData(0x0c);//PLL(鎖相回路)控制寄存器參數(shù)設(shè)置,PLLDIVN[4:0] = 20 FIN = 16 MHz
DelayMs(1);
WriteCommand(0x89);
WriteData(0x02);//PLLDIVK[2:0] =2
DelayMs(10);
WriteCommand(0x10); //色彩深度設(shè)定
WriteData(0x0F);//256色0x0F/65K色0x0C
……………
TP_auto_mode(); //觸摸面板自動模式設(shè)置
WriteCommand(0x70);//設(shè)置采樣時間和ADC時鐘
WriteData(0xB2);
Enable_TP();
RA8875_WAITSTATUS();
clear_TP_interrupt(); //清TP中斷
Active_Window(0,799,0,479);//設(shè)定面板分辨率為800 pixel×480 pixel
………………………
PWM1_enable();
PWM1_fnuction_sel();
PWM1_clock_ratio(0x03);//2MHz PWM1
PWM1_duty_cycle(0x00);//亮度設(shè)置
//設(shè)置數(shù)字光標(biāo)
Text_Cursor_Horizontal_Size(24);
Text_Cursor_Vertical_Size(4);
Text_Blink_Time(0x35);
Text_Cursor_Blink_Enable();
Text_Cursor_Enable();
MemoryWrite_Cursor_autoIncrease();//寫光標(biāo)加1
}
至此完成了液晶屏的底層驅(qū)動設(shè)計,為以后用戶圖形界面的顯示做好了準(zhǔn)備。
用戶圖形界面監(jiān)控程序重點在于函數(shù)_cbCallback(WM_MESSAGE*pMsg)。
其主要內(nèi)容如下:
static void _cbCallback(WM_MESSAGE * pMsg)
{
int NCode, Id;
WM_HWIN hWin = pMsg->hWin;
switch (pMsg->MsgId) //判斷發(fā)生什么觸發(fā)事件,根據(jù)觸發(fā)事件做出相應(yīng)變化。
{
case WM_PAINT:
PaintDialog(pMsg);
break;
case WM_INIT_DIALOG:
……………
(((WM_KEY_INFO*)(pMsg->Data.p))->Key) //判斷是否有按鍵按下
{
…………
WM_NOTIFICATION_VALUE_CHANGED:
…………
WM_DefaultProc(pMsg);
}
本設(shè)計采用STM32F103VET6作為主控芯片,RA8875作為液晶屏控制芯片,有效降低了開發(fā)成本,并且縮短了圖形界面顯示與反應(yīng)的時間,保證了顯示界面的穩(wěn)定性。利用RS232通信技術(shù)實現(xiàn)用戶圖形數(shù)據(jù)庫的加載,使用戶圖形界面的設(shè)計簡單易懂,易于操作,即便不懂編程的用戶也可以很快設(shè)計出自己想要的圖形界面。
[1] 杜詩超,宋永昌,王建.觸摸屏、組態(tài)軟件入門與典型應(yīng)用 [M].北京:中國電力出版社,2012.
Du S C, Song Y C, Wang J.IntroductiontoTouchScreen,ConfigurationSoftwareandTypicalApplications[M].Beijing: China Electric Power Press,2012. (in Chinese)
[2] 韓超.嵌入式GUI開發(fā)設(shè)計[M].北京:電子工業(yè)出版社,2009.
Han C.EmbeddedGUIDevelopmentandDesign[M]. Beijing: Electronic Industry Press,2009. (in Chinese)
[3] 胡冰.EP7212處理器的LCD控制及觸摸屏接口設(shè)計[J].單片機與嵌入式系統(tǒng)應(yīng)用,2002(5):49-54.
Hu B. EP7212 processor of LCD and touch screen control interface design [J].Microcontrollers&EmbeddedSystems,2002(5):49-54.(in Chinese)
[4] 劉榮林,程曉東.SSP接口的觸摸屏軟硬件系統(tǒng)設(shè)計[J].單片機與嵌入式系統(tǒng)應(yīng)用,2009(11): 64-67.
Liu R L, Cheng X D. Hardware and software system design of touch of the SSP interface pitcher [J].Microcontrollers&EmbeddedSystems,2009(11): 64-67. (in Chinese)
[5] 黃福睿.基于ARM和WindowsEmbeddedCE6.0的嵌入式車載系統(tǒng)的設(shè)計及研究[D]. 沈陽:沈陽理工大學(xué).2011.
Huang F R. Based on ARM and embedded on-board WindowsEmbeddedCE6.0 system design and research [D]. Shenyang:Shenyang Ligong University,2011. (in Chinese)
[6] 陳超.MATLAB應(yīng)用實例精講:圖像處理與GUI設(shè)計篇[M].北京:電子工業(yè)出版社,2011.
Chen C.MATLABApplicationExample:ImageProcessingandGUIDesign[M]. Beijing:China Electric Power Press,2011.(in Chinese)
[7] 劉軍.例說STM32[M].北京:北京航空航天大學(xué)出版社,2011.
Liu J.CaseSaysSTM32 [M]. Beijing: Beijing University of Aeronautics and Astronautics Press,2011. (in Chinese)
[8] Urwin-Wright S, Sanders D A. Rugged LCD touch screens for embedded applications [J].MechanicalSystemsandSignalProcessing,2008(2):23-24