我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 868|回复: 8

STM32 触摸控制 GT9137

[复制链接]

该用户从未签到

36

主题

12

回帖

81

积分

一级逆天

积分
81

终身成就奖

发表于 2020-11-25 08:10:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
#include "gt9147.h"
#include "touch.h"
#include "ctiic.h"
#include "usart.h"
#include "delay.h"
#include "string.h"


//GT9147配置参数表
//第一个字节为版本号(0X60),必须保证新的版本号大于等于GT9147内部
//flash原有版本号,才会更新配置.
const u8 GT9147_CFG_TBL[]=
{
    0X60,0XE0,0X01,0X20,0X03,0X05,0X35,0X00,0X02,0X08,
    0X1E,0X08,0X50,0X3C,0X0F,0X05,0X00,0X00,0XFF,0X67,
    0X50,0X00,0X00,0X18,0X1A,0X1E,0X14,0X89,0X28,0X0A,
    0X30,0X2E,0XBB,0X0A,0X03,0X00,0X00,0X02,0X33,0X1D,
    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X32,0X00,0X00,
    0X2A,0X1C,0X5A,0X94,0XC5,0X02,0X07,0X00,0X00,0X00,
    0XB5,0X1F,0X00,0X90,0X28,0X00,0X77,0X32,0X00,0X62,
    0X3F,0X00,0X52,0X50,0X00,0X52,0X00,0X00,0X00,0X00,
    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,
    0X0F,0X03,0X06,0X10,0X42,0XF8,0X0F,0X14,0X00,0X00,
    0X00,0X00,0X1A,0X18,0X16,0X14,0X12,0X10,0X0E,0X0C,
    0X0A,0X08,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
    0X00,0X00,0X29,0X28,0X24,0X22,0X20,0X1F,0X1E,0X1D,
    0X0E,0X0C,0X0A,0X08,0X06,0X05,0X04,0X02,0X00,0XFF,
    0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
    0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
    0XFF,0XFF,0XFF,0XFF,
};  
//发送GT9147配置参数
//mode:0,参数不保存到flash
//     1,参数保存到flash
u8 GT9147_Send_Cfg(u8 mode)
{
    u8 buf[2];
    u8 i=0;
    buf[0]=0;
    buf[1]=mode;    //是否写入到GT9147 FLASH?  即是否掉电保存
    for(i=0;i<sizeof(GT9147_CFG_TBL);i++)buf[0]+=GT9147_CFG_TBL;//计算校验和
    buf[0]=(~buf[0])+1;
    GT9147_WR_Reg(GT_CFGS_REG,(u8*)GT9147_CFG_TBL,sizeof(GT9147_CFG_TBL));//发送寄存器配置
    GT9147_WR_Reg(GT_CHECK_REG,buf,2);//写入校验和,和配置更新标记
    return 0;
}  
//向GT9147写入一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:写数据长度
//返回值:0,成功;1,失败.
u8 GT9147_WR_Reg(u16 reg,u8 *buf,u8 len)
{
    u8 i;
    u8 ret=0;
    CT_IIC_Start();   
     CT_IIC_Send_Byte(GT_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;
}
//从GT9147读出一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:读数据长度              
void GT9147_RD_Reg(u16 reg,u8 *buf,u8 len)
{
    u8 i;
     CT_IIC_Start();   
     CT_IIC_Send_Byte(GT_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(GT_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();//产生一个停止条件   
}
//初始化GT9147触摸屏
//返回值:0,初始化成功;1,初始化失败
u8 GT9147_Init(void)
{
    u8 temp[5];
    RCC->APB2ENR|=1<<4;        //先使能外设IO PORTC时钟                              
    GPIOC->CRL&=0XFFFFFF0F;    //PC1 推挽输出
    GPIOC->CRL|=0X00000030;      
    GPIOC->ODR|=1<<1;        //PC1 输出1
    GPIOC->CRH&=0XFF0FFFFF;    //PC13 推挽输出
    GPIOC->CRH|=0X00300000;      
    GPIOC->ODR|=1<<13;           //PC13 推挽输出
    CT_IIC_Init();          //初始化电容屏的I2C总线  
    GT_RST=0;                //复位
    delay_ms(10);
     GT_RST=1;                //释放复位
     delay_ms(10);
    GPIOC->CRL&=0XFFFFFF0F;    //PC1 下拉输入
    GPIOC->CRL|=0X00000080;      
    GPIOC->ODR&=~(1<<1);    //PC1 下拉   
     delay_ms(100);
    GT9147_RD_Reg(GT_PID_REG,temp,4);//读取产品ID
    temp[4]=0;
    printf("CTP ID:%s\r\n",temp);    //打印ID
    if(strcmp((char*)temp,"9147")==0)//ID==9147
    {
        temp[0]=0X02;            
        GT9147_WR_Reg(GT_CTRL_REG,temp,1);//软复位GT9147
        GT9147_RD_Reg(GT_CFGS_REG,temp,1);//读取GT_CFGS_REG寄存器
        if(temp[0]<0X60)//默认版本比较低,需要更新flash配置
        {
            printf("Default Ver:%d\r\n",temp[0]);
            GT9147_Send_Cfg(1);//更新并保存配置
        }
        delay_ms(10);
        temp[0]=0X00;     
        GT9147_WR_Reg(GT_CTRL_REG,temp,1);//结束复位   
        return 0;
    }
    return 0;
}
const u16 GT9147_TPX_TBL[5]={GT_TP1_REG,GT_TP2_REG,GT_TP3_REG,GT_TP4_REG,GT_TP5_REG};
//扫描触摸屏(采用查询方式)
//mode:0,正常扫描.
//返回值:当前触屏状态.
//0,触屏无触摸;1,触屏有触摸
u8 GT9147_Scan(u8 mode)
{
    u8 buf[4];
    u8 i=0;
    u8 res=0;
    u8 temp;
    static u8 t=0;//控制查询间隔,从而降低CPU占用率   
    t++;
    if((t%10)==0||t<10)//空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率
    {
        GT9147_RD_Reg(GT_GSTID_REG,&mode,1);//读取触摸点的状态
        if((mode&0XF)&&((mode&0XF)<6))
        {
            temp=0XFF<<(mode&0XF);//将点的个数转换为1的位数,匹配tp_dev.sta定义
            tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES;
            for(i=0;i<5;i++)
            {
                if(tp_dev.sta&(1<<i))    //触摸有效?
                {
                    GT9147_RD_Reg(GT9147_TPX_TBL,buf,4);    //读取XY坐标值
                    if(tp_dev.touchtype&0X01)//横屏
                    {
                        tp_dev.y=((u16)buf[1]<<8)+buf[0];
                        tp_dev.x=800-(((u16)buf[3]<<8)+buf[2]);
                    }else
                    {
                        tp_dev.x=((u16)buf[1]<<8)+buf[0];
                        tp_dev.y=((u16)buf[3]<<8)+buf[2];
                    }  
                    //printf("x[%d]:%d,y[%d]:%d\r\n",i,tp_dev.x,i,tp_dev.y);
                }            
            }
            res=1;
            if(tp_dev.x[0]==0 && tp_dev.y[0]==0)mode=0;    //读到的数据都是0,则忽略此次数据
            t=0;        //触发一次,则会最少连续监测10次,从而提高命中率
        }
         if(mode&0X80&&((mode&0XF)<6))
        {
            temp=0;
            GT9147_WR_Reg(GT_GSTID_REG,&temp,1);//清标志         
        }
    }
    if((mode&0X8F)==0X80)//无触摸点按下
    {
        if(tp_dev.sta&TP_PRES_DOWN)    //之前是被按下的
        {
            tp_dev.sta&=~(1<<7);    //标记按键松开
        }else                        //之前就没有被按下
        {
            tp_dev.x[0]=0xffff;
            tp_dev.y[0]=0xffff;
            tp_dev.sta&=0XE0;    //清除点有效标记   
        }     
    }     
    if(t>240)t=10;//重新从10开始计数
    return res;
}
回复

使用道具 举报

  • TA的每日心情
    开心
    2024-12-18 15:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    61

    主题

    2245

    回帖

    914

    积分

    二级逆天

    积分
    914

    终身成就奖特殊贡献奖优秀斑竹奖

    发表于 2020-11-25 08:23:11 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    6218

    回帖

    8731

    积分

    二级逆天

    积分
    8731

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2020-11-25 08:27:28 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    4

    主题

    580

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖

    发表于 2020-11-25 08:43:46 | 显示全部楼层
    精彩内容分享,感谢楼主
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 09:02
  • 签到天数: 152 天

    [LV.7]常住居民III

    0

    主题

    3781

    回帖

    7750

    积分

    二级逆天

    积分
    7750

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-11-25 08:46:16 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:22
  • 签到天数: 186 天

    [LV.7]常住居民III

    6

    主题

    6830

    回帖

    1万

    积分

    三级逆天

    积分
    14513

    终身成就奖特殊贡献奖原创先锋奖

    发表于 2020-11-25 08:48:04 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    昨天 18:48
  • 签到天数: 200 天

    [LV.7]常住居民III

    1

    主题

    5444

    回帖

    8021

    积分

    二级逆天

    积分
    8021

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-11-25 08:51:56 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    833

    回帖

    1296

    积分

    二级逆天

    积分
    1296

    终身成就奖优秀斑竹奖

    发表于 2020-11-25 08:52:49 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2025-1-1 20:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    110

    主题

    2933

    回帖

    2710

    积分

    二级逆天

    积分
    2710

    终身成就奖社区居民优秀斑竹奖

    QQ
    发表于 2020-11-25 08:59:43 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    每日签到,有金币领取。


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表