龙空技术网

触摸屏编程_按下松开检测

韦东山嵌入式Linux 194

前言:

此刻看官们对“linux触摸板不能点击”大致比较关心,你们都想要剖析一些“linux触摸板不能点击”的相关知识。那么小编同时在网络上网罗了一些对于“linux触摸板不能点击””的相关资讯,希望我们能喜欢,小伙伴们一起来了解一下吧!

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

作者:韦东山

本文字数: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<<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_initvoid adc_ts_int_init(void){	/*注册中断处理函数*///怎么注册看之前的代码	register_irq(irq, irq_handle);

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

我们是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();}

如何进行分辨

 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;}

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

我们可以读它 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套

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

标签: #linux触摸板不能点击 #linux触摸屏 #linux 触屏 #linux开发板触摸屏