新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 技術干貨:WinCE 7.0下的觸摸屏驅動

        技術干貨:WinCE 7.0下的觸摸屏驅動

        作者: 時間:2017-10-21 來源:網絡 收藏

          在中較為常用的是四線電阻式觸摸屏,通過檢測x軸和y軸的電壓,來確定觸點的位置。一般觸摸屏系統結構為:觸摸屏->觸摸屏控制器->處理器。

        本文引用地址:http://www.104case.com/article/201710/366958.htm

          wince7下觸摸屏的驅動分為PDD層(位于bsp目錄中)和MDD層(位于public目錄中)。PDD層和MDD層通過DDSI接口函數連接,MDD層和上層通過DDI函數連接。其中MDD層一般無需修改,我們只需修改PDD層的代碼。

          比如我的bsp目錄下觸摸屏驅動中的touchscreenpdd.cpp文件中主要有如下函數:

          TchPdd_Init()

          TchPdd_Ioctl()

          PDDTouchIST()

          PDDInitializeHardware()

          PDDTouchPanelEnable()

          PDDTouchPanelGetPoint()

          PDDCalibrationThread()

          PDDStartCalibrationThread()

          PDDDeInitailzeHardware()

          PDDTouchPanelDisable()

          其中TchPdd開頭的函數就是DDSI函數,PDD開頭的函數就是PDD層的函數。MDD層會最先調用TchPdd_Init()函數,該函數會將DDSI函數以函數指針的形式傳遞給MDD層,并調用PDD層的函數進行必要的初始化,如調用PDDInitializeHardware()來初始化SPI,GPIO(我的觸摸屏控制器使用SPI接口),調用PDDTouchPanelEnable()來創建“觸摸屏事件”,創建IST線程等。

          IST線程函數PDDTouchIST()中會有一個while循環,如下圖所示:

          循環中有一個WaitForSingleObject(,)函數。該函數有兩個參數,第一個參數是“觸摸屏事件”的句柄,第二個參數用來設置等待超時的時間。 IST線程執行到這個函數會等待“觸摸屏事件”發生或者超時。當這兩種情況之一發生后,線程就會往下執行,并調用 PDDTouchPanelGetPoint()函數來讀取觸點坐標。在“觸摸屏事件”發生之前,超時時間會設置為無限等待。只有當“觸摸屏事件”發生后(觸點按下)才會開始讀坐標,并判斷是否還是按下狀態,如果還是按下狀態,那么就會設置超時時間為某一個有限值,這樣當 WaitForSingleObject等待時間超過這個值后又會去讀取坐標。這種機制就能保證我們能讀取到觸點移動的軌跡。

          當然要想使用“觸摸屏事件”,必須要有一個觸摸屏的中斷(當觸點按下,這個中斷發生),并將這個中斷和“觸摸屏事件”關聯起來,這樣中斷發生后,才會觸發“觸摸屏事件”。

          還有一種方法:不使用中斷,直接采用輪詢方式來讀取坐標,通過讀取坐標值的合法性來決定是否有觸點按下。這種方式下,WaitForSingleObject的第一個參數就不起作用,且第二個參數必須設為一個有限值,這個值就決定來輪詢的頻率。



        關鍵詞: Wince 嵌入式系統

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 武安市| 化隆| 页游| 通渭县| 通州区| 横峰县| 瓦房店市| 静宁县| 平凉市| 高碑店市| 宝应县| 华坪县| 尼勒克县| 开江县| 裕民县| 高碑店市| 闽清县| 溧水县| 蓬莱市| 兴国县| 青浦区| 阳原县| 久治县| 田林县| 洛宁县| 嘉荫县| 沙田区| 清远市| 盐山县| 平江县| 霍州市| 江达县| 交城县| 枣阳市| 格尔木市| 承德市| 新丰县| 玛沁县| 河北省| 左云县| 鄂伦春自治旗|