?? main.c
字號:
/****************************************************************************
* 文件名稱:main.c
* 功 能:讀取觸摸屏的動作,并顯示在對應的液晶屏幕上
* 說 明:短接JP3。
****************************************************************************/
#include "config.h"
void GPIO_Initialize(void);
void GetLCD_XY(uint16 *vx, uint16 *vy);
void DelayNS(uint32 dly);
void Beep(void);
uint8 Calibration(void);
uint16 errx1, erry1, errx2, erry2; // 一般存放基準點坐標
uint16 diffx, diffy; // 一般存放基準點坐標差值
uint16 x, y; // 一般存放當前坐標
/****************************************************************************
* 名 稱:main
* 功 能:主函數
* 說 明:
****************************************************************************/
int main (void)
{
GPIO_Initialize(); // 初始化GPIO
GUI_Initialize(); // 初始化LCM
GUI_FillSCR(WHITE); // 填充白色背景
while(Calibration() != 1); // 校準屏幕
while(1)
{
GetLCD_XY(&x, &y); // 獲取當前坐標
x = (x - errx1) * 280 / diffx + 20; // 通過基準點校準x
y = (y - erry1) * 200 / diffy + 20; // 通過基準點校準y
/* 通過點函數構成一個方點畫在LCD上 */
GUI_Point( x+1, y, BLACK);
GUI_Point( x-1, y, BLACK);
GUI_Point( x, y+1, BLACK);
GUI_Point( x, y-1, BLACK);
GUI_Point( x+1, y+1, BLACK);
GUI_Point( x-1, y-1, BLACK);
GUI_Point( x+1, y-1, BLACK);
GUI_Point( x-1, y+1, BLACK);
GUI_Point( x, y, BLACK);
}
return 0;
}
/****************************************************************************
* 名 稱:GPIO_Initialize()
* 功 能:初始化觸摸屏和蜂鳴器的GPIO
* 說 明:
****************************************************************************/
void GPIO_Initialize(void)
{
PINSEL0 = PINSEL0 & 0xFFFFCFFF;
IO0DIR = BEEPCON;
IO0SET = BEEPCON;
IO2DIR = ADS7843_CS|ADS7843_DIN|ADS7843_DCLK;
}
/****************************************************************************
* 名 稱:Calibration()
* 功 能:獲取校準基準點坐標
* 入口參數:uint16 *errx 用于保存校準點x坐標(LCD)的變量指針
* uint16 *erry 用于保存校準點y坐標(LCD)的變量指針
* 出口參數:1 成功 0 失敗
****************************************************************************/
uint8 Calibration(void)
{ uint16 sumx, sumy;
uint16 x, y, i;
/* 獲取左上角基準點 */
GUI_HLine( 0, 19, 39, BLACK);
GUI_RLine( 19, 0, 39, BLACK);
sumx = 0;
sumy = 0;
for(i=0; i<16; i++)
{
GetLCD_XY(&x, &y);
sumx = sumx + x;
sumy = sumy + y;
}
errx1 = sumx >> 4;
erry1 = sumy >> 4;
GUI_HLine( 0, 19, 39, WHITE);
GUI_RLine( 19, 0, 39, WHITE);
if( (errx1<0x500) && (errx1>0x000) && (erry1<0x500) && (erry1>0x000) )
{
Beep();
}
else
{
Beep();
Beep();
return(0);
}
/* 獲取右下角基準點 */
GUI_HLine( 279, 219, 319, BLACK);
GUI_RLine( 299, 199, 239, BLACK);
sumx = 0;
sumy = 0;
for(i=0; i<16; i++)
{
GetLCD_XY(&x, &y);
sumx = sumx + x;
sumy = sumy + y;
}
errx2 = sumx >> 4;
erry2 = sumy >> 4;
GUI_HLine( 279, 219, 319, WHITE);
GUI_RLine( 299, 199, 239, WHITE);
if( (errx2<0xfff) && (errx2>0xc00) && (erry2<0xfff) && (erry2>0xb00) )
{
Beep();
}
else
{
Beep();
Beep();
return(0);
}
diffx = errx2 - errx1;
diffy = erry2 - erry1;
return(1);
}
/****************************************************************************
* 名 稱:GetLCD_XY()
* 功 能:讀取觸摸屏上觸摸點的坐標。
* 程序會一直等待,直到有觸摸輸入。
* 入口參數:x 用于保存觸摸點x坐標(LCD)的變量指針
* y 用于保存觸摸點y坐標(LCD)的變量指針
* 出口參數:無
* 說 明:先通測量y軸的觸摸輸入,判斷是否有觸摸動作。如果有,則進行6次數據
* 采集,并進行去極值平均濾波處理。最后還要判斷觸摸輸入是否合法,只有
* 當觸摸輸入合法時才返回。
****************************************************************************/
void GetLCD_XY(uint16 *vx, uint16 *vy)
{ uint16 vx_dat, vy_dat;
uint16 vx_dat1, vy_dat1;
while(1)
{ // 判斷是否有觸摸動作(通過ADS7843的PENIRQ引腳進行判斷)
while(1)
{ vy_dat = ADS7843_WriteRead(AIN_Y);
if(vy_dat != 0) break;
}
// 進行數據采集
vx_dat = ADS7843_WriteRead(AIN_X);
vy_dat = ADS7843_WriteRead(AIN_Y);
vx_dat1 = ADS7843_WriteRead(AIN_X);
vy_dat1 = ADS7843_WriteRead(AIN_Y);
if((vy_dat<3) || (vy_dat1<3)) continue;
if(vx_dat>vx_dat1)
{
if((vx_dat-vx_dat1) > 32) continue;
}
else
{
if((vx_dat1-vx_dat) > 32) continue;
}
if(vy_dat>vy_dat1)
{
if((vy_dat-vy_dat1) > 64) continue;
}
else
{
if((vy_dat1-vy_dat) > 64) continue;
}
*vx = (vx_dat+vx_dat1) >> 1;
*vy = (vy_dat+vy_dat1) >> 1;
return;
}
}
/****************************************************************************
* 名稱:DelayNS()
* 功能:長軟件延時(dly毫秒,與程序運行速度有關)
* 入口參數:dly 延時參數,值越大,延時越久
* 出口參數:無
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<800; i++);
}
}
/****************************************************************************
* 名稱:Beep()
* 功能:控制蜂鳴器響一聲。
* 入口參數:無
* 出口參數:無
****************************************************************************/
void Beep(void)
{
IO0CLR = BEEPCON;
DelayNS(300);
IO0SET = BEEPCON;
DelayNS(150);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -