新手上路
- 积分
- 35
- 金钱
- 35
- 注册时间
- 2013-8-30
- 在线时间
- 0 小时
|
发表于 2013-9-17 22:53:50
|
显示全部楼层
回复【40楼】正点原子:
---------------------------------
/*********************************************************************************************************
*
* File : TouchPanel.c
* Hardware Environment:
* Build Environment: RealView MDK-ARM Version: 4.20
* Version : V1.0
* By :
*
* (c) Copyright 2005-2011, WaveShare
* http://www.waveshare.net
* All Rights Reserved
*
*********************************************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "TouchPanel/TouchPanel.h"
#include "TouchPanel/config.h"
#include "LCD/LCD.h"
#include "ctiic.h"
/*  rivate variables ---------------------------------------------------------*/
/*  rivate define ------------------------------------------------------------*/
//电容触摸屏控制器
_m_ctp_dev ctp_dev=
{
GT811_Init,
GT811_Scan,//获得触摸点坐标,并保存
0,
0,
0,
0,
};
//触摸屏配置参数(触摸屏厂家提供)
const u8 GTP_CFG_DATA[]=
{
0x12,0x10,0x0E,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,0x05,0x55,0x15,0x55,0x25,0x55,
0x35,0x55,0x45,0x55,0x55,0x55,0x65,0x55,0x75,0x55,0x85,0x55,0x95,0x55,0xA5,0x55,
0xB5,0x55,0xC5,0x55,0xD5,0x55,0xE5,0x55,0xF5,0x55,0x1B,0x03,0x00,0x00,0x00,0x13,
0x13,0x13,0x0F,0x0F,0x0A,0x50,0x30,0x05,0x03,0x64,0x05,0xe0,0x01,0x20,0x03,0x00,
0x00,0x32,0x2C,0x34,0x2E,0x00,0x00,0x04,0x14,0x22,0x04,0x00,0x00,0x00,0x00,0x00,
0x20,0x14,0xEC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x30,
0x25,0x28,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
};
//触摸屏中断处理
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line5) != RESET) //没有这句话和下句话时,会一直运行中断程序
{
EXTI_ClearITPendingBit(EXTI_Line5);
ctp_dev.tpsta|=0X80;//标记有有效触摸
}
}
//向GT811写入一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:写数据长度
//返回值:0,成功;1,失败.
u8 GT811_WR_Reg(u16 reg,u8 *buf,u8 len)
{
u8 i;
u8 ret=0;
CT_IIC_Start();
CT_IIC_Send_Byte(CT_CMD_WR); //发送写命令
CT_IIC_Wait_Ack();
CT_IIC_Send_Byte(reg>>8); //发送高8位地址
CT_IIC_Wait_Ack();
CT_IIC_Send_Byte(reg&0XFF); //发送低8位地址
CT_IIC_Wait_Ack();
for(i=0;i<len;i++)
{
CT_IIC_Send_Byte(buf); //发数据
ret=CT_IIC_Wait_Ack();
if(ret)break;
}
CT_IIC_Stop(); //产生一个停止条件
return ret;
}
//从GT811读出一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:读数据长度
void GT811_RD_Reg(u16 reg,u8 *buf,u8 len)
{
u8 i;
CT_IIC_Start();
CT_IIC_Send_Byte(CT_CMD_WR); //发送写命令
CT_IIC_Wait_Ack();
CT_IIC_Send_Byte(reg>>8); //发送高8位地址
CT_IIC_Wait_Ack();
CT_IIC_Send_Byte(reg&0XFF); //发送低8位地址
CT_IIC_Wait_Ack();
CT_IIC_Start();
CT_IIC_Send_Byte(CT_CMD_RD); //发送读命令
CT_IIC_Wait_Ack();
for(i=0;i<len;i++)
{
buf=CT_IIC_Read_Byte(i==(len-1)?0:1); //发数据
}
CT_IIC_Stop();//产生一个停止条件
}
//向GT811发送配置参数
//buf:配置参数表指针
//cfg_len:配置参数长度
//返回值:0,成功;1,失败.
u8 GT811_Send_Cfg(u8 * buf,u16 cfg_len)
{
u8 ret=0;
u8 retry=0;
for(retry=0;retry<5;retry++)
{
ret=GT811_WR_Reg(CT_CONFIG_REG,buf,cfg_len);
if(ret==0)break;
delay_ms(10);
}
return ret;
}
//GT811唤醒
void GT811_Wakeup_Sleep(void)
{
TP_CS(0); //复位
delay_ms(10);
TP_CS(1); //释放复位
delay_ms(100);
}
//GT811初始化
//返回值:初始化结果
//0,初始化成功;
//1,发送配置参数错误
//2,版本错误
u8 GT811_Init(void)
{
u16 version=0;
u8 temp;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC,ENABLE);
/* TP_CS */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*TP_IRQ */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN ;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
TP_CS(1);
// Ex_NVIC_Config(GPIO_F,10,FTIR); //下降沿触发
// MY_NVIC_Init(3,3,EXTI15_10_IRQChannel,2); //抢占3,子优先级3,组2
EXIT_TouchPanel_Config();
NVIC_TouchPanel_Config();
CT_IIC_Init(); //电容触摸屏部分,IIC初始化
GT811_Wakeup_Sleep(); //唤醒GT811
GT811_RD_Reg(0X717,&temp,1); //读取版本高八位
version=(u16)temp<<8;
GT811_RD_Reg(0X718,&temp,1); //读取版本低八位
version|=temp;
printf("version:%x\r\n",version);
if(version==0X2010) //版本正确,发送配置参数
{
temp=GT811_Send_Cfg((u8*)GTP_CFG_DATA,sizeof(GTP_CFG_DATA));//发送配置参数
}else temp=2; //版本错误
return temp;
}
//扫描GT811
//得到的结果保存在ctp_dev结构体内
void GT811_Scan(void)
{
u8 buf[34];//一次读取34字节
if((ctp_dev.tpsta&0X80)==0)return; //有有效触摸,则读取数据,否则直接退出
GT811_RD_Reg(CT_READ_XY_REG,buf,34); //一次读取34个字节
ctp_dev.tpsta=buf[0]&0X1F; //触摸点标记位,同时清除有效触摸标记
#if CT_EXCHG_XY==1 //调转XY
ctp_dev.y[0]=480-(((u16)buf[2]<<8)+buf[3]); //触摸点0坐标
ctp_dev.x[0]=((u16)buf[4]<<8)+buf[5];
ctp_dev.ppr[0]=buf[6];
ctp_dev.y[1]=480-(((u16)buf[7]<<8)+buf[8]); //触摸点1坐标
ctp_dev.x[1]=((u16)buf[9]<<8)+buf[10];
ctp_dev.ppr[1]=buf[11];
ctp_dev.y[2]=480-(((u16)buf[12]<<8)+buf[13]);//触摸点2坐标
ctp_dev.x[2]=((u16)buf[14]<<8)+buf[15];
ctp_dev.ppr[2]=buf[16];
ctp_dev.y[3]=480-(((u16)buf[17]<<8)+buf[24]);//触摸点3坐标
ctp_dev.x[3]=((u16)buf[25]<<8)+buf[26];
ctp_dev.ppr[3]=buf[27];
ctp_dev.y[4]=480-(((u16)buf[28]<<8)+buf[29]);//触摸点4坐标
ctp_dev.x[4]=((u16)buf[30]<<8)+buf[31];
ctp_dev.ppr[4]=buf[32];
#else
ctp_dev.y[0]=((u16)buf[2]<<8)+buf[3]; //触摸点0坐标
ctp_dev.x[0]=800-(((u16)buf[4]<<8)+buf[5]);
ctp_dev.ppr[0]=buf[6];
ctp_dev.y[1]=((u16)buf[7]<<8)+buf[8]; //触摸点1坐标
ctp_dev.x[1]=800-(((u16)buf[9]<<8)+buf[10]);
ctp_dev.ppr[1]=buf[11];
ctp_dev.y[2]=((u16)buf[12]<<8)+buf[13]; //触摸点2坐标
ctp_dev.x[2]=800-(((u16)buf[14]<<8)+buf[15]);
ctp_dev.ppr[2]=buf[16];
ctp_dev.y[3]=((u16)buf[17]<<8)+buf[24]; //触摸点3坐标
ctp_dev.x[3]=800-(((u16)buf[25]<<8)+buf[26]);
ctp_dev.ppr[3]=buf[27];
ctp_dev.y[4]=((u16)buf[28]<<8)+buf[29]; //触摸点4坐标
ctp_dev.x[4]=800-(((u16)buf[30]<<8)+buf[31]);
ctp_dev.ppr[4]=buf[32];
#endif
}
/*************************************************
Function: void EXIT_Config(void);
Description: 触摸屏外部中断配置函数
Input: 无
Output: 无
*************************************************/
void EXIT_TouchPanel_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
/*使能外部中断复用时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/*映射GPIOA的Pin0至EXTILine0*/
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,GPIO_PinSource5);
EXTI_ClearITPendingBit(EXTI_Line5); //清外部线路0中断
EXTI_InitStructure.EXTI_Line = EXTI_Line5; //线路0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //触发模式为中断
//EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//; //下降沿触发
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;// //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //开外部中断
EXTI_Init(&EXTI_InitStructure);
}
/*************************************************
Function: void NVIC_TouchPanel_Config(void)
Description: 触摸屏嵌套中断断配置函数
Input: 无
Output: 无
*************************************************/
void NVIC_TouchPanel_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //嵌套分组为组0
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //中断通道为通道0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢断优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //开中断
NVIC_Init(&NVIC_InitStructure);
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/> |
|