當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 環(huán)境:ads2.2+ARM9 +s3c2410注意:由于編譯器(ads1.2或2.2)對(duì)全局變量初始化為0的不完全支持,有時(shí)必須手動(dòng)初始化為0,切記!!!一、ucos II移植到ARM9 s3c2410可從官網(wǎng)下載

 環(huán)境:ads2.2+ARM9 +s3c2410

注意:由于編譯器(ads1.2或2.2)對(duì)全局變量初始化為0的不完全支持,有時(shí)必須手動(dòng)初始化為0,切記!!!

一、ucos II移植到ARM9 s3c2410

可從官網(wǎng)下載移植代碼,基本無需改動(dòng)。

在os_cpu_a.s中的函數(shù)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 tasks's TCB

XX

二、ucGui 390移植到ARM9 s3c2410

1. Lcd驅(qū)動(dòng):

1) 畫點(diǎn)函數(shù):

對(duì)dm2410實(shí)驗(yàn)板上的lcd,左上為原點(diǎn)(0,0),函數(shù)如下:

void LCD2410_SetPixel(int xp, int yp, U16 color, int dindex)

{

*(pLCDBuffer565 + SCREEN_WIDTH*yp + xp) = color;

}

為了達(dá)到更快的顯示速度,別忘了開啟Cache!!!

2)LCD控制器的初始化,對(duì)2410函數(shù)如下:

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 << 8); /* Set LCD_PWREN as output */

s2410IOP->GPGCON |= (1 << 8);

s2410IOP->GPGDAT |= (1 << 4); //* Backlight ON

}

void InitLcdRegs(void)

