/***************************************************
Project: 触摸屏实验
Writer: SHOW
Time: 2011/10/19
Hareware: 硬件平台:mini2440 , J-link.
Function: 点击触摸屏,SecureCRT终端显示相应的坐标。
#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)
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
}
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 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
}