您現在的位置是:首頁 > 攝影首頁攝影
觸控式螢幕程式設計_按下鬆開檢測
觸控式螢幕如何程式設計
作者:韋東山
本文字數:3722,閱讀時長:4分鐘
開始觸控式螢幕程式設計,關於觸控式螢幕程式設計大概會分為3個小節
第006節_觸控式螢幕程式設計_ADC中斷
第007節_觸控式螢幕程式設計_定時器程式最佳化
參考《嵌入式Linux應用開發完全手冊》第14章 ADC和觸控式螢幕介面
可以參考下面這張圖
看懂這張圖的關鍵點在於 裡面有個中斷程式
AdcTsIntHandle
它是總的中斷,這裡面要分辨
if
, 如果是ADC中斷 那麼就呼叫
Isr_adc
來處理中段
else if
, 如果是觸控式螢幕中斷,那麼就呼叫Isr_tc中斷, 這些都是總中斷具體的中斷。
我們看看是怎麼做的
一開始設定中斷
初始化觸控式螢幕控制器,進入等待中斷模式
這個時候如果按下觸控式螢幕就會進入Pen Down中斷
就會進入AdcTsIntHandle這個總中斷函式
這裡面分辨是按下觸控式螢幕
進入自動(連續) X/Y軸座標轉換模式,啟動ADC,
ADC結束之後會產生一個ADC中斷
又再次進入這個AdcTsIntHandle總中斷
這裡面分辨是ADC中斷,這裡面呼叫Isr_Adc
我可以讀出這裡面的資料,再次設定暫存器
進入等待Pen UP中斷模式
鬆開觸控筆會再次產生一箇中斷
進入總中斷AdcTsIntHandle這裡面分辨,原來是鬆開了觸控筆,再次呼叫Isr_tc
這裡面又會設定進入等待Pen Down中斷模式
我們開始寫程式碼,在上一個影片ADC程式碼上進行修改
002_touchscreen_018_005/adc_touchscreen
我們在adc_touchscreen目錄下新增幾個檔案
touchscreen_test。ctouchscreen。c
我們開啟touchscreen。c檔案
void touchscreen_init(void){ 看看上面流程圖 /*1設定觸控式螢幕介面:也就是暫存器 */ /*2 設定中斷我們需要提供中斷處理函式 */ /*3 讓觸控式螢幕控制器進入“等待中斷模式” */}我們設定中斷處理函式void AdcTsIntHandle(void){}看一下之前我們是怎麼寫中斷的,看一下interrupt。c檔案void key_eint_irq(int irq)有個中斷號那麼我們也定義個int irq引數void AdcTsIntHandle(int irq)我們在這個裡面分辨一下if (SUBSRCPND & (1< 中斷號是多少? 開啟晶片手冊,找到中斷控制器 我們是31號中斷 register_irq(31, AdcTsIntHandle); 怎麼 使能 中斷? 我們需要把 INTSUBMISK 暫存器的 Bit9 Bit10 設定為0 宏定義 #define ADC_INT_BIT (10)#define TC_INT_BIT (9) 使能中斷,清零 INTSUBMSK &= ~((1< 還有INTMSK我們也需要把Bit31清零 #define INT_ADC_TC (31) Bit31位清零操作 INTMSK &= ~(1< 這句可以不用設定,因為 register_irq 已經設定 假設產生中斷就會進入 AdcTsIntHandle 函式中 分辨是觸控式螢幕終端還是ADC中斷 void AdcTsIntHandle(int irq){ if /* 如果是觸控式螢幕中斷 */ Isr_Tc(); if /* ADC中斷 */ Isr_Adc();} 如何進行分辨 if (SUBSRCPND & (1< 讀一下暫存器,找到觸控式螢幕的暫存器觸控筆,按下鬆開狀態暫存器 我們可以讀它 Bit1表示up Bit0表示down void Isr_Tc(void){ printf(“ADCUPDN = 0x%x, ADCDAT0 = 0x%x, ADCDAT1 = 0x%x, ADCTSC = 0x%x\n\r”, ADCUPDN, ADCDAT0, ADCDAT1, ADCTSC); if (ADCDAT0 & (1<<15)) { printf(“pen up\n\r”); enter_wait_pen_down_mode(); } else { printf(“pen down\n\r”); /* 進入“等待觸控筆鬆開的模式” */ enter_wait_pen_up_mode(); }}void AdcTsIntHandle(int irq){ if (SUBSRCPND & (1< 「新品首發」STM32MP157開發板火爆預售!首批僅300套 點選“瞭解更多”閱讀更多相關文章