{

s2410LCD->LCDCON1 = (CLKVAL_TFT << 8) | //* VCLK = HCLK / ((CLKVAL + 1) * 2) -> About 7 Mhz

(EACH_FRAME << 7) | //* 0 : Each Frame

(3 << 5) | // TFT LCD Pannel

(12 << 1) | //Y: // 16bpp Mode

(0 << 0) ; // Disable LCD Output

s2410LCD->LCDCON2 = (VBPD << 24) | //* VBPD : ((32-1)&0xff) = 0x1f

(LINEVAL_TFT << 14) | //* LINEVAL_TFT : 480 - 1

(VFPD << 6) | //* VFPD : ((11-1)&0xff) = 0xa

(VSPW << 0) ; //* VSPW : ((2-1) &0x3f) = 0x1

s2410LCD->LCDCON3 = (HBPD << 19) | //* HBPD : ((88-1)&0x7f)

(HOZVAL_TFT << 8) | //* HOZVAL_TFT : 800 - 1

(HFPD << 0) ; //* HFPD : ((40-1)&0xff)

s2410LCD->LCDCON4 = (MVAL << 8) | //* MVAL : 13

(HSPW << 0) ; //* HSPW : ((128-1)&0xff)

s2410LCD->LCDCON5 = (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

(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 << 0) ; // HWSWP : Swap Enable

s2410LCD->LCDSADDR1 = ((FRAMEBUF_DMA_BASE >> 22) << 21) |

((M5D(FRAMEBUF_DMA_BASE >> 1)) << 0);

s2410LCD->LCDSADDR2=M5D( (FRAMEBUF_DMA_BASE+(LCD_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );

s2410LCD->LCDSADDR3=(((LCD_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);

s2410LCD->LCDINTMSK|=(3); // MASK LCD Sub Interrupt

s2410LCD->LPCSEL&=(~7); // Disable LPC3600

s2410LCD->TPAL=0; // Disable Temp Palette

s2410LCD->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

#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 1

2.觸摸屏驅(qū)動(dòng):

觸摸屏驅(qū)動(dòng)計(jì)算出觸摸屏的坐標(biāo)(x,y),對(duì)dm2410實(shí)驗(yàn)板上的觸摸屏,左下為原點(diǎn),但不一定是(0,0)。兩個(gè)函數(shù):[!--empirenews.page--]

1) 設(shè)置中斷向量,開中斷:

void SetTSInterrupt(void)

{

rADCDLY = (50000);

rADCCON = (1<<14)|(ADCPRS<<6)|(7<<3)|(0<<2)|(0<<1)|(0);

rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);

pISR_ADC = (U32)TSIrqISR; //

rINTMSK &= ~(BIT_ADC);

rINTSUBMSK &= ~(BIT_SUB_TC);

}

2) 中斷處理函數(shù):

static void TSIrqISR(void)

{

int i;

U32 Pt[6];

rINTSUBMSK |= (BIT_SUB_ADC|BIT_SUB_TC);

if(rADCDAT0 & 0x8000)

{//抬起

isDown = 0;

rADCTSC &= 0xff; // Set stylus down interrupt

TX = -1;

TY = -1; //抬起觸筆時(shí),TX,TY要值成不大于0的數(shù)

}

else //按下

{ isDown = 1;

rADCTSC=(0<<8)|(0<<7)|(0<<6)|(1<<5)|(1<<4)|(1<<3)|(0<<2)|(1);

for(i=0;i

for(i=0;i<5;i++) //5 times

{

rADCCON|=0x1; // Start X-position conversion

while(rADCCON & 0x1); // Check if Enable_start is low

while(!(0x8000&rADCCON)); // Check ECFLG

Pt[i]=(0x3ff&rADCDAT0);

}

Pt[5]=(Pt[0]+Pt[1]+Pt[2]+Pt[3]+Pt[4])/5;//多次采樣取平均值

TX = Pt[5];

rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(2);

for(i=0;i

for(i=0;i<5;i++) //5 times

{

rADCCON|=0x1; // Start Y-position conversion

while(rADCCON & 0x1); // Check if Enable_start is low

while(!(0x8000&rADCCON)); // Check ECFLG

Pt[i]=(0x3ff&rADCDAT1);

}

Pt[5]=(Pt[0]+Pt[1]+Pt[2]+Pt[3]+Pt[4])/5;// 多次采樣取平均值

TY = Pt[5];

rADCTSC=(1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);

}

//cprintf("%d,%d\n",TX,TY);

OSMboxPost(TouchMbox, 0);//向處理觸摸進(jìn)程發(fā)消息

rSUBSRCPND |= BIT_SUB_TC;

rINTSUBMSK &= ~(BIT_SUB_TC); // Unmask sub interrupt (TC)

ClearPending(BIT_ADC);

}

3) 需要的量:

#define LOOP 1

#define ADCPRS 0x27

int TX=0;//觸摸坐標(biāo)x

int TY=0;//觸摸坐標(biāo)y

extern OS_EVENT *TouchMbox;

int isDown;

4) 觸摸屏校準(zhǔn):

Ucgui390中,帶有一校準(zhǔn)程序(于TOUCH_Calibrate.c中),可以改寫為我所用(見下文)。

也可設(shè)置默認(rèn)值,測(cè)出左下最小坐標(biāo)minX,minY和右上最大坐標(biāo)maxX,maxY,注意是觸摸坐標(biāo),不是lcd坐標(biāo),如下填寫配置文件GUITouchConf.h:

#define GUI_TOUCH_AD_LEFT minX

#define GUI_TOUCH_AD_TOP maxY

#define GUI_TOUCH_AD_RIGHT maxX

#define GUI_TOUCH_AD_BOTTOM minY

#define GUI_TOUCH_SWAP_XY 0

#define GUI_TOUCH_MIRROR_X 1

#define GUI_TOUCH_MIRROR_Y 1

#define TOUCH_NEED_CALIBRATE 0

3、如下填寫GUIConf.h:

#define GUI_OS (1) /* Compile with multitasking support */

#define GUI_SUPPORT_TOUCH (1) /* Support a touch screen (req. win-manager) */

#define GUI_SUPPORT_UNICODE (1) /* Support mixed ASCII/UNICODE strings */

#define GUI_SUPPORT_CHINESE (1)

#define GUI_DEFAULT_FONT &GUI_Font6x8

#define GUI_ALLOC_SIZE 12500 /* Size of dynamic memory ... For WM and memory devices*/

#define GUI_WINSUPPORT 1 /* Window manager package available */

#define GUI_SUPPORT_MEMDEV 1 /* Memory devices available */

#define GUI_SUPPORT_AA 1 /* Anti aliasing available */

4、ucgui與lcd驅(qū)動(dòng)函數(shù)的連接,即修改LCDWin.c文件:

在LCDWin.c中,去掉無用的頭文件包含。

#define SETPIXEL(x, y, c) LCD2410_SetPixel(x, y, c, LCD_DISPLAY_INDEX)

#define GETPIXEL(x, y) LCD2410_GetPixel(x,y, LCD_DISPLAY_INDEX)

即將“LCDSIM_XX”改成“LCD2410_XX”,這兩個(gè)函數(shù)位于lcd驅(qū)動(dòng)文件中。

……………………………

#define SETPIXEL(x, y, c) \

if (!_CheckBound(c)) { \

LCD2410_SetPixel(x, y, c, LCD_DISPLAY_INDEX); \

}

#else

#define SETPIXEL(x, y, c) LCD2410_SetPixel(x, y, c, LCD_DISPLAY_INDEX)

#endif

#define GETPIXEL(x, y) LCD2410_GetPixel(x,y,LCD_DISPLAY_INDEX)

……………………………

static void _XorPixel(int x, int y) {

unsigned int Index = LCD_L0_GetPixelIndex(x,y);

LCD2410_SetPixel(x, y, LCD_NUM_COLORS-1-Index, LCD_DISPLAY_INDEX);

}

……………………………

int LCD_L0_Init(void) {

return LCD2410_Init();//調(diào)用lcd初始化函數(shù)

}

5、某些編譯器(如:ads1.2)不會(huì)初始化全局變量,因此做如下事:

1) 修改如下函數(shù)為:(位于GUICore.c)

static void _InitContext(GUI_CONTEXT* pContext) {

memset(pContext,0,sizeof(GUI_CONTEXT));//add[!--empirenews.page--]

#if GUI_SUPPORT_MEMDEV

GUI_SelectLCD();

#else

LCD_SetClipRectMax();//LCD_L0_GetRect

#endif

pContext->pLCD_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);

}

修改如下函數(shù)為:(位于GUIAlloc.c)

void GUI_ALLOC_Init(void) {

........

GUI_ALLOC.NumUsedBytes = 0;

memset(&aBlock,0,sizeof(aBlock[0])*GUI_MAXBLOCKS);/////self

aBlock[0].Size = (1<

.......

}

修改如下函數(shù)為:(位于WM.c)(――――――――――New)

void WM_Init(void) {

if (!_IsInited) {

……….

memset(&_ClipContext,0,sizeof(WM_IVR_CONTEXT));//add

NextDrawWin = WM__FirstWin = WM_HWIN_NULL;

……………….

_IsInited =1;

}

}

2)自己編寫如下函數(shù)(ads1.2):

void MyInit()

{

IsInitialized = 0;//MemDev

_IsInited = 0;//Win

WM__CreateFlags = 0;

GUI_CURSOR_pfTempHide = NULL;

GUI_Context.hDevData = 0;

WM__hCapture=0;

WM__hWinFocus=0;

WM_pfPollPID = 0;

WM_pfHandlePID = 0;

GUI_pfTimerExec = 0;

_KeyMsgCnt = 0;

}

該函數(shù)應(yīng)在GUI_Init()調(diào)用之前調(diào)用。

6、改寫GUI_Init()函數(shù):

int GUI_Init(void) {

int r;

GUI_DEBUG_LOG("\nGUI_Init()");

/* Init system wide globals first */

GUI_DecChar = '.';

/* Init context */

_InitContext(&GUI_Context);

GUITASK_INIT();

r = LCD_Init();

#if GUI_WINSUPPORT

WM_Init();

#endif

GUITASK_COPY_CONTEXT();

GUI_Clear();

GUI_X_Init();

GUI_CURSOR_Show();//啟動(dòng)即顯示鼠標(biāo)

return r;

}

三、ucGUI與ucOS的整合,主要修改GUI_X.c文件:

1、定義信號(hào)量及全局量:

static OS_EVENT *DispSem;

static OS_EVENT *EventMbox;

static OS_EVENT *KeySem;

static int KeyPressed;

static char KeyIsInited;

2、實(shí)現(xiàn)結(jié)合函數(shù):

int GUI_X_GetTime(void)

{

return ((int)OSTimeGet());

}

void GUI_X_Delay(int period)

{

INT32U ticks;

ticks = (period * 1000) / OS_TICKS_PER_SEC;

OSTimeDly((INT16U)ticks);

}

void GUI_X_Unlock(void)

{

OSSemPost(DispSem);

}

void GUI_X_Lock(void)

{

U8 err;

OSSemPend(DispSem, 0, &err);

}

U32 GUI_X_GetTaskId(void)

{

return ((U32)(OSTCBCur->OSTCBPrio));

}

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();//此處接入觸摸屏的中斷設(shè)置

GUI_TOUCH_SetDefaultCalibration();//用默認(rèn)值校準(zhǔn)觸摸屏

}

