ADC&触摸屏硬件学习--触摸屏按下松开检测
一、感受
蛋疼的一天,真感觉自己的废了。好多天没有操作硬件了,上来感觉手非常生疏。并且遇到了一个小问题一直迟迟没有解决。
1、学习过程中遇到的问题总结
a、显示屏就是不能进入触摸中断。后来发现如下的设置出现了问题。这个小细节让我扣吃半天,由于这个设置始终不能进入触摸中断。
void touchscreen_int_down(void)
{
ADCTSC = UD_SEN_DOWN| YM_SEN_ENABLE | YP_SEN_DISABLE | XM_SEN_DISABLE | XP_SEN_DISABLE | PULLUP_ENABLE | AUTO_PST_AUTO| XY_PST_WAITING;
}
2、代码源码如下,这是已经调试好的了
主要就是用stylus 按下则输出down 松开串口输出up
#include "../s3c2440_soc.h"
#define UD_SEN_DOWN (0<<8)
#define UD_SEN_UP (1<<8)
#define YM_SEN_DISABLE (0<<7)
#define YM_SEN_ENABLE (1<<7)
#define YP_SEN_ENABLE (0<<6)
#define YP_SEN_DISABLE (1<<6)
#define XM_SEN_DISABLE (0<<5)
#define XM_SEN_ENABLE (1<<5)
#define XP_SEN_ENABLE (0<<4)
#define XP_SEN_DISABLE (1<<4)
#define PULLUP_ENABLE (0<<3)
#define PULLUP_DISABLE (1<<3)
#define AUTO_PST_AUTO (1<<2)
#define XY_PST_NO_OPERATION (0)
#define XY_PST_X_MEASURE (1)
#define XY_PST_Y_MEASURE (2)
#define XY_PST_WAITING (3)
void touchscreen_int_up(void)
{
ADCTSC = UD_SEN_UP| YM_SEN_ENABLE | YP_SEN_DISABLE | XM_SEN_DISABLE | XP_SEN_DISABLE | PULLUP_ENABLE | XY_PST_WAITING;
}
void touchscreen_int_down(void)
{
ADCTSC = UD_SEN_DOWN| YM_SEN_ENABLE | YP_SEN_DISABLE | XM_SEN_DISABLE | XP_SEN_DISABLE | PULLUP_ENABLE | AUTO_PST_AUTO| XY_PST_WAITING;
}
void AdcTsIntHandle(int irq)
{
/*读状态位判断处理*/
if(SUBSRCPND & (1 << 9))
{
//printf("ADCUPDN = 0x%x\n\r",ADCUPDN);
if(ADCUPDN & (1<<0))
{
/*触摸屏按下*/
printf("down ADCUPDN = 0x%x\n\r", ADCUPDN);
ADCUPDN &= ~(1<<0);
touchscreen_int_up();
}
if(ADCUPDN & (1<<1))
{
/*触摸屏松开*/
printf("up ADCUPDN = 0x%x\n\r", ADCUPDN);
ADCUPDN &= ~(1<<1);
touchscreen_int_down();
}
}
if(SUBSRCPND & (1 << 10))
{
printf("ADC irq %x\n\r");
}
/*清除中断标志位*/
SRCPND = 1 << 31;
INTPND = 1 << 31;
SUBSRCPND |= (1<<9) | (1<<10);
}
void touchscreen_initw(void)
{
/*触摸屏控制设置*/
ADCCON = (1<<14) | (49<<6) | (0<<3);
//ADCTSC = UD_SEN_DOWN| YM_SEN_ENABLE | YP_SEN_DISABLE | XM_SEN_DISABLE | XP_SEN_DISABLE | PULLUP_ENABLE | AUTO_PST_AUTO | XY_PST_WAITING;
ADCDLY = 0xfff;
/*中断设置*/
//INTMOD &= ~(1<<31);/*设置ADC为irq中断模式*/
//INTMSK &= ~(1<<31);/*使能ADC中断*/
SUBSRCPND = (1<<9) | (1<<10);
SRCPND = (1<<31) | (1<<25);
INTPND = (1<<31) | (1<<25);
register_irq(31,AdcTsIntHandle);
INTSUBMSK &= ~((1<<9) | (1<<10));/*使能touchscreen中断*/
touchscreen_int_down();
printf("touchscreen_init\n");
printf("INTSUBMSK = 0x%x,INTMSK = 0x%x,SUBSRCPND =0x%x,SRCPND = 0x%x,INTPND = 0x%x\n\r",INTSUBMSK,INTMSK,SUBSRCPND,SRCPND,INTPND);
}
浙公网安备 33010602011771号