初级会员

- 积分
- 80
- 金钱
- 80
- 注册时间
- 2014-3-4
- 在线时间
- 0 小时
|

楼主 |
发表于 2014-7-13 11:26:57
|
显示全部楼层
移植触摸屏的驱动修改如下,供大家参考(只负责一个触摸点,其他的一样吧):
gt811.c
#include "gt811.h"
#include "ctiic.h"
#include "usart.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
#define EXTI15_10_IRQChannel ((u8)0x28) /* External Line[15:10] Interrupts */
//报错说 EXTI15_10_IRQChannel is undefined,故加了这一条 6/8
//电容触摸屏控制器
_m_ctp_dev ctp_dev=
{
GT811_Init,
GT811_Scan,
0,
0,
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 EXTI15_10_IRQHandler(void)
{
if(CT_INT==0) //有触摸中断
{
ctp_dev.tpsta|=0X80;//标记有有效触摸
}
EXTI-> R=1<<10; //清除LINE10上的中断标志位
}
//向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)
{
CT_RST=0; //复位
delay_ms(10);
CT_RST=1; //释放复位
delay_ms(100);
}
//GT811初始化
//返回值:初始化结果
//0,初始化成功;
//1,发送配置参数错误
//2,版本错误
u8 GT811_Init(void)
{
u16 version=0;
u8 temp;
RCC->APB2ENR|=1<<3; //先使能外设IO  ORTB时钟
RCC->APB2ENR|=1<<7; //先使能外设IO  ORTF时钟
GPIOB->CRL&=0XFFFFF0FF; //PB2 推挽输出
GPIOB->CRL|=0X00000300;
GPIOB->ODR|=1<<2; //PB2 输出高
GPIOF->CRH&=0XFFFFF0FF; //PF10 输入
GPIOF->CRH|=0X00000800;
GPIOF->ODR|=1<<10; //PF10 上拉
Ex_NVIC_Config(GPIO_F,10,FTIR); //下降沿触发
MY_NVIC_Init(3,3,EXTI15_10_IRQChannel,2); //抢占3,子优先级3,组2
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); //7/10注释掉,未注释时黑屏
if(version==0X2010) //版本正确,发送配置参数
{
temp=GT811_Send_Cfg((u8*)GTP_CFG_DATA,sizeof(GTP_CFG_DATA));//发送配置参数
}else temp=2; //版本错误
return temp;
}
//扫描GT811
//得到的结果保存在ctp_dev结构体内
u8 GT811_Scan(void)
{
u8 buf[34];//一次读取34字节
if(ctp_dev.tpsta&0X80) //有触摸按下
{
GT811_RD_Reg(CT_READ_XY_REG,buf,34); //一次读取34个字节
ctp_dev.tpsta&=0X60; //清除最低5位和最高位
ctp_dev.tpsta|=buf[0]&0X1F; //查看低5位是否有键按下
if((ctp_dev.tpsta&0X1F)==0)return 0;
ctp_dev.y[0]=480-(((u16)buf[2]<<8)+buf[3]);
ctp_dev.x[0]=((u16)buf[4]<<8)+buf[5];
if((ctp_dev.tpsta&TP_PRES_DOWN)==0) //之前没有被按下
{
ctp_dev.tpsta|=TP_PRES_DOWN|TP_CATH_PRES;
ctp_dev.x0=ctp_dev.x[0];
ctp_dev.y0=ctp_dev.y[0];
}
}else if(ctp_dev.tpsta&TP_PRES_DOWN) //之前是被按下的
{
ctp_dev.tpsta&=~TP_PRES_DOWN;
}
return ctp_dev.tpsta&TP_PRES_DOWN;
}
另外定义GUI_TOUCH_MeasureX 的C文件
#include "GUI.h" //在这里把GUI_TOUCH_DriverAnalog 里的四个GUI_TOUCH...都搬了过来
#include "GUI_X.h" //原来的都删去了 6/8
#include "gt811.h"
void GUI_TOUCH_X_ActivateX(void) {
}
void GUI_TOUCH_X_ActivateY(void) {
}
int GUI_TOUCH_X_MeasureX(void) {
if(ctp_dev.tpsta&0X80)
{
return ctp_dev.x[0];
}else return 0xffff;
}
int GUI_TOUCH_X_MeasureY(void) {
if(ctp_dev.tpsta&0X80)
{
ctp_dev.scan();
return ctp_dev.y[0];
}else return 0xffff;
} |
|