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

📄 main.c

📁 触摸屏幕的初始化和屏幕调整程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:         Huangshaobin
** Modified date:       2005.6.1
** Version:             1.1
** Descriptions:  触摸屏校准程序。读取触摸屏左上角和右下角两个指定点的A/D值,保存
**                到E2PROM中(起始地址为0xF0),以后使用触摸屏就不需要再校准。
********************************************************************************************************/
#include "config.h"

// 蜂鸣器控制口定义(P0.7)
#define     BEEPCON        (1<<7)

// 定义用于保存触摸屏(0,0)和两个校准点的坐标的电压值
uint16  g_vx_min, g_vy_min;
uint16  g_vinx0, g_viny0;
uint16  g_vinx1, g_viny1;

extern uint8 gImage_save_rst[];


/*--  宽度x高度=32x32  --*/
uint8 const  CUR_DATA[] = 
{
0xC0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,
0xDC,0x00,0x00,0x00,0xCE,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0xC3,0x80,0x00,0x00,
0xC1,0xC0,0x00,0x00,0xC0,0xE0,0x00,0x00,0xC0,0x70,0x00,0x00,0xC0,0x38,0x00,0x00,
0xC0,0x1C,0x00,0x00,0xC0,0x0E,0x00,0x00,0xC0,0x07,0x00,0x00,0xC0,0xFF,0x8F,0xF8,
0xC4,0xFF,0x8F,0xF8,0xCC,0x60,0x06,0x30,0xDE,0x70,0x06,0x30,0xFE,0x30,0x06,0xB0,
0xF7,0x38,0x03,0x60,0xE3,0x18,0x01,0xC0,0xC3,0x9C,0x01,0xC0,0x01,0x8C,0x03,0x60,
0x01,0xCE,0x06,0x30,0x00,0xC6,0x06,0xB0,0x00,0xE6,0x07,0xF0,0x00,0x7E,0x0F,0xF8,
0x00,0x3C,0x0F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

/*--  宽度x高度=20x20 (调整为24x20)  --*/
uint8 const  CUR1_DATA[] = 
{
0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,
0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0xFF,0xFF,0xF0,0xFF,0xFF,
0xF0,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,
0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00,0x00,0x60,0x00
};



/****************************************************************************
* 名称: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);
}


/****************************************************************************
* 名称:GetLCD_XY()
* 功能:读取触摸屏上触摸点的坐标。
*       程序会一直等待,直到有触摸输入。
* 入口参数:vx       用于保存触摸点x坐标(LCD)的变量指针
*           vy       用于保存触摸点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;            
            DelayNS(1); 
        } // end of while(1)...
    
        // 进行数据采集
        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) > 13) continue;
        }
        else
        {   if((vx_dat1-vx_dat) > 13) continue; 
        }
        
        if(vy_dat>vy_dat1) 
        {   if((vy_dat-vy_dat1) > 18) continue;
        }
        else
        {   if((vy_dat1-vy_dat) > 18) continue; 
        } 
        
        *vx = (vx_dat+vx_dat1) >> 1;
        *vy = (vy_dat+vy_dat1) >> 1;                          
        return;
    }
    
}



#define  VX_MIN_RANG        ((0x0FFF) * 1/5)
#define  VY_MIN_RANG        ((0x0FFF) * 1/5)
#define  VX_MAX_RANG        ((0x0FFF) * 4/5)
#define  VY_MAX_RANG        ((0x0FFF) * 4/5)
/****************************************************************************
* 名称:ChkTouch()
* 功能:触摸屏幕校准程序。会设置g_vx_min、g_vy_min和g_vinx0、g_viny0、
*       g_vinx1、g_viny1的值。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  ChkTouch(void)
{   // 在坐标(0,0)上显示校准图标(十字光标),图标格式为20x20,校准点为(10,10)
    GUI_LoadPic(0, 0, (uint8 *)CUR1_DATA, 20, 20);    
    // 读取触摸输入点坐标值,并判断值是否在合法的范围内
    while(1)
    {   // 读取触摸输入
        GetLCD_XY(&g_vx_min, &g_vy_min);
        DelayNS(50);                    // 延时50mS,防抖
        GetLCD_XY(&g_vinx0, &g_viny0);
  
        // 判断触摸输入是否有效
        if((g_vy_min<3) || (g_viny0<3)) continue;
        
        if(g_vinx0>g_vx_min) 
        {   if((g_vinx0-g_vx_min) > 13) continue;
        }
        else
        {   if((g_vx_min-g_vinx0) > 13) continue; 
        }
        
        if(g_viny0>g_vy_min) 
        {   if((g_viny0-g_vy_min) > 18) continue;
        }
        else
        {   if((g_vy_min-g_viny0) > 18) continue; 
        } 
        
        // 取得两次触摸输入的平均值        
        g_vinx0 = (g_vinx0+g_vx_min) >> 1;
        g_viny0 = (g_viny0+g_vy_min) >> 1;      
  
        // 判断触摸输入是否有效
        if((g_vinx0<VX_MIN_RANG) && 
           (g_viny0<VY_MIN_RANG))
        {   GUI_RectangleFill(0, 0, 0+20, 0+20, BLACK); 
            Beep();
            break;
        }
    }
    
    // 在坐标(299,219)上显示校准图标(十字光标),图标格式为20x20,校准点为(309,229)
    GUI_LoadPic(299, 219, (uint8 *)CUR1_DATA, 20, 20);
    // 读取触摸输入点坐标值,并判断值是否在合法的范围内
    while(1)
    {   // 读取触摸输入
        GetLCD_XY(&g_vx_min, &g_vy_min);
        DelayNS(50);                    // 延时50mS,防抖
        GetLCD_XY(&g_vinx1, &g_viny1);
  
        // 判断触摸输入是否有效
        if((g_vy_min<3) || (g_viny1<3)) continue;
        
        if(g_vinx1>g_vx_min) 
        {   if((g_vinx1-g_vx_min) > 13) continue;
        }
        else
        {   if((g_vx_min-g_vinx1) > 13) continue; 
        }
        
        if(g_viny1>g_vy_min) 
        {   if((g_viny1-g_vy_min) > 18) continue;
        }
        else
        {   if((g_vy_min-g_viny1) > 18) continue; 
        } 
        
        // 取得两次触摸输入的平均值        
        g_vinx1 = (g_vinx1+g_vx_min) >> 1;
        g_viny1 = (g_viny1+g_vy_min) >> 1;      
  
        // 判断触摸输入是否有效
        if((g_vinx1>VX_MAX_RANG) && 
           (g_viny1>VY_MAX_RANG))
        {   GUI_RectangleFill(299, 219, 299+20, 219+20, BLACK); 
            Beep();
            break;
        }
    }
    
    // 对数据进行转换,以便于得到(0,0)点的电压值   
    g_vx_min = g_vinx0 - (g_vinx1 - g_vinx0) * 10 / (309 - 10);
    g_vy_min = g_viny0 - (g_viny1 - g_viny0) * 10 / (229 - 10);
}



/*******************************************************
* 名称: GUI_DispPic
* 功能: 指定位置显示图片(图片大小为w、h)。
* 入口参数: x,y  		更新区域的起始点
*			w,h			区域宽度和高度
*           buffer      显示数据缓冲区
* 出口参数: 无
* 说明:不能正确显示,指定的起始点不对,或高度、宽度超出
*       液晶显示范围。
*******************************************************/
void  GUI_DispPic( uint16 x, uint16 y, 
                   uint16 w, uint16 h,
                   uint8  *buffer)
{
    int    i, j;
    
    volatile uint16  *DAT_Point;
    uint32   lcm_addr;  // 液晶显示地址
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -