您的位置:首页 > 其它

ARM学习之触摸屏实验

2011-10-20 22:16 225 查看
/***************************************************

Project: 触摸屏实验

Writer: SHOW

Time:
2011/10/19

Hareware: 硬件平台:mini2440 , J-link.

Function: 点击触摸屏,SecureCRT终端显示相应的坐标。

Direction:

1.这个实验是在上个实验ADC的基础上进行的。
2.这里与上个实验不同是ADC转换用到的是中断方式,而不是查询方式。 ¥¥¥
用到了中断INT_ADC_S,需要说明的是这是个子中断,他的父中断是INT_ADC。
还用到了触摸屏中断INT_ADC_TC。要用子中断,必须先使能父中断,所以设置如下:
ClearPending(BIT_ADC) ; // 先清父中断
ClearSubPending(BIT_SUB_TC); // 清触摸屏中断
ClearSubPending(BIT_SUB_ADC_S);//清ADC转换中断
EnableIrq(BIT_ADC); // 使能父中断
EnableSubIrq(BIT_SUB_ADC_S);
EnableSubIrq(BIT_SUB_TC);

3.如果是查询方式则有要用到此语句:
while(rADCCON & ADC_START);

while(!(rADCCON & ADC_END_FLAG));
4.运行效果如下图所示。



***************************************************/

#include "2440addr.h"

#include "def.h"

#include "2440lib.h"

#include "uart.h" //uart.c by xgc

#define PRESCALE_EN (1<<14)

#define PRSCVL49 (49<<6)

#define CHANNEL0 (0<<3)

#define ADC_START (1<<0)

#define ADC_END_FLAG (1<<15)

#define MPLL_200MHZ ((0x5c<<12) | (0x01<<4) | (0x02))

void Set_PCLK_50M(void);

void Init_UART(void);

void Init_TouchScreen(void);

void __irq TouchScreenAuto(void);

//========================================================================

// 函数名称: 主函数

// 功能描述: 函数入口

// 参数: void

// 返回值: void

//========================================================================

void Main(void)

{

MMU_Init(); // 做这个实验没这个,中断出错。下次出错注意加上。

Set_PCLK_50M(); // 设置PCLK为50M

Init_UART();


Init_TouchScreen();

Uart_Printf("\n ---Touch Screen Test Code By SHOW---\n"); // UART_Printf 函数来源xgc的库uart.c

while(1);



}

//========================================================================

// 函数名称: 触摸屏初始化函数

// 功能描述 设置ADCCON,设置延时时间,ADC工作模式,和中断的设置。

// 参数: void

// 返回值: void

//========================================================================

void Init_TouchScreen(void)

{

rADCCON = (PRESCALE_EN | PRSCVL49 ) ; // 使能预分频功能。分频比设为49+1=50。ADC转换速率就是PCLK/50=1M。小于最大ADC转换速率2.5M。选择通道0.

rADCDLY = 50000; // 设置延时时间

rADCTSC = 0xd3; // 等待中断模式



ClearPending(BIT_ADC) ; // 函数来源2440addr.h

ClearSubPending(BIT_SUB_TC); // 清触摸屏中断

ClearSubPending(BIT_SUB_ADC_S);//清ADC转换中断

pISR_ADC = (U32)TouchScreenAuto;

EnableIrq(BIT_ADC); // 使能这些中断,其实就是不屏蔽。

EnableSubIrq(BIT_SUB_ADC_S);

EnableSubIrq(BIT_SUB_TC);

}

//========================================================================

// 函数名称: ADC中断服务函数

// 功能描述 这里有两个子中断服务函数。

// 参数: void

// 返回值: void

//========================================================================

void __irq TouchScreenAuto(void)

{

static U16 xdata=0,ydata=0;

static U16 count = 0;

if(rSUBSRCPND & BIT_SUB_TC)

{

ClearSubPending(BIT_SUB_TC);

rADCTSC |= (1<<2);//设置转换模式,X,Y连续自动转换,如果不设置则不能连续转换。

rADCCON |= ADC_START;

}

/*注意这里ADC用的是中断方式,而上一个ADC实验我用的查询方式 */

if(rSUBSRCPND & BIT_SUB_ADC_S)

{

ClearSubPending(BIT_SUB_ADC_S);

xdata=(rADCDAT0 & 0x3ff);// 获取坐标

ydata=(rADCDAT1 & 0x3ff);

Uart_Printf("count=%03d XP=%04d, YP=%04d\n", count++, xdata, ydata);



rADCTSC = 0xd3;

rADCTSC |= (1<<8); // 设置模式为等待松开。

while(1)


{

if(rSUBSRCPND & BIT_SUB_TC)// 这一次如果有中断请求,则说明是松开的中断。

{

ClearSubPending(BIT_SUB_TC);

rADCTSC = 0xd3; // 给0xd3 重新设置为等待中断模式,等待按下。

break;
//如果松开则跳出while(1)。

}

}

}

}

//========================================================================

// 函数名称: PCLK大小设置函数

// 功能描述 设置FCLK=200M,PCLk=50M

// 参数: void

// 返回值: void

//========================================================================

void Set_PCLK_50M(void)

{

rMPLLCON = 0;

rMPLLCON |= MPLL_200MHZ; // MPLL = FCLK

rCLKDIVN = 0x03; // FCLK:HCLK:PCLK = 1:2:4 => PCLK = 50MHz.

}

//========================================================================

// 函数名称: UART初始化子函数

// 功能描述: 设置UATR0的基本信息

// 参数: void

// 返回值: void

//========================================================================

void Init_UART(void)

{

rGPHCON |= ((1 << 7) | (1 << 5)); //设置 GPH2,GPH3 为TXD0,RXD0 口。

rGPHUP |= ((1 << 3) | (1 << 2));

rULCON0 = 0x03; // 无红外模式,数据位为8位。

rUCON0 = 0x05; // UART时钟源为PCLK。Transmit与Receive都为查询或者中断模式

rUFCON0 = 0x00;
// 不使用FIFO

rUMCON0 = 0x00;
// 不使用流控

rUBRDIV0 = (50000000 / (115200 * 16)) - 1; // 波特率为115200

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: