?? touch2410.c
字號:
/*
;************************************************************************************************************
;* 北京精儀達盛科技有限公司
;* 研 發 部
;*
;* http://www.techshine.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------
;*
;* 文件名稱 : Touch2410.c
;* 文件功能 : 該文件為S3C2410硬件平臺的觸摸屏程序驅動程序
;* 補充說明 :
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : ARM開發小組
;* 修改日期 : 2004/04/25
;* 版本聲明 : V1.0.1
;*-------------------------------------------- 歷史版本信息 -------------------------------------------------
;* 文件作者 : ARM開發小組
;* 創建日期 : 2004/04/20
;* 版本聲明 : v1.0.0
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/
#include "..\inc\touch2410.h"
#include "2410addr.h"
#include "..\..\Startup2410\INC\2410lib.h"
#include "..\glib\glib.h"
int TOUCH_X ;
int TOUCH_Y ;
extern char ad_flag;
#define isDebug 0 //如果此值是1,可以串口輸出信息,此值是0,不輸出信息
const int ADCount = 10;
int ArrayDat0[ADCount];
#define avaverage 0
#define optimize 1
#define method optimize
/*
***********************************************************************************************************
*
* ----***-- 配置宏 --***-----
*
***********************************************************************************************************
*/
#ifndef GUI_TOUCH_AD_LEFT // 由AD轉換器返回的320X240屏的最左面的值
//#define GUI_TOUCH_AD_LEFT 610
#define GUI_TOUCH_AD_LEFT 20
#endif
#ifndef GUI_TOUCH_AD_RIGHT // 由AD轉換器返回的320X240屏的最右面的值
#define GUI_TOUCH_AD_RIGHT 935
#endif
#ifndef GUI_TOUCH_AD_TOP // 由AD轉換器返回的320X240屏的最上面的值
//#define GUI_TOUCH_AD_TOP 710
#define GUI_TOUCH_AD_TOP 60
#endif
#ifndef GUI_TOUCH_AD_BOTTOM // 由AD轉換器返回的320X240屏的最下面的值
//#define GUI_TOUCH_AD_BOTTOM 360
#define GUI_TOUCH_AD_BOTTOM 960
#endif
#ifndef GUI_TOUCH_XSIZE
#define GUI_TOUCH_XSIZE 640
#endif
#ifndef GUI_TOUCH_YSIZE
#define GUI_TOUCH_YSIZE 480
#endif
/*
*************************************************************************************************************
- 函數名稱: void Touch_Show(int x, int y)
- 函數功能:觸摸屏觸點顯示函數
- 輸入參數:x:橫坐標,y:縱坐標
- 輸出參數:無
*************************************************************************************************************
*/
void Touch_Show(int x, int y)
{
Uart_Printf("量化后的結果:x = %d, y = %d\n\n",x,y);
Fill_Circle (x, y, 15);
Delay(1500);
Set_Color(GUI_RED);
Fill_Rect(0,0,639,479);
Set_Color(GUI_YELLOW);
}
/*
*************************************************************************************************************
- 函數名稱: void Touch_Init(void)
- 函數功能:初始化觸摸屏控制器
- 輸入參數:無
- 輸出參數:無
*************************************************************************************************************
*/
void Touch_Init(void)
{
rADCDLY = (0x5000); // ADC Start or Interval Delay
rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3); //設置成為等待中斷模式
//rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(3); //設置成為等待中斷模式,disable int
rADCCON = (1<<14)|(49<<6)|(7<<3)|(0<<2)|(1<<1)|(0); //設置ADC控制寄存器
}
/*
*************************************************************************************************************
- 函數名稱:void TouchINT_Init(void)
- 函數功能:觸摸屏中斷初始化
- 輸入參數:無
- 輸出參數:無
*************************************************************************************************************
*/
void TouchINT_Init(void) //觸摸屏硬件接口使能
{
if ((rSRCPND & BIT_ADC)){ //清除中斷掛起位
rSRCPND |= BIT_ADC;
}
if ((rINTPND & BIT_ADC)){
rINTPND |= BIT_ADC;
}
if ((rSUBSRCPND & BIT_SUB_TC)){
rSUBSRCPND |= BIT_SUB_TC;
}
if ((rSUBSRCPND & BIT_SUB_ADC)){
rSUBSRCPND |= BIT_SUB_ADC;
}
rINTMSK &= ~(BIT_ADC); //相關中斷屏蔽位置0,使能中斷
rINTSUBMSK &= ~(BIT_SUB_TC);
pISR_ADC = (unsigned)Touch_ISR; //設置中斷向量
}
/*
*************************************************************************************************************
- 函數名稱: void __irq Touch(void)
- 函數功能:觸摸屏中斷
- 輸入參數:無
- 輸出參數:無
*************************************************************************************************************
*/
void __irq Touch_ISR(void){
int AD_XY,yPhys,xPhys;
//關中斷
rINTMSK |= (BIT_ADC);
rINTSUBMSK |= (BIT_SUB_ADC | BIT_SUB_TC); // 關閉子中斷(ADC和TC)
//獲取位置
AD_XY = GetTouch_XY_AD();
yPhys = (AD_XY) & 0xffff; //獲取Y的AD值
xPhys = (AD_XY >> 16) & 0xffff;//獲取X的AD值
TOUCH_X = AD2X(xPhys);
TOUCH_Y = AD2Y(yPhys);
//
Touch_Show(TOUCH_X,TOUCH_Y);
//開中斷,清空掛起位
rSUBSRCPND |= BIT_SUB_TC;
ClearPending(BIT_ADC);
rINTMSK &= ~(BIT_ADC);
rINTSUBMSK &= ~(BIT_SUB_ADC);
rINTSUBMSK &= ~(BIT_SUB_TC);
}
/*
*************************************************************************************************************
- 函數名稱: void selectsort(int* r,int n)
- 函數功能:選擇排序
- 輸入參數:r[] is struct rec,n是要排序記錄的個數
- 輸出參數:無
*************************************************************************************************************
*/
void selectsort(int* r,int n){ //r[] is struct rec,選擇排序
int i,j,k;
int w;//struct rec
for(i = 0; i < n - 1; i ++){
k = i;
for (j = i + 1; j < n; j ++){
if (r[j] < r[k])
k = j;
}
if (k != i){
w=r[i];//交換
r[i]=r[k];
r[k]=w;
}
}
#if (isDebug == 1)
Uart_Printf("Sort::");
for (i = 0; i < n; i++)
Uart_Printf("%d, ", r[i]);
Uart_Printf(" end\n");
#endif
}
/*
*************************************************************************************************************
- 函數名稱: int GetDat0(int* p)
- 函數功能:將采集到的數據進行處理,去除不穩定的抖動值,得到準確的AD轉換值
- 輸入參數:采集到的數據的指針
- 輸出參數:準確的AD轉換值
*************************************************************************************************************
*/
int GetDat0(int* p){
int Dat0;
//const int ADCount = 10;
int tmp[9];//ADCount - 1
int i, k, diftag = 0;
struct ARRAYCMP{
int difsize;
int continuecount;
}ArrayCmp[9];//ADCount - 1
#if (method == avaverage) //將采集的點數據平均處理
Dat0 = 0;
for(i = 0; i < ADCount; i ++){
Dat0 += p[i]; //轉換結果累加,最后取平均
}
Dat0 /= ADCount;
#elif (method == optimize) //取最優點,即選取各點之間差別最小且連續個數最多的點,這是最穩定值
selectsort(p, ADCount); //將采集到的數據排序(由小到大)
for (i = 0; i < ADCount - 1; i ++){
tmp[i] = p[i + 1] - p[i]; //tmp[]存儲各點之間的差值
}
#if (isDebug == 1)
Uart_Printf("tmp:\n ");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -