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

📄 main.c

📁 触摸屏校准程序-lpc2290
💻 C
📖 第 1 页 / 共 2 页
字号:
    g_vx_min = g_vinx0 - (g_vinx1 - g_vinx0) * 10 / (309 - 10);
    g_vy_min = g_viny0 - (g_viny1 - g_viny0) * 10 / (229 - 10);
}


/****************************************************************************
* 名称:DispCommButton()
* 功能:在屏幕上显示“保存”、“重新校准”按钮。
*       图片大小为70*70,显示位置为(250,0)--(319,69)
* 入口参数:无
* 出口参数:无
****************************************************************************/ 
void  DispCommButton(void)
{   volatile uint16  *DAT_Point;
    uint8  *p_dat;
    uint32  i, j;   
 
    // 取得图片数据的地址和液晶屏显示缓冲区的地址
    p_dat = gImage_save_rst;                
    DAT_Point = (void *) S1D13503_DAT;    
    
    // 填充按钮图片数据 
    for(i=0; i<70; i++)			            
    {   DAT_Point = DAT_Point + (320-70);   // 指向行的第1填充点 (x, 250)
        for(j=0; j<70; j++)                 // 图片宽度为70点        
        {   *DAT_Point = *p_dat;            // 发送图片数据
            DAT_Point++; 
            p_dat++;
        }
    }      
} 


/****************************************************************************
* 名称:SaveChkData()
* 功能:将触摸屏校准的数据保存到E2PROM中,保存地址为0xE0--0xFF。
* 入口参数:无
* 出口参数:无
* 说明:0xE0、0xE1保存触摸屏是否校准标志,为0x5A、0xA5时表示校准过;
*
*       0xE2、0xE3保存(0,0)点坐标的电压转换值g_vx_min; 
*       0xE4、0xE5保存(0,0)点坐标的电压转换值g_vy_min;
*       0xE6、0xE7保存第1个校验点的电压转换值g_vinx0;
*       0xE8、0xE9保存第1个校验点的电压转换值g_viny0;
*       0xEA、0xEB保存第2个校验点的电压转换值g_vinx1;
*       0xEC、0xED保存第2个校验点的电压转换值g_viny1;
*
*       0xF0、0xF1保存第1、2校验点之间的x轴点数wide;
*       0xF2、0xF4保存第1、2校验点之间的y轴点数high;
*        
*       其它单元保留。
****************************************************************************/
void  SaveChkData(void)
{   uint8  dat_buf1[20];
    uint8  dat_buf2[20];
    int    i;       

    // 设置数据
    dat_buf1[0] = 0x5A; // 校准标志
    dat_buf1[1] = 0xA5;
    
    dat_buf1[2] = g_vx_min >> 8;
    dat_buf1[3] = g_vx_min & 0x00FF;
    
    dat_buf1[4] = g_vy_min >> 8;
    dat_buf1[5] = g_vy_min & 0x00FF;
    
    dat_buf1[6] = g_vinx0 >> 8;
    dat_buf1[7] = g_vinx0 & 0x00FF;
    
    dat_buf1[8] = g_viny0 >> 8;
    dat_buf1[9] = g_viny0 & 0x00FF;
    
    dat_buf1[10] = g_vinx1 >> 8;
    dat_buf1[11] = g_vinx1 & 0x00FF;
    
    dat_buf1[12] = g_viny1 >> 8;
    dat_buf1[13] = g_viny1 & 0x00FF;
    
    dat_buf1[14] =  0x01;           // 值为309 - 10,即0x012B
    dat_buf1[15] =  0x2B;
    
    dat_buf1[16] =  0x00;           // 值为229 - 10,即0x00DB
    dat_buf1[17] =  0xDB;
    
                  
    // 写入数据
    ISendStr(CAT1025, 0xE0, dat_buf1, 14);
    DelayNS(10);                    // 10mS写周期
    ISendStr(CAT1025, 0xF0, &dat_buf1[14], 4);
    DelayNS(10);                    // 10mS写周期
            
    // 读出校验,若出错,则控制蜂鸣器响5声
    IRcvStr(CAT1025, 0xE0, dat_buf2, 14);
    IRcvStr(CAT1025, 0xF0, &dat_buf2[14], 4);
    for(i=0; i<18; i++)
    {   if(dat_buf2[i] != dat_buf1[i])
        {   Beep();
            Beep();
            Beep();
            Beep();
            Beep();
            break;
        }
    }
}


