S 3 C 440抵抗タッチスクリーン駆動設計


実験:タッチパネルにタッチペンをクリックすると、SecureCRTに接点のX,Y座標が表示されます.
目的:抵抗タッチスクリーンドライバをテストする;
開発ボード:S 3 C 2440
/*
*    (C)2015,ZJU
*
*    :ts.c
*    :        
*    :     :	TX2440
*	      
*    :V1.0
*      :Frank	
*    :2015.12.22
*
*/

#define  ADCCON		(*(volatile unsigned int *)0x58000000)	//ADC control register
#define  ADCTSC		(*(volatile unsigned int *)0x58000004) 	//ADC Touch Screen Control Register
#define  ADCDLY		(*(volatile unsigned int *)0x58000008)	//ADC Start or interval delay register
#define  ADCDATA0	(*(volatile unsigned int *)0x5800000C)	//ADC conversion data register
#define  ADCDATA1	(*(volatile unsigned int *)0x58000010)	//ADC conversion data register

/*interrupt register*/
#define  SRCPND		(*(volatile unsigned long *)0x4A000000)
#define  INTMSK		(*(volatile unsigned long *)0x4A000008)
#define  INTPND		(*(volatile unsigned long *)0x4A000010)
#define  INTOFFSET	(*(volatile unsigned long *)0x4A000014)
#define  SUBSRCPND	(*(volatile unsigned long *)0x4A000018)
#define  INTSUBMSK	(*(volatile unsigned long *)0x4A00001C)


int xdata=0;
int ydata=0;


/*******************************************************************
*    :Ts_Init()
*    :        
*    :  ADC        
*    :2015.12.22
*******************************************************************/
void Ts_Init(void)
{
	/*1、  AD    */
	ADCCON = (1 << 14) | (49 << 6);		//AD    =PCLK/(Val + 1),     1MHz
	
	/*2、       */
	INTMSK = ~(1 << 31);
	INTSUBMSK = ~(1 << 9);
	
	/*3、         */
	ADCTSC = 0xd3;
	
	/***  CPSR      7 I(IRQ disable),   start.S      ****/
	//            
	__asm__(
	"mrs r0, cpsr
" "bic r0, r0, #0x80
" "msr cpsr_c, r0
" : : ); } /******************************************************************* * :Ts_Handler() * : * : * :2015.12.22 *******************************************************************/ void Ts_Handler(void) { /*1、 XY */ ADCTSC = (1 << 2); ADCCON |= (1 << 0); /*2、 */ while(!(ADCCON & (1 << 15))); /*3、 */ xdata = ADCDATA0 & 0x3ff; ydata = ADCDATA1 & 0x3ff; /*4、 */ SUBSRCPND |= (1 << 9); SRCPND = (1 << 31); INTPND = (1 << 31); /*5、 */ ADCTSC = 0xd3; ADCTSC |= (1 << 8); while(1) { if (SUBSRCPND & (1 << 9)) break; } /*6、 */ SUBSRCPND |= (1 << 9); SRCPND = (1 << 31); INTPND = (1 << 31); // X,Y printf("X is %d, Y is %d
", xdata, ydata); printf("
\r"); /*7、 */ ADCTSC = 0xd3; }

処理ファイルを中断するcのタッチパネル割り込み関数の呼び出しプログラム:
/*******************************************************************
*    :handle_int()
*    :      
*    :
*******************************************************************/
void handle_int()
{
	/*          */
	unsigned long value = *(INTOFFSET);	

	switch (value)	
	{
		case 31 :
			Ts_Handler();		//     
			break;
			
		default :
			break;	
	}
	
}