第005节触摸屏编程按下松开检测

307 阅读4分钟

开始触摸屏编程,关于触摸屏编程大概会分为3个小节 第006节_触摸屏编程_ADC中断 第007节触摸屏编程定时器程序优化 里面有个中断程序 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中断模式

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

我们是31号中断

register_irq(31, AdcTsIntHandle);

怎么使能中断?

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

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

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

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();

}

第006节_触摸屏编程_ADC中断 这节课我们加上ADC中断把触点的xy坐标读出来

写出这个自动测量的函数 void enter_auto_measure_mode(void) { //现在是自动测量,我们没有机会分别设置这些开关

设置AUTO_PST =1 XY_PST = 00

ADCTSC = AUTO_PST | NO_OPR_MODE;

} void AdcTsIntHandle(int irq) { if (SUBSRCPND & (1<<TC_INT_BIT)) /* 如果是触摸屏中断 */ Isr_Tc();

if (SUBSRCPND & (1<<ADC_INT_BIT))  /* ADC中断,则会进入Adc中断处理函数 */

    Isr_Adc();
SUBSRCPND = (1<<TC_INT_BIT) | (1<<ADC_INT_BIT);

}

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    
{
    /* 进入"自动测量"模式 */
    enter_auto_measure_mode();

    /* 启动ADC */

ENABLE_START = 1就可以了 ADCCON |= (1<<0); } }

void Isr_Adc(void) { 进入adc中断后,等待触摸笔松开 int x = ADCDAT0 & 0x3ff; int y = ADCDAT1 & 0x3ff;

printf("x = %08d, y = %08d\n\r", x, y);

//等待触摸笔松开模式 enter_wait_pen_up_mode(); }