Wei Dongshan ARMベアメタルおよびuboot百科事典(第1拡張版)スタディノート18-レッスン018_ADCおよびタッチスクリーン_セクション003〜005_抵抗膜方式タッチスクリーンの原理とプログラミング

抵抗膜方式タッチスクリーンの原理

  1. 基本原理: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電圧を測定することで得られます。
  2. タッチスクリーンの使用プロセス:
    ①タッチスクリーンを押してタッチ割り込みを生成します->
    ②タッチ割り込みプログラムの場合:ADCを開始します(目的:XY座標を取得します)->
    ③ADCの完了を待ち、ADC割り込みを生成します->
    ④ADC割り込みプログラムの場合:ADC割り込み中央のXY座標を読み取る->
    ⑤タイマーを開始する->
    ⑥タイマー割り込みが発生し、タッチスクリーンがまだ押されているかどうかを判断しますか?->
    正プレス:②にジャンプ;リリース:プロセスを終了
    ここに画像の説明を挿入
    ここに画像の説明を挿入

2つのS3C2440ADCおよびタッチスクリーンチップの手動調査

ここに画像の説明を挿入
タッチスクリーン割り込み処理フロー:
ここに画像の説明を挿入

3つのプログラミングプロセス

  1. ADC / TCインターフェースを初期化します。
  2. タッチスクリーンは最初は押されておらず、TSは「割り込みモードを待機中」に設定されています
  3. 割り込み制御レジスタの設定:INTSUBMASK / INTMSK
  4. タッチスクリーンを押してTS割り込みに入ります。①自動取得モードに入ります。②ADCを開始します。
  5. ADC割り込み:①データの読み込み;②「割り込み待ちモード」に再度入る;③タイマーを開始する
  6. タイマー割り込み:①タッチを離すと終了します;②それでも押すと実行を続けます。
    プログラムフローチャートは以下のとおりです(タイマー割り込みを除く)。
    ここに画像の説明を挿入

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

おすすめ

転載: blog.csdn.net/xiaoaojianghu09/article/details/104352839