国嵌实验:触摸屏 分类: mini2440 裸机程序 2011-09-27 15:28 17人阅读 评论(0) 收藏 举报 #define GLOBAL_CLK 1 #include <st




#define GLOBAL_CLK1

#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"




#define ADC_FREQ 2500000


int count = 0;
volatile U32 preScaler;


int xdata,ydata;
void Test_Touchpanel(void);


static void __irq AdcTsAuto(void);


static void cal_cpu_bus_clk(void);
void Set_Clk(void);


/*延时函数*/
void delay(int times)
{
    int i,j;
    for(i=0;i<times;i++)
       for(j=0;j<400;j++);
}


/*主函数*/
int Main(void)
{
    int Scom=0;


    Set_Clk();
    Uart_Init(0,115200);
    Uart_Select(Scom);
    
    Test_Touchpanel();
    
    while(1);
    return 0;
}


/*触摸屏初始化*/
void Test_Touchpanel(void)
{
   
    rADCDLY=50000;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms
    
    /*设置AD转频率*/
    preScaler = ADC_FREQ;
    preScaler = 50000000/ADC_FREQ - 1; //PCLK=50M
    rADCCON = (1<<14)|(preScaler<<6); //ADCPRS En,PRSCVL
 


    /*设置触摸屏为等待中断模式,等待触摸笔被按下*/
    rADCTSC=0xd3;  //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
    
    /*clear irq*/
    rSRCPND = 0x80000000;
    rINTPND = 0x80000000;
    ClearSubPending(BIT_SUB_TC);  

    pISR_ADC = (U32)AdcTsAuto;


    /*enable INT_TC irq*/
    rINTMSK = 0x7fffffff;    
    EnableSubIrq(BIT_SUB_TC);
}


/*************************************************
Function name: AdcTsAuto
Parameter    : void
Description : 中断服务程序
Return : void
Argument     : void
Autor & date : Daniel
**************************************************/
static void __irq AdcTsAuto(void)
{


    U32 saveAdcdly;

    /****************stylus down************************/
    /*检测子中断源,判断是否是INT_TC中断,且触摸笔按下*/
    if(rSUBSRCPND & (BIT_SUB_TC))
    {
if( !(rADCDAT0&0x8000))
   Uart_Printf("\nStylus down\n");
else 
            Uart_Printf("\nStylus up\n");
    }

    /*pull-up disable,自动连续X,Y坐标转换*/
    rADCTSC = (1<<3)|(1<<2);
    saveAdcdly=rADCDLY;
    rADCDLY=40000;    //Normal conversion mode delay about (1/50M)*40000=0.8ms

/*开始AD转换*/
rADCCON|=0x1;                   //start ADC
    while(rADCCON & 0x1); //check if Enable_start is low
    
while(!(rADCCON & 0x8000));  //check if EC(End of Conversion) flag is high, This line is necessary~!!

while(!(rSRCPND & 0x80000000));  //check if ADC is finished with interrupt bit


/*获取X,Y坐标*/
xdata=(rADCDAT0&0x3ff);
    ydata=(rADCDAT1&0x3ff);
    
    ClearSubPending(BIT_SUB_TC);
    //ClearPending(BIT_ADC);
    rSRCPND = 0x80000000;
rINTPND = 0x80000000;  



    EnableSubIrq(BIT_SUB_TC);
    //EnableIrq(BIT_ADC);
    rINTMSK = 0x7fffffff;
    /****************stylus down************************/
    
    
    /****************stylus up**************************/


/*设置触摸屏为等待中断模式,等待触摸笔抬起*/
    rADCTSC =0xd3;    //Waiting for interrupt
rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.

while(1) //to check Pen-up state
{
if(rSUBSRCPND & (BIT_SUB_TC)) //check if ADC is finished with interrupt bit
{
Uart_Printf("Stylus Up Interrupt~!\n");
break; //if Stylus is up(1) state
}
}
/****************stylus up**************************/

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

rADCDLY=saveAdcdly; 
/*设置触摸屏为等待中断模式,等待下次触摸笔按下*/
    rADCTSC =0xd3;    //Waiting for interrupt
    
ClearSubPending(BIT_SUB_TC);  
    //ClearPending(BIT_ADC);
    rSRCPND = 0x80000000;
rINTPND = 0x80000000;


    EnableSubIrq(BIT_SUB_TC);
    //EnableIrq(BIT_ADC);
    rINTMSK = 0x7fffffff;
}




/*************************************************
Function name: Set_Clk()
Parameter    : void
Description : 设置CPU的时钟频率
Return : void
Argument     : void
Autor & date : Daniel
**************************************************/
void Set_Clk(void)
{
int i;
U8 key;
U32 mpll_val = 0 ;
i = 2 ;             //don't use 100M!
                //boot_params.cpu_clk.val = 3;
switch ( i ) {
case 0: //200
key = 12;
mpll_val = (92<<12)|(4<<4)|(1);
break;
case 1: //300
key = 13;
mpll_val = (67<<12)|(1<<4)|(1);
break;
case 2: //400
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
case 3: //440!!!
key = 14;
mpll_val = (102<<12)|(1<<4)|(1);
break;
default:
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
}

//init FCLK=400M, so change MPLL first
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);   //set the register--rMPLLCON
ChangeClockDivider(key, 12);    //the result of rCLKDIVN [0:1:0:1] 3-0 bit
cal_cpu_bus_clk();    //HCLK=100M   PCLK=50M
}
/*************************************************
Function name: cal_cpu_bus_clk
Parameter    : void
Description : 设置PCLK\HCLK\FCLK的频率
Return : void
Argument     : void
Autor & date : Daniel
**************************************************/
static void cal_cpu_bus_clk(void)
{
static U32 cpu_freq;
    static U32 UPLL;

U32 val;
U8 m, p, s;

val = rMPLLCON;
m = (val>>12)&0xff;
p = (val>>4)&0x3f;
s = val&3;


//(m+8)*FIN*2 不要超出32位数!
FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;     //FCLK=400M  FIN=12000000

val = rCLKDIVN;
m = (val>>1)&3;
p = val&1;
val = rCAMDIVN;
s = val>>8;

switch (m) {
case 0:
HCLK = FCLK;
break;
case 1:
HCLK = FCLK>>1;
break;
case 2:
if(s&2)
HCLK = FCLK>>3;
else
HCLK = FCLK>>2;
break;
case 3:
if(s&1)
HCLK = FCLK/6;
else
HCLK = FCLK/3;
break;
}

if(p)
PCLK = HCLK>>1;
else
PCLK = HCLK;

if(s&0x10)
cpu_freq = HCLK;
else
cpu_freq = FCLK;

val = rUPLLCON;
m = (val>>12)&0xff;
p = (val>>4)&0x3f;
s = val&3;
UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值