您現在的位置是:首頁 > 攝影首頁攝影

觸控式螢幕程式設計_按下鬆開檢測

由 韋東山嵌入式Linux 發表于 攝影2021-07-20
簡介我們看看是怎麼做的一開始設定中斷初始化觸控式螢幕控制器,進入等待中斷模式這個時候如果按下觸控式螢幕就會進入Pen Down中斷就會進入AdcTsIntHandle這個總中斷函式這裡面分辨是按下觸控式螢幕進入自動(連續) XY軸座標轉換模式,

觸控式螢幕如何程式設計

觸控式螢幕程式設計_按下鬆開檢測

作者:韋東山

本文字數: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套

點選“瞭解更多”閱讀更多相關文章