<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          STM32+UCGUI+觸摸屏

          作者: 時間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
          最近研究了一下ucGUI,功能還湊合,前面的功能挺簡單,研究到觸摸屏遇到了一點小困難。我創(chuàng)建了一個按鈕,點擊它老是沒反應(yīng),折騰了近一天終于搞定。
          簡要介紹一下移植方法,首先在GUIConf.h中定義#define GUI_SUPPORT_TOUCH (1) 支持觸摸屏。
          然后是觸摸屏的驅(qū)動程序(起碼能讀出AD轉(zhuǎn)換后的X、Y值),有了驅(qū)動程序,然后加入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值(其實是AD轉(zhuǎn)換值),程序里濾了一下波。XPT2046_GetOneTouchX()和XPT2046_GetOneTouchY()是我自己編寫的讀坐標(biāo)程序(未濾波)。
          然后點擊屏幕的左上角和右下角,記下坐標(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)備工作完成,一個簡單的實例。暫時沒使用操作系統(tǒng),所以偶在定時器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)建一個按鈕
          BUTTON_SetText(hButton, "Click");
          TIMER2_Config();//在定時器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);//存儲輸入設(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ù)重繪無效窗口(通常GUI_Delay()自動調(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);//開中斷
          delay_ms(1000);
          }
          }
          注釋的比較詳細(xì)了,具體就是顯示一個按鈕,按鈕按下時上面的文字在“yes”和“no”之間進(jìn)行切換。按鈕下方顯示按下位置的坐標(biāo)和狀態(tài)。



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

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();