2440裸機程序——觸摸屏測試程序

工程當中需要添加 S3C2440A.s ;2440lib.c;main.c;touchpanel.c這四個程序。


主程序:

/*********************************************************************************************
* File name: main.c
* Author: ZXL 
* Description: 通過中斷方式,返回觸摸屏上某觸點的X,Y座標,並用串口打印出來
* History: 2013.5.10
*********************************************************************************************/


#include "def.h"
#include "option.h"
#include "2440addr.h"     
#include "2440lib.h"


/*  
void dely(U32 tt) //本程序使用中斷方式查詢,故不需要延時函數
{
   U32 i;
   for(;tt>0;tt--)
        for(i=0;i<10000;i++);
}
*/


void init()
{
U32 i;
U8 key;
U32 mpll_val=0;
    i = 2 ;
switch ( i ) //設置2440的時鐘頻率
{
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;
}
//MDIV=92,PDIV=1,SDIV=1 通過配置MPLLCON,MPLL確定,即FCLK=400MHZ確定
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
ChangeClockDivider(key, 12);   //FCLK:HCLK:PCLK = 1:1/4:1/8 =400M:100M:50M
    
Port_Init();
  
Uart_Init(0,115200);
    Uart_Select(0);   
Uart_Printf("\n ADC Test!!!\n"); 
}  
   
int main(int argc, char **argv)
{
init(); //系統頻率、端口、串口初始化
    touchpanel_init(); //觸摸屏初始化    
    while(1);
return 0;   
}




觸摸屏程序:


/*********************************************************************************************
* File name: touchpanel.c
* Author: ZXL 
* Description: 通過中斷方式,返回觸摸屏上某觸點的X,Y座標,並用串口打印出來
* History: 2013.5.10
*********************************************************************************************/


#include "def.h"
#include "option.h"
#include "2440addr.h"     
#include "2440lib.h" 
#define ADC_FREQ 2500000 //AD轉換頻率選爲2.5MHZ 
U32  preScaler; //設置AD爲多少分頻  
U32  count = 0;
U32  xdata,ydata;
 
/*  
void delay(int times) //本程序使用中斷方式查詢,故不需要延時函數
{
    int i,j;
    for(i=0;i<times;i++)
       for(j=0;j<400;j++);
}
*/


void __irq ADC_Auto_ISR()
{   
    U32 saveAdcdly;
    /**************** stylus down ************************/
    /*檢測子中斷源,判斷是否是觸摸屏(INT_TC)中斷,且觸摸筆按下*/
    if(rSUBSRCPND & (BIT_SUB_TC))   //檢查是否完成了中斷位ADC
    {
if( !(rADCDAT0&0x8000))    Uart_Printf("\n觸摸筆按下!\n");
else             Uart_Printf("\n觸摸筆提起!\n");
    }
    
    rADCTSC |= (1<<3)|(1<<2); /*XP上拉無效,自動連續X,Y座標轉換*/
    saveAdcdly=rADCDLY;
    rADCDLY=40000;     //正常轉換模式延時 (1/50M)*40000=0.8ms

rADCCON |= 0x1;                /*設置AD開始轉換*/
    while(rADCCON & 0x1); //檢查AD轉換是否已經開始       
while(!(rADCCON & 0x8000));  //等待AD轉換結束
while(!(rSRCPND & 0x80000000));  //檢查AD中斷標誌位是否產生中斷請求  

xdata=(rADCDAT0&0x3ff);  /*獲取X,Y座標*/
    ydata=(rADCDAT1&0x3ff);
    
    ClearSubPending(BIT_SUB_TC);   //清中斷
    //ClearPending(BIT_ADC);
    rSRCPND = 0x80000000;
rINTPND = 0x80000000;  


    EnableSubIrq(BIT_SUB_TC);  //使能中斷
    //EnableIrq(BIT_ADC);
    rINTMSK = 0x7fffffff;  


    /**************** stylus up **************************/
/*設置觸摸屏爲等待中斷模式,等待觸摸筆擡起*/
    rADCTSC =0xd3;     //設置爲等待中斷模式  Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
rADCTSC=rADCTSC|(1<<8); //檢查光標提起中斷信號

while(1) //檢查擡筆狀態
{
if(rSUBSRCPND & (BIT_SUB_TC)) //擡筆時再次觸發中斷
{
Uart_Printf("觸摸筆提起!\n");
break;
}
}
Uart_Printf("count=%3d , XP=%4d, YP=%4d\n", count++, xdata, ydata);  

rADCDLY=saveAdcdly;
    rADCTSC =0xd3;    /*設置觸摸屏爲等待中斷模式,等待下次觸摸筆按下*/
    
ClearSubPending(BIT_SUB_TC);    //清中斷
    //ClearPending(BIT_ADC);
    rSRCPND = 0x80000000;
rINTPND = 0x80000000;


    EnableSubIrq(BIT_SUB_TC); //使能中斷
    //EnableIrq(BIT_ADC);
    rINTMSK = 0x7fffffff;
}


void touchpanel_init()   /*觸摸屏初始化*/
{   
    rADCDLY=50000;                  //正常轉換模式延遲 (1/3.6864M)*50000=13.56ms


preScaler = ADC_FREQ;   /*設置分頻時鐘*/
Uart_Printf("\n AD轉換頻率爲:%dHZ\n",preScaler);
preScaler = 50000000/ADC_FREQ - 1; //PCLK=50M  設置AD分頻係數,最大頻率爲2.5MHz
Uart_Printf("\n AD分頻係數PRSCVL爲:%d\n",preScaler);    
    rADCCON = (1<<14)|(preScaler<<6); //ADCPRS En,PRSCVL  
/*設置觸摸屏爲等待中斷模式,等待觸摸筆被按下*/
    rADCTSC=0xd3;   //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En
    Uart_Printf("\n ADC touch screen test!\n");
   
    ClearSubPending(BIT_SUB_TC);     /*清中斷*/
    //ClearPending(BIT_ADC);
    rSRCPND = 0x80000000;  
rINTPND = 0x80000000;


    EnableSubIrq(BIT_SUB_TC); //使能中斷
    //EnableIrq(BIT_ADC);
    rINTMSK = 0x7fffffff;


    pISR_ADC = (U32)ADC_Auto_ISR;  //將中斷執行函數如入地址賦給INT_TC中斷
}


發佈了31 篇原創文章 · 獲贊 26 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章