四、與觸摸屏有關(guān)的函數(shù):

1、4個(gè)功能函數(shù):

void GUI_TOUCH_X_ActivateX(void) {//空}

void GUI_TOUCH_X_ActivateY(void) {//空}

int GUI_TOUCH_X_MeasureX(void) {

return TX;//返回觸摸坐標(biāo)x

}

int GUI_TOUCH_X_MeasureY(void){

return TY; //返回觸摸坐標(biāo)y

}

2、觸摸屏校準(zhǔn)任務(wù)(進(jìn)程, 來自示例程序:TOUCH_Calibrate.c):

#if TOUCH_NEED_CALIBRATE

static 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) {[!--empirenews.page--]

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 screen\n"

"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 how\n"

"a touch screen can be\n"

"calibrated at run time.\n"

"Please press the touch\n"

"screen to continue...");

GUI_DispStringHCenterAt("TOUCH_Calibrate", LCD_GetXSize() / 2, 5);

_WaitForPressedState(1);

_WaitForPressedState(0);

}

void CalibrateTask(void* pdata) {//觸摸屏校準(zhǔn)任務(wù)入口

int aPhysX[2], aPhysY[2], aLogX[2], aLogY[2], i;

GUI_SetBkColor(GUI_WHITE);

GUI_Clear();

GUI_SetColor(GUI_BLACK);

GUI_SetFont(&GUI_Font13B_ASCII);

_Explain();

/* Set the logical values */

aLogX[0] = 15;

aLogY[0] = 15;

aLogX[1] = LCD_GetXSize() - 20;

aLogY[1] = LCD_GetYSize() - 20;

/* Get the physical values of the AD converter for 2 positions */

for (i = 0; i < 2; i++) {

_GetPhysValues(aLogX[i], aLogY[i], &aPhysX[i], &aPhysY[i], _acPos[i]);

}

/* Use the physical values to calibrate the touch screen */

GUI_TOUCH_Calibrate(0, aLogX[0], aLogX[1], aPhysX[0], aPhysX[1]); /* Calibrate X-axis */

GUI_TOUCH_Calibrate(1, aLogY[0], aLogY[1], aPhysY[0], aPhysY[1]); /* 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(aLogX[0], 4); GUI_DispNextLine();

GUI_DispString ("lcdx1: "); GUI_DispDec(aLogX[1], 4); GUI_DispNextLine();

GUI_DispString ("lcdy0: "); GUI_DispDec(aLogY[0], 4); GUI_DispNextLine();

GUI_DispString ("lcdy1: "); GUI_DispDec(aLogY[1], 4); GUI_DispNextLine();

GUI_DispString ("tscX0: "); GUI_DispDec(aPhysX[0], 4); GUI_DispNextLine();

GUI_DispString ("tscX1: "); GUI_DispDec(aPhysX[1], 4); GUI_DispNextLine();

GUI_DispString ("tscY0: "); GUI_DispDec(aPhysY[0], 4); GUI_DispNextLine();

GUI_DispString ("tscY1: "); GUI_DispDec(aPhysY[1], 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、為了響應(yīng)觸摸屏,做如下事:

1)創(chuàng)建進(jìn)程處理觸摸事件,形式如下:

void TouchTask(void* data) {

INT8U err;

while(1)

{

CONSOL_Printf("Waiting for Touch......\n");

OSMboxPend(TouchMbox, 0, &err); /* Acquire semaphore to perform random numbers */

CONSOL_Printf("Got a message\n");

GUI_TOUCH_Exec();//

}

}

