快捷搜索:  汽车  科技

触摸屏自身能编程序吗(触摸屏编程按下松开检测)

触摸屏自身能编程序吗(触摸屏编程按下松开检测)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<<TC_INT_BIT)) /* 如果是触摸屏中断 */ /*调用*/ Isr_Tc(); else if //如果是ADC中断 //调用 Isr_Adc(

触摸屏自身能编程序吗(触摸屏编程按下松开检测)(1)

来源:韦东山嵌入式专栏_ARM裸机加强版维基教程

作者:韦东山

本文字数:3722,阅读时长:4分钟

  • 开始触摸屏编程,关于触摸屏编程大概会分为3个小节
  • 第006节_触摸屏编程_ADC中断
  • 第007节_触摸屏编程_定时器程序优化
  • 参考《嵌入式Linux应用开发完全手册》第14章 ADC和触摸屏接口
  • 可以参考下面这张图

触摸屏自身能编程序吗(触摸屏编程按下松开检测)(2)

看懂这张图的关键点在于 里面有个中断程序 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.c touchscreen.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<<TC_INT_BIT)) /* 如果是触摸屏中断 */ /*调用*/ Isr_Tc(); else if //如果是ADC中断 //调用 Isr_Adc(); 我们等会实现这两个函数 我们继续写代码 void touchscreen_init(void) { 看看上面流程图 /*1 设置中断我们需要提供中断处理函数 */ adc_ts_int_init(); /*2 设置触摸屏接口:也就是寄存器 */ adc_ts_reg_init(); /*3 让触摸屏控制器进入"等待中断模式" */ enter_wait_pen_down_mode(); } //我们先来实现 adc_ts_int_init void adc_ts_int_init(void) { /*注册中断处理函数*/ //怎么注册看之前的代码 register_irq(irq irq_handle);

中断号是多少?打开芯片手册,找到中断控制器

触摸屏自身能编程序吗(触摸屏编程按下松开检测)(3)

触摸屏自身能编程序吗(触摸屏编程按下松开检测)(4)

我们是31号中断

register_irq(31 AdcTsIntHandle);

怎么使能中断?

我们需要把 INTSUBMISK寄存器的Bit9 Bit10设置为0 宏定义

#define ADC_INT_BIT (10) #define TC_INT_BIT (9)

使能中断,清零

INTSUBMSK &= ~((1<<ADC_INT_BIT) | (1<<TC_INT_BIT));

还有INTMSK我们也需要把Bit31清零

#define INT_ADC_TC (31)

Bit31位清零操作

INTMSK &= ~(1<<INT_ADC_TC);

这句可以不用设置,因为register_irq已经设置

假设产生中断就会进入AdcTsIntHandle函数中 分辨是触摸屏终端还是ADC中断

void AdcTsIntHandle(int irq) { if /* 如果是触摸屏中断 */ Isr_Tc(); if /* ADC中断 */ Isr_Adc(); }

如何进行分辨

触摸屏自身能编程序吗(触摸屏编程按下松开检测)(5)

if (SUBSRCPND & (1<<TC_INT_BIT)) /* 如果是触摸屏中断 */ Isr_Tc(); if (SUBSRCPND & (1<<ADC_INT_BIT)) /* ADC中断 */ Isr_Adc(); //我们要引用寄存器地址头文件 #include "../s3c2440_soc.h" #define ADC_INT_BIT (10) #define TC_INT_BIT (9) #define INT_ADC_TC (31) /* ADCTSC's bits */ #define WAIT_PEN_DOWN (0<<8) #define WAIT_PEN_UP (1<<8) #define YM_ENABLE (1<<7) #define YM_DISABLE (0<<7) #define YP_ENABLE (0<<6) #define YP_DISABLE (1<<6) #define XM_ENABLE (1<<5) #define XM_DISABLE (0<<5) #define XP_ENABLE (0<<4) #define XP_DISABLE (1<<4) #define PULLUP_ENABLE (0<<3) #define PULLUP_DISABLE (1<<3) #define AUTO_PST (1<<2) #define WAIT_INT_MODE (3) #define NO_OPR_MODE (0) void enter_wait_pen_down_mode(void) { ADCTSC = WAIT_PEN_DOWN | PULLUP_ENABLE | YM_ENABLE | YP_DISABLE | XP_DISABLE | XM_DISABLE | WAIT_INT_MODE; } void enter_wait_pen_up_mode(void) { ADCTSC = WAIT_PEN_UP | PULLUP_ENABLE | YM_ENABLE | YP_DISABLE | XP_DISABLE | XM_DISABLE | WAIT_INT_MODE; }

读一下寄存器 找到触摸屏的寄存器触摸笔 按下松开状态寄存器

触摸屏自身能编程序吗(触摸屏编程按下松开检测)(6)

我们可以读它 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<<TC_INT_BIT)) /* 如果是触摸屏中断 */ Isr_Tc(); // if (SUBSRCPND & (1<<ADC_INT_BIT)) /* ADC中断 */ // Isr_Adc(); SUBSRCPND = (1<<TC_INT_BIT) | (1<<ADC_INT_BIT); } void adc_ts_int_init(void) { SUBSRCPND = (1<<TC_INT_BIT) | (1<<ADC_INT_BIT); /* 注册中断处理函数 */ register_irq(31 AdcTsIntHandle); /* 使能中断 */ INTSUBMSK &= ~((1<<ADC_INT_BIT) | (1<<TC_INT_BIT)); //INTMSK &= ~(1<<INT_ADC_TC); } void adc_ts_reg_init(void) { /* [15] : ECFLG 1 = End of A/D conversion * [14] : PRSCEN 1 = A/D converter prescaler enable * [13:6]: PRSCVL adc clk = PCLK / (PRSCVL 1) * [5:3] : SEL_MUX 000 = AIN 0 * [2] : STDBM * [0] : 1 = A/D conversion starts and this bit is cleared after the startup. */ ADCCON = (1<<14) | (49<<6) | (0<<3); ADCDLY = 0xff; } void touchscreen_init(void) { /* 设置触摸屏接口:寄存器 */ adc_ts_reg_init(); printf("ADCUPDN = 0x%x SUBSRCPND = 0x%x SRCPND = 0x%x\n\r" ADCUPDN SUBSRCPND SRCPND); /* 设置中断 */ adc_ts_int_init(); /* 让触摸屏控制器进入"等待中断模式" */ enter_wait_pen_down_mode(); }

「新品首发」STM32MP157开发板火爆预售!首批仅300套

点击“了解更多”阅读更多相关文章

猜您喜欢: