裸机触摸屏定位程序

#include "2440.h"

#include <stdarg.h>
#include <stdio.h>	     // vsprintf defined 

void Port_Init(void)
{
	//GPIO  GPH2->TXD0 GPH3->RXD0
	rGPHCON |= (0xa<<4);
	rGPHUP  |= (0x3<<2);    // The pull up function is disabled GPH[10:0
}

void Delay(int val)
{
	int i;
	for(i=0;i<val;i++);
}

void ChangeClockDivider(int hdivn,int pdivn)
{
     // hdivn,pdivn FCLK:HCLK:PCLK
     //     0,0         1:1:1 
     //     1,1         1:2:4
     //     3,1         1:3:6 
     //     2,1         1:4:8    
    rCLKDIVN = (hdivn<<1) | pdivn;    
}

//*************************[ MPLL ]*******************************
void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
{
    rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
}

//*************************[ UART ]*******************************
void Uart_TxEmpty(int ch)
{
    if(ch==0)
        while(!(rUTRSTAT0 & 0x4)); //Wait until tx shifter is empty.
}

static int whichUart=0;

void Uart_Init(int ch,int pclk,int baud)
{
	whichUart = ch;
    if(pclk == 0)
    pclk    = PCLK;
    rUFCON0 = 0x0;   //UART channel 0 FIFO control register, FIFO disable
    rUMCON0 = 0x0;   //UART chaneel 0 MODEM control register, AFC disable
    rULCON0 = 0x3;   //Line control register : Normal,No parity,1 stop,8 bits
    rUCON0  = 0x245;   // Control register
    rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 );   //Baud rate divisior register 0
	   
	Uart_TxEmpty(whichUart);
}

//=====================================================================
void Uart_SendByte(int data)
{
    if(whichUart==0)
    {
        if(data=='\n')
        {
            while(!(rUTRSTAT0 & 0x2));
            Delay(0x10000);                 //because the slow response of hyper_terminal 
            WrUTXH0('\r');
        }
        while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
        Delay(0x10000);
        WrUTXH0(data);
    }      
}  

void Uart_SendString(char *pt)
{
    while(*pt)
        Uart_SendByte(*pt++);
}

void Uart_Printf(const char *fmt,...)
{
    va_list ap;
    char string[256];

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    Uart_SendString(string);
    va_end(ap);
}

//---------------------------------------->
void TS_ISR()
{
//	Uart_Printf("This is TS_ISR\n");
/*--------clear interrupt----------*/
	rINTPND = rINTPND;
	rSRCPND |= (0x1<<31); 
	rSUBSRCPND |= (0x1<<9);

/*---------------------------------*/
	rADCTSC = 0x0c;//auto x/y mode
	rADCCON |= (0x1<<0); //start adc
}
void ADC_ISR()
{
	int datx, daty;
//	Uart_Printf("This is ADC_ISR\n");
/*--------clear interrupt----------*/
	rINTPND = rINTPND;
	rSRCPND |= (0x1<<31); 
	rSUBSRCPND |= (0x1<<10);

/*------------read data--------------*/
	datx = (unsigned int)(rADCDAT0 & (0x3FF));
	daty = (unsigned int)(rADCDAT1 & (0x3FF));
/*----------------------------------*/
   	Uart_Printf("x=%d, y=%d\n",datx,daty);

  	rADCTSC = 0xD3;//waiting mode
}

__irq void ADC_TS_ISR(void)
{
	if(rSUBSRCPND & (1<<9))//TS_ISR
	  	TS_ISR();
	if(rSUBSRCPND & (1<<10))//ADC_ISR
		ADC_ISR();
}

void ADC_init(void)
{
	//ADCCON[14]=1  ---> f
	rADCCON |= (0x1 << 14);
	//ADCCON[13:6]=44  --->300KSPS
	rADCCON &= ~(0xff << 6);
	rADCCON |= (44 << 6);
	//ADCCON[5:3]=2  -->CHANNEL
	rADCCON |= (2 << 3);
	/*delay  */
	rADCDLY = 100000;
	/*narmal mode*/
	rADCCON &= ~(0x1<<2);  
	/*waiting mode*/
	rADCTSC = 0xD3;  
}

void INT_init()
{
	rINTMSK &=~(0x1<<31);	 //INT_ADC
	rINTSUBMSK &=~(0x1<<10); //INT_ADC_S
	rINTSUBMSK &=~(0x1<<9);	 //INT_TC
	pISR_ADC = (unsigned int)ADC_TS_ISR;
}

void xmain(void)
{
	ChangeClockDivider(3,1);        
	ChangeMPllValue(127,2,1);

	Port_Init();
	Uart_Init(0, 0, 115200);
	Uart_Printf("the main is running\n");
    INT_init();
	ADC_init();
	while(1);	
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值