實驗:當觸筆點擊在觸摸屏上時,SecureCRT上顯示觸點的X,Y坐標;
目的:測試電阻觸摸屏驅動程序;
開發板:S3C2440
~~~
/*
*版權所有(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\n"
"bic r0, r0, #0x80\n"
"msr cpsr_c, r0\n"
:
:
);
}
/*******************************************************************
*函數名稱: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\n", xdata, ydata);
printf("\n\r");
/*7、再次進入等待按下中斷的狀態*/
ADCTSC = 0xd3;
}
~~~
中斷處理文件interrupt.c中觸摸屏中斷函數的調用程序:
~~~
/*******************************************************************
*函數名稱:handle_int()
*功能描述:中斷處理函數
*其他說明:
*******************************************************************/
void handle_int()
{
/*判斷產生中斷的中斷源*/
unsigned long value = *(INTOFFSET);
switch (value)
{
case 31 :
Ts_Handler(); //觸摸屏中斷
break;
default :
break;
}
}
~~~