觸摸屏在現代生活中普遍使用,它通過壓力或其他事件判斷屏幕被觸摸,從而將數據輸入、上報給系統處理。觸摸屏並不是lcd,而是在lcd上表面有一層adc,它的規格大小跟lcd屏幕大小一樣,而且厚度很薄,所以會讓我們誤以爲觸摸屏就是lcd本身。
通過開發板的原理圖及數據手冊,對觸摸屏一章仔細閱讀分析,便可以知道怎麼使用觸摸屏。觸摸屏分爲4種模式:
當然還有一種省電模式。
當要測量xy位置座標時,原理大概如圖:
在Linux中,觸摸屏驅動也是依據輸入子系統實現的,所以一般步驟爲:
1.分配一個input_dev結構體
2.設置能產生哪一類事件以及這類事件中的哪些事件。(按鍵類(觸摸按鍵事件),相對位移類(x/y絕對位移,絕對位移壓力))
3.利用input_register_device註冊
4.硬件相關操作
硬件操作的主要操作有:
設置分頻係數和 ADCDLY
註冊INT_TC中斷和AD中斷
使能時鐘
測量xy座標時還需要啓動adc
總結:
判斷觸摸屏被按下還是鬆開,是根據寄存器ADCDAT0的第15位,這一位如是爲1,則是被鬆開,爲0則是被按下。
在測量xy座標時,讀取ADCDAT0的低10位,即可得到x的座標,讀取ADCDAT1的低10位,即可得到y座標
如何處理觸摸屏被長按或滑動的情況?啓動定時器!
如何上報觸摸屏事件:
上報事件:
input_report_abs(struct input_dev *dev, unsigned int code, int value);
input_report_key(struct input_dev *dev, unsigned int code, int value);
如:
input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);
input_report_key(s3c_ts_dev, BTN_TOUCH, 0);
input_sync(s3c_ts_dev);
觸摸屏的數據如何更精確?
優化措施:
1.設置ADCDLY爲最大值, 這使得電壓穩定後再發出IRQ_TC中斷
2.如果ADC完成時, 發現觸摸筆已經鬆開, 則丟棄此次結果
3.多次測量求平均值
4.軟件過濾
5.啓動定時器處理長按/滑動的情況
例子:
幾種模式
上報事件:
input_report_abs(myts_dev, ABS_X, (x[0]+x[1]+x[2]+x[3])/4);
input_report_abs(myts_dev, ABS_Y, (y[0]+y[1]+y[2]+y[3])/4);
input_report_abs(myts_dev, ABS_PRESSURE, 1);
input_report_key(myts_dev, BTN_TOUCH, 1);
input_sync(myts_dev);