抵抗膜方式タッチスクリーンの原理
- 基本原理:ADCはタッチスクリーンの内蔵抵抗をリアルタイムで測定します。接点の位置が異なり、ADCがリアルタイムで測定する抵抗も異なります。タッチスクリーンとLCDは2つのデバイスであり、タッチスクリーンはLCDを覆うフィルムの層です。
画面をクリックすると押されます
①X方向の座標を測定します:XPは3.3Vに接続し、XMはGNDに接続します; YPとYMは電源に接続しません; YP電圧を測定してX座標を取得します。
②Y座標の測定:YPは3.3V、YMはGND、XP、XMは電源に接続されていません。Y座標はXP電圧を測定することで得られます。 - タッチスクリーンの使用プロセス:
①タッチスクリーンを押してタッチ割り込みを生成します->
②タッチ割り込みプログラムの場合:ADCを開始します(目的:XY座標を取得します)->
③ADCの完了を待ち、ADC割り込みを生成します->
④ADC割り込みプログラムの場合:ADC割り込み中央のXY座標を読み取る->
⑤タイマーを開始する->
⑥タイマー割り込みが発生し、タッチスクリーンがまだ押されているかどうかを判断しますか?->
正プレス:②にジャンプ;リリース:プロセスを終了
2つのS3C2440ADCおよびタッチスクリーンチップの手動調査
タッチスクリーン割り込み処理フロー:
3つのプログラミングプロセス
- ADC / TCインターフェースを初期化します。
- タッチスクリーンは最初は押されておらず、TSは「割り込みモードを待機中」に設定されています
- 割り込み制御レジスタの設定:INTSUBMASK / INTMSK
- タッチスクリーンを押してTS割り込みに入ります。①自動取得モードに入ります。②ADCを開始します。
- ADC割り込み:①データの読み込み;②「割り込み待ちモード」に再度入る;③タイマーを開始する
- タイマー割り込み:①タッチを離すと終了します;②それでも押すと実行を続けます。
プログラムフローチャートは以下のとおりです(タイマー割り込みを除く)。
4つのプログラムコード実装プロセス(タッチスクリーンのプレスとリリース割り込みのみを実現)
コード:
//总初始化函数
void touchscreen_init(void)
{
//1. 初始化ADC/TC接口;
adc_ts_reg_init();
//2.设置中断控制寄存器:INTSUBMASK/INTMSK
adc_ts_int_init();
//3. 开始触摸屏没有按下,设置TS处于“等待中断模式”
enter_wait_pen_down_mode();
}
//4. 按下触摸屏,进入TS中断:①进入自动采集模式;②启动ADC
//5. ADC中断:①读数据;②再次进入“等待中断模式”;③启动定时器
//6. 定时器中断:①若松开触摸,结束;②若仍然按下,继续执行
//1 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;
}
//2 ADC/TS中断初始化函数
#define ADC_INT_BIT (10)
#define TC_INT_BIT (9)
void adc_ts_int_init (void)
{
/*为了避免误触发,清除中断标志位*/
SUBSRCPND = (1<<TC_INT_BIT) | (1<<ADC_INT_BIT);
/* 注册中断处理函数 */
//中断总开关已经设置过了
register_irq(31, AdcTsIntHandle);//31:中断号, AdcTsIntHandle:中断处理函数
/* 使能中断 */
//中断子开关
//ADC中断为INTSUBMSK寄存器bit10,
//TC中断为INTSUBMSK寄存器bit9
INTSUBMSK &= ~((1<<ADC_INT_BIT) | (1<<TC_INT_BIT));
}
//3 开始触摸屏没有按下,设置TS处于“等待中断模式”
//SS开关闭合,YM开关闭合,其余开关断开
/* 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 (0b11)//等待中断
#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;
}
//4.1 中断服务函数
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);
}
//4.1.1 中断服务子函数-触摸屏中断处理函数
void Isr_Tc(void)
{
//bit15=1表示up
if (ADCDAT0 & (1<<15))
{
void enter_wait_pen_down_mode();
printf("pen up\n\r");
}
//bit15=0表示down
else
{
/*需要检测触摸笔松开*/
enter_wait_pen_up_mode();
printf("pen down\n\r");
}
}
void enter_wait_pen_up_mode(void)
{
ADCTSC = WAIT_PEN_UP | PULLUP_ENABLE | YM_ENABLE | YP_DISABLE | XP_DISABLE | XM_DISABLE | WAIT_INT_MODE;
}