2018年11月11日 星期日

DIY - ESP32:ESP32 XPT2046 電阻式觸摸屏模組 INT 程式(二十八)

DIY - ESP32:ESP32 XPT2046 電阻式觸摸屏模組 INT 程式(二十八):

完成了簡單的 I/O 掃瞄方式取得 XPT2046 的 XY 位置數值,便要使用 I/O 中斷(Interrupt / INT)方式來實現讀取 XY 位置數值,主要是 XPT2046 有 IRQ 輸出腳,當觸摸屏被觸碰,便會產生 IRQ 輸出,XPT2046 的 IRQ 會連接到 ESP32 的 GPIO25,GPIO25 腳已經設定後,當觸碰觸摸屏便會觸發 IRQ,然後便會執行中斷程式,讀取 XY 位置數值。

ESP32 XPT2046 電阻式觸摸屏模組 INT 製作
ESP32 XPT2046 電阻式觸摸屏模組 INT IO 設定:
// XPT2046 Touch Screen I/O Definition
// XPT2046 CS=Chip Select Pin
#define XPT2046_CS              0
#define XPT2046_CS_0          {GPIO.out_w1tc = (1 << XPT2046_CS);}
#define XPT2046_CS_1          {GPIO.out_w1ts = (1 << XPT2046_CS);}

//Definitions for T_DI pin Input (MCU Output MOSI)
#define XPT2046_MOSI         18
#define XPT2046_MOSI_0     {GPIO.out_w1tc = (1 << XPT2046_MOSI);}
#define XPT2046_MOSI_1     {GPIO.out_w1ts = (1 << XPT2046_MOSI);}

//Definitions for T_DO pin Output (MCU Input MISO)
#define XPT2046_MISO         17
#define XPT2046_MISO_IN    gpio_get_level(GPIO_NUM_17)

//Definitions for T_CLK pin (SCK) Output
#define XPT2046_SCK           23
#define XPT2046_SCK_0       {GPIO.out_w1tc = (1 << XPT2046_SCK);}
#define XPT2046_SCK_1       {GPIO.out_w1ts = (1 << XPT2046_SCK);}

// XPT2046 Interrupt IRQ
#define XPT2046_IRQ            25

ESP32 XPT2046 電阻式觸摸屏模組 INT 程式:
static void IRAM_ATTR gpio_isr_handler(void* arg)
{
    uint32_t gpio_num = (uint32_t) arg;
    xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}

esp_err_t alink_key_scan(TickType_t ticks_to_wait) {

            uint32_t io_num;
            while (1) {
                        xQueueReceive(gpio_evt_queue, &io_num, ticks_to_wait);
             
                        if ((gpio_get_level(io_num) == 0)) {                                      
                             gpio_intr_disable(XPT2046_IRQ);                        
                             gpio_isr_handler_remove(XPT2046_IRQ);
                             return 1;
                        }
            }
}

void gpio_task_example(void* arg)
{
            esp_err_t ret = 0;
            while (1) {
                        ret = alink_key_scan(portMAX_DELAY);
                        if (ret == -1)
                                    vTaskDelete(NULL);

                        switch (ret) {
                        case 1:
                                    xpt2046_readXY();                                                                                                     gpio_set_intr_type(XPT2046_IRQ, GPIO_INTR_NEGEDGE);
                                    gpio_isr_handler_add(XPT2046_IRQ, gpio_isr_handler, (void *) XPT2046_IRQ);
                                    break;
                        default:
                                    break;
                        }
            }
            vTaskDelete(NULL);
            vTaskDelay(1000 / portTICK_PERIOD_MS);
}

操作系統:Windows 7 64-bit 版本
開發環境:AiThinker05 版本
原程碼: ESP32 ESP-IDF V3.0rc1
程式: DIY-ESP32-033-XTP2046_02_IO_ISR-20181026

ESP32 XPT2046 電阻式觸摸屏模組 INT 程式
ESP32 XPT2046 電阻式觸摸屏模組 INT 程式
ESP32 XPT2046 電阻式觸摸屏模組 INT 程式 XY 顯示
相關網址:
※ DIY - ESP32:OV7670 CMOS VGA 圖像傳感器介紹(十八)
※ DIY - ESP32:OV7670 CMOS VGA 圖像傳感器原理(十九)
※ DIY - ESP32:OV7670 CMOS VGA 圖像傳感器控制(二十)
※ DIY - ESP32:AverLogic AL422B FIFO 晶片介紹(二十一)
※ DIY - ESP32:AverLogic AL422B FIFO 晶片原理(二十二)
※ DIY - ESP32:OV7670 + AL422B FIFO 圖像傳感器模組介紹(二十三)
※ DIY - ESP32:ESP32 + OV7670 + AL422B 攝像頭模組硬件(二十四)
※ DIY - ESP32:ESP32 + OV7670 + AL422B 攝像頭模組程式(二十五)
※ DIY - ESP32:ESP32 XPT2046 電阻式觸摸屏模組電路(二十六)
※ DIY - ESP32:ESP32 XPT2046 電阻式觸摸屏模組 I/O 程式(二十七)
※ DIY - ESP32:ESP32 OV7670 數位靜態相機 DSC 程式(二十九)

2018年 11月 11日 天氣報告
氣溫:24.8@ 20:10
相對濕度:百分之 62%
天氣:大致多雲

沒有留言:

張貼留言