⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 本软件一个处摸屏驱动软件
💻 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 + -