新聞中心

        STM32+UCGUI+觸摸屏

        作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò) 收藏
        最近研究了一下ucGUI,功能還湊合,前面的功能挺簡(jiǎn)單,研究到觸摸屏遇到了一點(diǎn)小困難。我創(chuàng)建了一個(gè)按鈕,點(diǎn)擊它老是沒(méi)反應(yīng),折騰了近一天終于搞定。
        簡(jiǎn)要介紹一下移植方法,首先在GUIConf.h中定義#define GUI_SUPPORT_TOUCH (1) 支持觸摸屏。
        然后是觸摸屏的驅(qū)動(dòng)程序(起碼能讀出AD轉(zhuǎn)換后的X、Y值),有了驅(qū)動(dòng)程序,然后加入GUI_X_Touch.c文件,并添加以下內(nèi)容。
        #include "GUI.h"
        #include "GUI_X.h"
        #include "dp_touch.h"
        void GUI_TOUCH_X_ActivateX(void) {
        }
        void GUI_TOUCH_X_ActivateY(void) {
        }
        int GUI_TOUCH_X_MeasureX(void)
        {
        int xa[MAX_NUM],temp;
        u8 i,j;
        int tmx;
        u8 xcount=0;
        do
        {
        xa[xcount]=XPT2046_GetOneTouchX();
        if((xa[xcount]>300)&&(xa[xcount]<4000))
        xcount++;
        else
        break;
        }while(xcount
        if(xcount>=MAX_NUM)
        {
        xcount=0;
        for(i=0;i
        {
        for(j=i+1;j
        {
        if(xa[i]>xa[j])
        {
        temp=xa[i];
        xa[i]=xa[j];
        xa[j]=temp;
        }
        }
        }
        tmx=(xa[3]+xa[4]+xa[5]+xa[6])/4;
        }
        return tmx;
        }
        //y坐標(biāo)濾波
        int GUI_TOUCH_X_MeasureY(void)
        {
        int ya[MAX_NUM],temp;
        u8 i,j;
        int tmy;
        u8 ycount=0;
        do
        {
        ya[ycount]=XPT2046_GetOneTouchY();
        if((ya[ycount]>300)&&(ya[ycount]<4000))
        ycount++;
        else
        break;
        }while(ycount
        if(ycount>=MAX_NUM)
        {
        ycount=0;
        for(i=0;i
        {
        for(j=i+1;j
        {
        if(ya[i]>ya[j])
        {
        temp=ya[i];
        ya[i]=ya[j];
        ya[j]=temp;
        }
        }
        }
        tmy=(ya[3]+ya[4]+ya[5]+ya[6])/4;
        }
        return tmy;
        }
        void GUI_TOUCH_X_ActivateX(void)和void GUI_TOUCH_X_ActivateY(void)直接為空即可,
        int GUI_TOUCH_X_MeasureX(void) 和int GUI_TOUCH_X_MeasureY(void)返回讀取的X和Y值(其實(shí)是AD轉(zhuǎn)換值),程序里濾了一下波。XPT2046_GetOneTouchX()和XPT2046_GetOneTouchY()是我自己編寫的讀坐標(biāo)程序(未濾波)。
        然后點(diǎn)擊屏幕的左上角和右下角,記下坐標(biāo)(AD轉(zhuǎn)換值,具體方法自己發(fā)揮,我把值打印在屏幕上了),然后配置GUITouchConf.h,如下所示。
        #ifndef GUITOUCH_CONF_H
        #define GUITOUCH_CONF_H
        #define GUI_TOUCH_AD_LEFT 3850
        #define GUI_TOUCH_AD_RIGHT 310
        #define GUI_TOUCH_AD_TOP 380
        #define GUI_TOUCH_AD_BOTTOM 3840
        #define GUI_TOUCH_SWAP_XY 0
        #define GUI_TOUCH_MIRROR_X 0
        #define GUI_TOUCH_MIRROR_Y 1//鏡像,根據(jù)自己的屏幕確定
        #endif
        至此準(zhǔn)備工作完成,一個(gè)簡(jiǎn)單的實(shí)例。暫時(shí)沒(méi)使用操作系統(tǒng),所以偶在定時(shí)器2中每隔10ms調(diào)用GUI_TOUCH_Exec();獲得觸摸屏坐標(biāo)(ucGUI已根據(jù)GUITouchConf.h中的配置轉(zhuǎn)換完成),主程序如下。
        int main(void)
        {
        BUTTON_Handle hButton;//按鈕句柄
        GUI_PID_STATE Button_State; //輸入設(shè)備狀態(tài)
        int temp=1;
        SystemInit();//系統(tǒng)初始化
        GUI_Init(); //液晶屏初始化
        XPT2046_Config();//觸摸屏初始化
        SPI2_Config();//spi初始化
        GUI_SetBkColor(GUI_BLUE);//設(shè)置背景色
        GUI_Clear();
        hButton=BUTTON_Create(10,20,40,20,GUI_ID_OK,WM_CF_SHOW);//創(chuàng)建一個(gè)按鈕
        BUTTON_SetText(hButton, "Click");
        TIMER2_Config();//在定時(shí)器2中每隔10ms調(diào)用GUI_TOUCH_Exec();獲得觸摸屏坐標(biāo)
        NVIC_Config();
        while(1)
        {
        TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);//關(guān)中斷
        GUI_TOUCH_GetState(&Button_State);//得到輸入設(shè)備狀態(tài)
        GUI_TOUCH_StoreStateEx(&Button_State);//存儲(chǔ)輸入設(shè)備狀態(tài)
        GUI_DispDecAt(Button_State.x,10,50,4);//輸入設(shè)備當(dāng)前x坐標(biāo)
        GUI_DispDecAt(Button_State.y,10,80,4);//輸入設(shè)備當(dāng)前y坐標(biāo)
        GUI_DispDecAt(Button_State.Pressed,10,100,4);//是否按下
        GUI_Exec();//執(zhí)行回調(diào)函數(shù)重繪無(wú)效窗口(通常GUI_Delay()自動(dòng)調(diào)用此函數(shù))
        if(GUI_GetKey()==GUI_ID_OK)//按鈕按下
        {
        if(temp==1)
        {
        temp=0;
        BUTTON_SetText(hButton,"yes");
        }
        else
        {
        temp=1;
        BUTTON_SetText(hButton,"no");
        }
        }
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//開(kāi)中斷
        delay_ms(1000);
        }
        }
        注釋的比較詳細(xì)了,具體就是顯示一個(gè)按鈕,按鈕按下時(shí)上面的文字在“yes”和“no”之間進(jìn)行切換。按鈕下方顯示按下位置的坐標(biāo)和狀態(tài)。



        關(guān)鍵詞: STM32UCGUI觸摸

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 丰城市| 洪湖市| 黄山市| 大姚县| 南汇区| 宝丰县| 崇仁县| 弋阳县| 遂溪县| 柳江县| 长宁县| 普兰县| 田东县| 崇阳县| 兰溪市| 乾安县| 涟源市| 江津市| 南平市| 正镶白旗| 新竹市| 梧州市| 泰兴市| 弥勒县| 新宁县| 平乡县| 仁布县| 阿鲁科尔沁旗| 大邑县| 景宁| 湖口县| 北碚区| 黄龙县| 海淀区| 菏泽市| 蒙阴县| 夏津县| 宿松县| 柘荣县| 宝山区| 方正县|