ARM学习之触摸屏实验

/***************************************************
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
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值