#include "touch.h"
#include "ssd2119.h"
#include "delay.h"
#include "stdlib.h"
#include "math.h"
#include "24cxx.h"
#include "ctiic.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK Explorer STM32开发板
//触摸屏驱动(支持ADS7843/7846/UH7843/7846/XPT2046/TSC2046/GT811等)代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2013/6/10
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
_m_tp_dev tp_dev=
{
TP_Init,
TP_Scan,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
RTP_CMD_READX,
RTP_CMD_READY,
};
//触摸屏中断处理
void EXTI15_10_IRQHandler(void)
{
if(CTP_INT==0) //有触摸中断
{
tp_dev.tpsta|=0X80;//标记有有效触摸
//printf("EXTI15 10 IRQHandler Has intrrupt.\r\n");
}
EXTI->PR=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(CTP_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[i]); //发数据
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(CTP_CMD_WR); //发送写命令
CT_IIC_Wait_Ack();
CT_IIC_Send_Byte(reg&0XFF); //发送低8位地址
CT_IIC_Wait_Ack();
CT_IIC_Start();
CT_IIC_Send_Byte(CTP_CMD_RD); //发送读命令
CT_IIC_Wait_Ack();
for(i=0;i<len;i++)
{
buf[i]=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(CTP_CONFIG_REG,buf,cfg_len);
if(ret==0)break;
delay_ms(10);
}
return ret;
}
//GT811唤醒
void GT811_Wakeup_Sleep(void)
{
CTP_RST=0; //复位
delay_ms(10);
CTP_RST=1; //释放复位
delay_ms(100);
}
//////////////////////////////////////////////////////////////////////////////////
//电阻屏电容屏共用驱动
//触摸按键扫描
//mode:该参数仅适用于电阻触摸屏;0,屏幕坐标;1,物理坐标(校准等特殊场合用)
//返回值:0,没有任何触摸;1,有触摸(正在被触摸).
u8 TP_Scan(u8 mode)
{
u8 buf=0;
if(tp_dev.tpsta&0X80)
{
tp_dev.tpsta&=0X60;
GT811_RD_Reg(0x03,&buf,1);
tp_dev.x[0] = (s16)(buf & 0x0F)<<8;
GT811_RD_Reg(0x04,&buf,1);
tp_dev.x[0]|= (s16)buf;
GT811_RD_Reg(0x05,&buf,1);
tp_dev.y[0] = (s16)(buf & 0x0F)<<8;
GT811_RD_Reg(0x06,&buf,1);
tp_dev.y[0]|= (s16)buf;
//添加延时函数是为了GUI
delay_ms(10);
//printf("TP_Scan x=%d ; y=%d ;\r\n",tp_dev.x[0],tp_dev.y[0]);
return 1;//有事件
}
return 0;//tp_dev.tpsta&TP_PRES_DOWN; //返回当前的触屏状态
}
//触摸屏初始化
//返回值:0,初始化成功
// 其他,初始化失败
u8 TP_Init(void)
{
u16 version=0;
u8 res=0;
RCC->APB2ENR|=1<<3; //先使能外设IO PORTB时钟
RCC->APB2ENR|=1<<7; //先使能外设IO PORTF时钟
GPIOB->CRL&=0XFFFFF0FF; //PB2 推挽输出
GPIOB->CRL|=0X00000300;
GPIOB->ODR|=1<<2; //PB2 输出高
GPIOF->CRH&=0XFFFFF0FF; //PF10 输入
GPIOF->CRH|=0X00000800;
GPIOF->ODR|=1<<10; //PF10 上拉
tp_dev.tptype=1; //电容屏
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(0X0A1,&res,1);
version=(u16)res<<8;
res=0;
GT811_RD_Reg(0X0A2,&res,1);
version|=res;
printf("Touch panel version:%x\r\n",version);
GT811_RD_Reg(0X0A3,&res,1);
printf("Touch Chip vendor ID:%x\r\n",res);
return res;
}
#if 0
void GT811_RD_Data(u8 *buf,u8 len)
{
u8 i;
CT_IIC_Start();
CT_IIC_Send_Byte(CTP_CMD_RD); //发送读命令
CT_IIC_Wait_Ack();
for(i=0;i<len;i++)
{
buf[i]=CT_IIC_Read_Byte(i==(len-1)?0:1); //发数据
}
CT_IIC_Stop();//产生一个停止条件
}
#endif
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论








WinstonMao
- 粉丝: 21
- 资源: 16

上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
已下载
下载帮助

资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

- 1
- 2
- 3
- 4
- 5
前往页