/****************************************************************************
* 名称:I2C_Init()
* 功能:主模式I2C初始化,包括初始化其中断为向量IRQ中断。
* 入口参数:fi2c		初始化I2C总线速率,最大值为400K
* 出口参数:无
****************************************************************************/
void  I2C_Init(uint32 fi2c)
{  if(fi2c>400000) fi2c = 400000;

   PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; // 设置I2C控制口有效

   I2SCLH = (Fpclk/fi2c + 1) / 2;	// 设置I2C时钟为fi2c
   I2SCLL = (Fpclk/fi2c) / 2;
   I2CONCLR = 0x2C;
   I2CONSET = 0x40;					// 使能主I2C
   
   /* 设置I2C中断允许 */
   VICIntSelect = 0x00000000;		// 设置所有通道为IRQ中断
   VICVectCntl0 = 0x29;				// I2C通道分配到IRQ slot 0,即优先级最高
   VICVectAddr0 = (int)IRQ_I2C;	    // 设置I2C中断向量地址	
   VICIntEnable = 0x0200;           // 使能I2C中断 
}   


uint32  t0_time;
/****************************************************************************
* 名称:TestDelayNS()
* 功能:测试DelayNS函数的延时时间。通过观察t0_time的值计算出实际延时时间。
* 入口参数:无
* 出口参数:无
****************************************************************************/          
void  TestDelayNS(void)
{   int  i;

    T0PR = 0;			            // 设置定时器0分频为1分频,计数频率为Fpclk    
    for(i=0; i<10; i++)
    {   T0TC = 0;
        T0TCR = 0x01;               // 启动定计器        
        DelayNS(1);                 // 调用软件延时
        T0TCR = 0x00;               // 停止定时器
        t0_time = T0TC;             // 读取定时计数值
    }    
}


/****************************************************************************
* 名称:main()
* 功能:触摸屏校准,并将校准参数保存到E2PROM中。
****************************************************************************/ 
int  main(void)
{   int     x1, y1;    
    uint16  x1_bak, y1_bak;
    uint16  vx1, vy1;
    
    // 测试软件延时函数延时时间
    TestDelayNS();    
    // 初始化控制I/O
    PINSEL0 = PINSEL0 & 0xFFFFCFFF;	
	IO0DIR = BEEPCON;
	IO0SET = BEEPCON;
	IO2DIR = ADS7843_CS|ADS7843_DIN|ADS7843_DCLK;  
	
	GUI_Initialize();				// 初始化LCM  
	GUI_SetColor(DGRAY, BLACK);     // 设置前景色和背景色
    I2C_Init(100000);               // 初始化I2C    
    IRQEnable();                    // 使能IRQ中断
    
    while(1)
    {   GUI_ClearSCR();             // 清屏
    
        // 进入触摸屏幕校准程序,会设置g_vx_min、g_vy_min和g_vinx0、g_viny0、
        // g_vinx1、g_viny1的值。
        ChkTouch();    
        // 显示操作按钮
        DispCommButton();
       
        // 显示原始光标            
        GUI_LoadPic(0, 0, (uint8 *)CUR_DATA, 32, 32); 
        x1_bak = y1_bak = 0;    
    
        // 读取触摸屏输入,在相应位置上显示光标    
        while(1)
        {   // 读取新的触摸点 
            GetLCD_XY(&vx1, &vy1);      
                
            // 转换坐标值 
            x1 = (vx1 - g_vx_min) * (309 - 10) / (g_vinx1 - g_vinx0);
            y1 = (vy1 - g_vy_min) * (229 - 10) / (g_viny1 - g_viny0);
            if(x1<0) x1 = 0;
            if(y1<0) y1 = 0;        
            if(x1>319) x1 = 319;
            if(y1>239) y1 = 239;  
            
            // 判断是按钮命令
            if( (x1>257) && (x1<315) &&
                (y1>4)   && (y1<27)  )      // 参数保存
            {   SaveChkData();          
                Beep();                        
            }            
            if( (x1>257) && (x1<315) &&
                (y1>40)  && (y1<63)  )      // 重新校准
            {   Beep(); 
                break;                
            }
            
            // 不允许移动光标到屏幕上的按钮区(否则会破坏显示)
            // 保护矩形区域为(320-70-35,0) -- (319, 70+5)
            if((x1>215) && (y1<75)) continue;                        
        
            // 删除上一次的光标显示
            GUI_RectangleFill(x1_bak, y1_bak, x1_bak+32, y1_bak+32, BLACK);         
        
            // 显示光标        
            GUI_LoadPic(x1, y1, (uint8 *)CUR_DATA, 32, 32);
            x1_bak = x1;
            y1_bak = y1;        
        }  // end of while(1)...
    } // end of while(1)...
    
    return(0);
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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