新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ucos II+ucGUI+s3c2410+LCD+觸摸屏整合

        ucos II+ucGUI+s3c2410+LCD+觸摸屏整合

        作者: 時間:2016-10-08 來源:網絡 收藏

        #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);

        }

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

        void GUI_ALLOC_Init(void) {

        ........

        GUI_ALLOC.NumUsedBytes = 0;

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

        aBlock[0].Size = (1

        .......

        }

        修改如下函數為:(位于WM.c)(DDDDDDDDDDNew)

        void WM_Init(void) {

        if (!_IsInited) {

        ……….

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

        NextDrawWin = WM__FirstWin = WM_HWIN_NULL;

        ……………….

        _IsInited =1;

        }

        }

        2)自己編寫如下函數(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;

        }

        該函數應在GUI_Init()調用之前調用。

        6、改寫GUI_Init()函數:

        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();//啟動即顯示鼠標

        return r;

        }

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

        1、定義信號量及全局量:

        static OS_EVENT *DispSem;

        static OS_EVENT *EventMbox;

        static OS_EVENT *KeySem;

        static int KeyPressed;

        static char KeyIsInited;

        2、實現結合函數:

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

        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; //返回觸摸坐標y

        }

        2、觸摸屏校準任務(進程, 來自示例程序: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) {



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 阜南县| 望江县| 博兴县| 阿勒泰市| 锦屏县| 犍为县| 科技| 长丰县| 新和县| 东乌| 滨州市| 宜黄县| 如皋市| 翁牛特旗| 平潭县| 郎溪县| 东宁县| 扶余县| 昌图县| 绥棱县| 肃南| 泸溪县| 孙吴县| 富平县| 焦作市| 奈曼旗| 沙湾县| 怀远县| 盐亭县| 苏尼特左旗| 育儿| 瑞昌市| 西充县| 阳高县| 镇坪县| 车致| 桦甸市| 阜阳市| 临湘市| 河源市| 越西县|