2) 如下修改函數(shù) GUI_TOUCH_Exec():

void GUI_TOUCH_Exec(void) {

#ifndef WIN32

static U8 ReadState;

int x,y;

/* calculate Min / Max values */

if (xyMinMax[GUI_COORD_X].Min < xyMinMax[GUI_COORD_X].Max) {[!--empirenews.page--]

xMin = xyMinMax[GUI_COORD_X].Min;

xMax = xyMinMax[GUI_COORD_X].Max;

} else {

xMax = xyMinMax[GUI_COORD_X].Min;

xMin = xyMinMax[GUI_COORD_X].Max;

}

if (xyMinMax[GUI_COORD_Y].Min < xyMinMax[GUI_COORD_Y].Max) {

yMin = xyMinMax[GUI_COORD_Y].Min;

yMax = xyMinMax[GUI_COORD_Y].Max;

} else {

yMax = xyMinMax[GUI_COORD_Y].Min;

yMin = xyMinMax[GUI_COORD_Y].Max;

}

/* Execute the state machine which reads the touch */

//switch (ReadState) {

//case 0:

yPhys = TOUCH_X_MeasureY();

// TOUCH_X_ActivateY(); /* Prepare X- measurement */

// ReadState++;

// break;

//default:

xPhys = TOUCH_X_MeasureX();

// TOUCH_X_ActivateX(); /* Prepare Y- measurement */

/* Convert values into logical values */

#if !GUI_TOUCH_SWAP_XY /* Is X/Y swapped ? */

x = xPhys;

y = yPhys;

#else

x = yPhys;

y = xPhys;

#endif

if ((x

GUI_TOUCH_StoreUnstable(-1,-1);

} else {

x = AD2X(x);

y = AD2Y(y);

GUI_TOUCH_StoreUnstable(x,y);

}

/* Reset state machine */

//ReadState=0;

// break;

//}

#endif /* WIN32 */

}

五、 GUI多任務(wù)測(cè)試:

測(cè)試程序:MT_MultiTasking.c

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