📄 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 + -