基于ARM触摸屏的实现.doc_第1页
基于ARM触摸屏的实现.doc_第2页
基于ARM触摸屏的实现.doc_第3页
基于ARM触摸屏的实现.doc_第4页
基于ARM触摸屏的实现.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ucos II+ucGUI+s3c2410+LCD+触摸屏整合作者:佚名 来源:不详 录入:Admin 更新时间:2008-8-18 14:57:54 点击数:240 【字体: 】环境:ads2.2ARM9 s3c2410注意:由于编译器(ads1.2或2.2)对全局变量初始化为0的不完全支持,有时必须手动初始化为0,切记!一、ucos II移植到ARM9 s3c2410可从官网下载移植代码,基本无需改动。在os_cpu_a.s中的函数UCOS_IRQHandler中的bl OSIntEnter和bl C_IRQHandler之间插入如下代码(见邵贝贝,第2版,第104页的说明:L3.18(4) ): ldr r0, =OSIntNesting ldrb r0,r0 cmp r0,#1 bne XX ldr r0,=OSTCBCur ldr r1,r0 str sp,r1 ; store sp in preempted taskss TCB XX 二、ucGui 390移植到ARM9 s3c24101. Lcd驱动:1) 画点函数:对dm2410实验板上的lcd,左上为原点(0,0),函数如下:void LCD2410_SetPixel(int xp, int yp, U16 color, int dindex) *(pLCDBuffer565 + SCREEN_WIDTH*yp + xp) = color; 为了达到更快的显示速度,别忘了开启Cache!2)LCD控制器的初始化,对2410函数如下:int LCD2410_Init(void) if(!isLcdInit) InitLcdPort(); InitLcdRegs(); isLcdInit = 1; return 0; return 1;void InitLcdPort(void) / LCD port initialize. s2410IOP-GPCUP = 0xFFFFFFFF; s2410IOP-GPCCON = 0xAAAAAAAA; s2410IOP-GPDUP = 0xFFFFFFFF; s2410IOP-GPDCON = 0xAAAAAAAA; s2410IOP-GPGCON &= (3 GPGCON |= (1 GPGDAT |= (1 LCDCON1 = (CLKVAL_TFT About 7 Mhz (EACH_FRAME 7) | /* 0 : Each Frame (3 5) | / TFT LCD Pannel (12 1) | /Y: / 16bpp Mode (0 LCDCON2=(VBPD24)|/*VBPD:(32-1)&0xff)=0x1f (LINEVAL_TFT 14) | /* LINEVAL_TFT : 480 - 1&bsp; (VFPD 6) | /* VFPD: (11-1)&0xff) = 0xa (VSPW LCDCON3=(HBPD19)|/*HBPD: (88-1)&0x7f) (HOZVAL_TFT 8) | /* HOZVAL_TFT : 800 - 1 (HFPD LCDCON4 = (MVAL 8) |/* MVAL : 13 (HSPWLCDCON5 = (0 12) | / BPP24BL : LSB valid (1 11) | / FRM565 MODE : 5:5:5:1 Format (0 10) | / INVVCLK : VCLK Falling Edge (1 9) | / INVVLINE : Inverted Polarity (1 8) | / INVVFRAME : Inverted Polarity (0 7) | / INVVD : Normal (0 6) | / INVVDEN : Normal&bsp; (0 5) | / INVPWREN : Normal (0 4) | / INVENDLINE : Normal (1 3) | / PWREN : Disable PWREN (0 2) | / ENLEND : Disable LEND signal (0 1) | / BSWP : Swap Disable (1 LCDSADDR1 = (FRAMEBUF_DMA_BASE 22) 1) LCDSADDR2=M5D( (FRAMEBUF_DMA_BASE+(LCD_XSIZE_TFT*LCD_YSIZE_TFT*2)1 ); s2410LCD-LCDSADDR3=(LCD_XSIZE_TFT-LCD_XSIZE_TFT)/1)LCDINTMSK|=(3); / MASK LCD Sub Interrupt s2410LCD-LPCSEL&=(7); / Disable LPC3600 s2410LCD-TPAL=0; / Disable Temp Palettes2410LCD-LCDCON1 |= 1; 其中,部分变量、常量定义如下:#define LCD_XSIZE_TFT (800) #define LCD_YSIZE_TFT (480)#define HOZVAL_TFT (LCD_XSIZE_TFT-1)#define LINEVAL_TFT (LCD_YSIZE_TFT-1)#define MVAL (13)#define MVAL_USED (1)#define EACH_FRAME (0)/STN/CSTN timing parameter for LCBHBT161M(NANYA)#define WLH (3)#define WDLY (3)#define LINEBLANK (1 &0xff)#define VBPD (32-1)&0xff)#define VFPD (11-1)&0xff)#define VSPW (2-1) &0x3f)#define HBPD (88-1)&0x7f)#define HFPD (40-1)&0xff)#define HSPW (128-1)&0xff)#define CLKVAL_TFT (0) #define M5D(n) (n) & 0x1fffff)#define SCREEN_WIDTH 800 /800#define SCREEN_HEIGHT 480 /480#define FRAMEBUF_DMA_BASE (0x35000000)U16* pLCDBuffer565=(U16*)FRAMEBUF_DMA_BASE;3)填写配置文件LCDConf.h&nbs; #define LCD_XSIZE (800) /* X-resolution of LCD, Logical coor. */#define LCD_YSIZE (480) /* Y-resolution of LCD, Logical coor. */#define LCD_BITSPERPIXEL (16)#define LCD_CONTROLLER 1#define LCD_SWAP_RB_0 12触摸屏驱动: 触摸屏驱动计算出触摸屏的坐标(x,y),对dm2410实验板上的触摸屏,左下为原点,但不一定是(0,0)。两个函数:1) 设置中断向量,开中断:void SetTSInterrupt(void) rADCDLY = (50000); rADCCON = (114)|(ADCPRS6)|(73)|(02)|(01)|(0); rADCTSC = (08)|(17)|(16)|(05)|(14)|(03)|(02)|(3); pISR_ADC = (U32)TSIrqISR; / rINTMSK &= (BIT_ADC); rINTSUBMSK &= (BIT_SUB_TC);2) 中断处理函数:static void TSIrqISR(void) int i; U32 Pt6; rINTSUBMSK |= (BIT_SUB_ADC|BIT_SUB_TC); if(rADCDAT0 & 0x8000) /抬起 isDown = 0; rADCTSC &= 0xff; / Set stylus down interrupt TX = -1; TY = -1; /抬起触笔时,TX,TY要值成不大于0的数 else /按下 isDown = 1; rADCTSC=(08)|(07)|(06)|(15)|(14)|(13)|(02)|(1); for(i=0;iLOOP;i+); /delay to set up the next channel for(i=0;i5;i+) /5 times rADCCON|=0x1; / Start X-position conversion while(rADCCON & 0x1); / Check if Enable_start is low while(!(0x8000&rADCCON); / Check ECFLG&nbs; Pti=(0x3ff&rADCDAT0); Pt5=(Pt0+Pt1+Pt2+Pt3+Pt4)/5;/多次采样取平均值 TX = Pt5; rADCTSC=(08)|(07)|(16)|(15)|(04)|(13)|(02)|(2); for(i=0;iLOOP;i+); /delay to set up the next channel for(i=0;i5;i+) /5 times rADCCON|=0x1; / Start Y-position conversion while(rADCCON & 0x1); / Check if Enable_start is low while(!(0x8000&rADCCON); / Check ECFLG Pti=(0x3ff&rADCDAT1); Pt5=(Pt0+Pt1+Pt2+Pt3+Pt4)/5;/ 多次采样取平均值 TY = Pt5;rADCTSC=(18)|(17)|(16)|(05)|(14)|(03)|(0pLCD_HL = &LCD_HL_APIList; pContext-pAFont = GUI_DEFAULT_FONT; pContext-pClipRect_HL = &GUI_Context.ClipRect; pContext-PenSize = 1; pContext-DrawMode = GUI_DRAWMODE_NORMAL;/add pContext-TextMode = GUI_TEXTMODE_NORMAL;/add pContext-TextAlign = GUI_TA_LEFT|GUI_TA_TOP;/add pContext-AA_HiResEnable = 0;/add /* Variables in WM module */ #if GUI_WINSUPPORT pContext-hAWin = WM_GetDesktopWindow(); #endif /* Variables in GUI_AA module */ pContext-AA_Factor = 3; LCD_SetBkColor(GUI_DEFAULT_BKCOLOR); LCD_SetColor(GUI_DEFAULT_COLOR);修改如下函数为:(位于GUIAlloc.c)void GUI_ALLOC_Init(void) . GUI_ALLOC.NumUsedBytes = 0; memset(&aBlock,0,sizeof(aBlock0)*GUI_MAXBLOCKS);/self aBlock0.Size = (1OSTCBPrio); void GUI_X_WaitEvent (void) INT8U err; (void)OSMboxPend(EventMbox, 0, &err);void GUI_X_SignalEvent (void) (void)OSMboxPost(EventMbox, (void *)1);void GUI_X_InitOS(void) DispSem = OSSemCreate(1); EventMbox = OSMboxCreate(void *)0);void GUI_X_ExecIdle(void) GUI_X_Delay(1);void GUI_X_Init(void) SetTSInterrupt();/此处接入触摸屏的中断设置 GUI_TOUCH_SetDefaultCalibration();/用默认值校准触摸屏四、与触摸屏有关的函数:1、4个功能函数:void GUI_TOUCH_X_ActivateX(void) /空 void GUI_TOUCH_X_ActivateY(void) /空int GUI_TOUCH_X_MeasureX(void) return TX;/返回触摸坐标x int GUI_TOUCH_X_MeasureY(void) return TY; /返回触摸坐标y2、触摸屏校准任务(进程, 来自示例程序:TOUCH_Calibrate.c):#if TOUCH_NEED_CALIBRATEstatic const char * _acPos = (upper left position),(lower right position);static void _WaitForPressedState(int Pressed) GUI_PID_STATE State;/* Wait until touch is pressed */do GUI_TOUCH_GetState(&State); if (State.Pressed = Pressed) break; GUI_Delay (100); while (1);static void _DispStringCentered(const char * pString) GUI_RECT Rect;Rect.x0 = Rect.y0 = 0;Rect.x1 = LCD_GetXSize() - 1;Rect.y1 = LCD_GetYSize() - 1;GUI_DispStringInRect(pString, &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER);static void _GetPhysValues(int LogX, int LogY, int * pPhysX, int * pPhysY, const char * pString) char acText = Press here;GUI_RECT Rect;int FontSizeY, Align;FontSizeY = GUI_GetFontSizeY();GUI_Clear();GUI_SetColor(GUI_BLACK);_DispStringCentered(Runtime calibration,n please touch the screenn at the center of the ring.); /* Ask user to press the touch */* Calculate the rectangle for the string */Rect.y0 = LogY - FontSizeY;Rect.y1 = LogY + FontSizeY;if (LogX LCD_GetXSize() / 2) Rect.x0 = LogX + 15; Rect.x1 = LCD_GetXSize(); Align = GUI_TA_LEFT; else Rect.x0 = 0; Rect.x1 = LogX - 15; Align = GUI_TA_RIGHT;/* Show the text nearby the ring */GUI_DispStringInRect(acText, &Rect, Align | GUI_TA_TOP);GUI_DispStringInRect(pString, &Rect, Align | GUI_TA_BOTTOM);/* Draw the ring */GUI_FillCircle(LogX, LogY, 10);GUI_SetColor(GUI_WHITE);GUI_FillCircle(LogX, LogY, 5);GUI_SetColor(GUI_BLACK);/* Wait until touch is pressed */_WaitForPressedState(1);*pPhysX = GUI_TOUCH_GetxPhys();*pPhysY = GUI_TOUCH_GetyPhys();/* Wait until touch is released */_WaitForPressedState(0);static void _Explain(void) _DispStringCentered(This sample shows hown a touch screen can ben calibrated at run time.n Please press the touchn screen to continue.);GUI_DispStringHCenterAt(TOUCH_Calibrate, LCD_GetXSize() / 2, 5);_WaitForPressedState(1);_WaitForPressedState(0);void CalibrateTask(void* pdata) /触摸屏校准任务入口int aPhysX2, aPhysY2, aLogX2, aLogY2, i;GUI_SetBkColor(GUI_WHITE);GUI_Clear();GUI_SetColor(GUI_BLACK);GUI_SetFont(&GUI_Font13B_ASCII);_Explain();/* Set the logical values */aLogX0 = 15;aLogY0 = 15;aLogX1 = LCD_GetXSize() - 20;aLogY1 = LCD_GetYSize() - 20;/* Get the physical values of the AD converter for 2 positions */for (i = 0; i 2; i+) _GetPhysValues(aLogXi, aLogYi, &aPhysXi, &aPhysYi, _acPosi);/* Use the physical values to calibrate the touch screen */GUI_TOUCH_Calibrate(0, aLogX0, aLogX1, aPhysX0, aPhysX1); /* Calibrate X-axis */GUI_TOUCH_Calibrate(1, aLogY0, aLogY1, aPhysY0, aPhysY1); /* Calibrate Y-axis */ /* calculate and display values for configuration file */ int calX0, calX1; int calY0, calY1; GUI_Clear(); GUI_TOUCH_GetCalData(GUI_COORD_X, &calX0, &calX1); GUI_TOUCH_GetCalData(GUI_COORD_Y, &calY0, &calY1); GUI_DispStringAt(calX0: , 0, 0); GUI_DispDec(calX0, 4); GUI_DispNextLine(); GUI_DispString (calX1: ); GUI_DispDec(calX1, 4); GUI_DispNextLine(); GUI_DispString (calY0: ); GUI_DispDec(calY0, 4); GUI_DispNextLine(); GUI_DispString (calY1: ); GUI_DispDec(calY1, 4); GUI_DispStringAt(lcdx0: , 0, 200); GUI_DispDec(aLogX0, 4); GUI_DispNextLine(); GUI_DispString (lcdx1: ); GUI_DispDec(aLogX1, 4); GUI_DispNextLine(); GUI_DispString (lcdy0: ); GUI_DispDec(aLogY0, 4); GUI_DispNextLine(); GUI_DispString (lcdy1: ); GUI_DispDec(aLogY1, 4); GUI_DispNextLine(); GUI_DispString (tscX0: ); GUI_DispDec(aPhysX0, 4); GUI_DispNextLine(); GUI_DispString (tscX1: ); GUI_DispDec(aPhysX1, 4); GUI_DispNextLine(); GUI_DispString (tscY0: ); GUI_DispDec(aPhysY0, 4); GUI_DispNextLine(); GUI_DispString (tscY1: ); GUI_DispDec(aPhysY1, 4); GUI_DispNextLine(); GUI_DispString (Please touch display to continue.); GUI_Delay(1000); _WaitForPressedState(1); _WaitForPressedState(0); GUI_Clear(); SystemOn();OSTaskSuspend(OS_PRIO_SELF);3、为了响应触摸屏,做如下事: 1)创建进程处理触摸事件,形式如下: void TouchTask(void* data) INT8U err; while(1) CONSOL_Printf(Waiting for Touch.n);OSMboxPend(TouchMbox, 0, &err); /* Acquire semaphore to perform random numbers */

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论