<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設計應用 > 基于μClinux的觸摸屏軟硬件關(guān)鍵技術(shù)分析

基于μClinux的觸摸屏軟硬件關(guān)鍵技術(shù)分析

作者: 時(shí)間:2008-11-26 來(lái)源:網(wǎng)絡(luò ) 收藏

  的中斷處理函數

  當筆中斷發(fā)生,程序進(jìn)入中斷處理函數。在中斷處理函數中,將完成對兩個(gè)中斷進(jìn)行處理,分別是外部的觸摸中斷(筆中斷)和SPI數據轉換中斷。與這兩個(gè)中斷對應的中斷處理函數,是觸摸屏軟件設計的關(guān)鍵所在。

  在中斷處理函數中使用定時(shí)器處理時(shí)間相關(guān)操作。定義函數set_timer_irq(),如下:

  staticvoidset_timer_irq(structtimer_list*timer,intdelay){

  del_timer(timer);

  timer->expires=jiffies+delay;

  add_timer(timer);

  }

  jiffies是一個(gè)表征系統自從啟動(dòng)以來(lái)到當前為止所運行時(shí)鐘數的變量,delay是設定的延長(cháng)時(shí)間(用時(shí)鐘數作為計數單位)。一旦時(shí)鐘數超過(guò)設定值,則觸發(fā)超時(shí)函數,在本程序中是handle_timeout( )。引入定時(shí)器的目的有兩個(gè):一是可以較為精確地控制系統由于消除電平升降造成信號抖動(dòng)所需要時(shí)間,二是能夠有效控制采樣坐標的數量,而不必引入占用大量系統資源的簡(jiǎn)單延時(shí)函數。使用SPI中斷而產(chǎn)生大量坐標數據這一問(wèn)題在文獻中沒(méi)有很好的解決辦法,只是簡(jiǎn)單地降低SPI時(shí)鐘頻率以取較少的數據量。本設計中引入定時(shí)器,可以很好地解決上述問(wèn)題。

  在handle_timeout()函數中,程序利用條件選擇語(yǔ)句,對觸摸屏(ts_drv_state)進(jìn)行判斷,如果是非Error狀態(tài),則使能SPI,進(jìn)入handle_spi_irq(),與ADS7843進(jìn)行數據通訊。在handle_spi_irq()中,程序利用條件選擇語(yǔ)句,根據觸摸屏(ts_drv_state)來(lái)進(jìn)行數據轉換操作,通過(guò)向觸摸屏控制芯片發(fā)送前文中提到的,來(lái)得到X和Y方向的坐標。具體邏輯可參見(jiàn)程序流程圖。一旦一次轉換完成,程序將根據點(diǎn)擊狀態(tài)信息(state_counter)來(lái)鑒別點(diǎn)擊的性質(zhì),在cause_event()函數中,分別對點(diǎn)擊和移動(dòng)做出了判斷。判定方法較為簡(jiǎn)單,只需將前后兩次采樣坐標之差與移動(dòng)閾值比較即可得出結論。此外,還區分了信號誤差和由于筆移動(dòng)造成的坐標改變,判別閾值可以由用戶(hù)自己設定。

  I/O控制

  對于硬件各個(gè)參數,包括采樣時(shí)間、消除抖動(dòng)開(kāi)關(guān)、消除抖動(dòng)時(shí)間,都可以通過(guò)I/O()在用戶(hù)程序里進(jìn)行設定,避免每次都直接改變,并重新編譯內核所帶來(lái)的時(shí)間開(kāi)銷(xiāo)。本程序中對I/O的定義是:staticintts_(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg);其中,參數cmd有兩個(gè)值,分別為:TS_PARAMS_GET和TS_PARAMS_SET,它們用來(lái)指出是獲取參數還是設定參數。用戶(hù)在調用這個(gè)函數的時(shí)候,只需要對這個(gè)參數按照事先約定的格式賦值,就可以方便地獲取或者改變觸摸屏當前參數,arg是指向所傳遞參數的指針。

  結論

  在獲得觸摸點(diǎn)的原始坐標(數值范圍由所選用的A/D轉換器位數決定)后,還要根據具體使用的液晶屏實(shí)際像素進(jìn)行轉換,以方便圖形界面的后續開(kāi)發(fā)??紤]到相鄰兩次的移動(dòng)閾值,按照如下公式對觸摸屏坐標進(jìn)行計算:

  

  其中XV為觸摸點(diǎn)X坐標顯示值,XW為觸摸點(diǎn)X坐標測量值(原始坐標值),(1)、(2)、(3)式在觸摸屏初始化時(shí)得到,方法是任取觸摸屏X方向左側和右側各一點(diǎn),以X△V=X△W=1,Xoffrer=0為初始值進(jìn)行測量得到新的3個(gè)參數:X△V、X△W和Xoffrer(在實(shí)際使用中此項工作屬于校準零點(diǎn)偏移),然后這3個(gè)參數就不再變動(dòng),對于每次測量到的任意觸摸點(diǎn)原始坐標XW,直接代入(4)式求出觸摸點(diǎn)的像素顯示坐標XV。 其中,XV1為觸摸屏左側點(diǎn)坐標顯示值;XV2為觸摸屏右側點(diǎn)坐標顯示值;XW1為觸摸屏左側點(diǎn)坐標測量值;XW2為觸摸屏右側點(diǎn)坐標測量值。

  本設計使用MicroWindows作為用戶(hù)界面,定制出每個(gè)桌面圖標的坐標區域,結合觸摸屏的采樣坐標,判斷是否在圖標區域坐標內,然后做出相應的事件處理。對于本設計中使用的開(kāi)發(fā)平臺,液晶屏是320240點(diǎn)陣的,物理尺寸為: 80mm60mm,ADS7843選擇12位轉換精度,觸摸屏理論分辨率為80/212=0.020mm,但是由于電平干擾和觸摸動(dòng)作發(fā)生時(shí)的物理干擾,實(shí)際的精度無(wú)法達到這個(gè)值。經(jīng)過(guò)測試,在我們平臺上對同一點(diǎn)的點(diǎn)擊精度可以達到1.0mm。本驅動(dòng)程序可以有效地區分點(diǎn)擊和移動(dòng)信號,如果配合手寫(xiě)識別軟件,能夠作為手寫(xiě)板的底層驅動(dòng)使用,實(shí)現手寫(xiě)輸入。


上一頁(yè) 1 2 3 4 5 6 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>