新聞中心

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

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

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

        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 Pt[6];

        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;i

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

        {

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

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

        while(!(0x8000rADCCON)); // Check ECFLG

        Pt[i]=(0x3ffrADCDAT0);

        }

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

        TX = Pt[5];

        rADCTSC=(08)|(07)|(16)|(15)|(04)|(13)|(02)|(2);

        for(i=0;i

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

        {

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

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

        while(!(0x8000rADCCON)); // Check ECFLG

        Pt[i]=(0x3ffrADCDAT1);

        }

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

        TY = Pt[5];

        rADCTSC=(18)|(17)|(16)|(05)|(14)|(03)|(02)|(3);

        }

        //cprintf(%d,%dn,TX,TY);

        OSMboxPost(TouchMbox, 0);//向處理觸摸進程發消息

        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;//觸摸坐標x

        int TY=0;//觸摸坐標y

        extern OS_EVENT *TouchMbox;

        int isDown;

        4) 觸摸屏校準:

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

        也可設置默認值,測出左下最小坐標minX,minY和右上最大坐標maxX,maxY,注意是觸摸坐標,不是lcd坐標,如下填寫配置文件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驅動函數的連接,即修改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”,這兩個函數位于lcd驅動文件中。

        ……………………………

        #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();//調用lcd初始化函數

        }

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

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

        static void _InitContext(GUI_CONTEXT* pContext) {

        memset(pContext,0,sizeof(GUI_CONTEXT));//add



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宿迁市| 长宁县| 靖宇县| 五家渠市| 墨竹工卡县| 珲春市| 阳山县| 肃南| 灵丘县| 北碚区| 班戈县| 内黄县| 乐山市| 沙田区| 满洲里市| 巨鹿县| 宁津县| 嘉鱼县| 大悟县| 江西省| 新龙县| 陕西省| 崇义县| 临安市| 策勒县| 长宁县| 资兴市| 香港| 英吉沙县| 四会市| 桦南县| 子洲县| 方山县| 孟州市| 碌曲县| 马公市| 奉贤区| 莒南县| 吉水县| 兴山县| 沂南县|