|

楼主 |
发表于 2019-12-2 10:53:31
|
显示全部楼层
- #include "gt911.h"
- #include "touch.h"
- #include "ctiic.h"
- #include "tftlcd.h"
- #include "usart.h"
- #include "delay.h"
- #include "string.h"
- /*
- * @Description:GT911配置参数表
- * @ 第一个字节为版本号(0X60),必须保证新的版本号大于等于GT911内部
- * @ flash原有版本号,才会更新配置.
- */
- const u8 GT911_CFG_TBL[]= //数组内容修改了
- {
- #if 1 /* 1024 * 600 */
- 0x96,0x00,0x04,0x58,0x02,0x05,0x0D,0x00,0x01,0x0A,
- 0x28,0x0F,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x08,0x17,0x19,0x1C,0x14,0x87,0x29,0x0A,
- 0x4E,0x50,0xEB,0x04,0x00,0x00,0x00,0x00,0x02,0x10,
- 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x46,0x64,0x94,0xC5,0x02,0x07,0x00,0x00,0x04,
- 0x9E,0x48,0x00,0x8D,0x4D,0x00,0x7F,0x53,0x00,0x73,
- 0x59,0x00,0x67,0x60,0x00,0x67,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,
- 0x12,0x14,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x1D,
- 0x1E,0x1F,0x20,0x21,0x22,0x24,0x26,0x28,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x17,0x01
- #else
- 0x68,0x00,0x04,0x58,0x02,0x05,0x3D,0x00,0x01,0x48, //0x68是自己定义的版本号
- 0x28,0x0D,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x18,0x1A,0x1E,0x14,0x8A,0x2A,0x0C,
- 0x30,0x38,0x31,0x0D,0x00,0x00,0x02,0xB9,0x03,0x2D,
- 0x00,0x00,0x00,0x00,0x00,0x03,0x64,0x32,0x00,0x00,
- 0x00,0x1D,0x41,0x94,0xC5,0x02,0x07,0x00,0x00,0x04,
- 0xA5,0x1F,0x00,0x94,0x25,0x00,0x88,0x2B,0x00,0x7D,
- 0x33,0x00,0x74,0x3C,0x00,0x74,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x18,0x16,0x14,0x12,0x10,0x0E,0x0C,0x0A,
- 0x08,0x06,0x04,0x02,0xFF,0xFF,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x24,0x22,0x21,0x20,0x1F,0x1E,0x1D,0x1C,
- 0x18,0x16,0x13,0x12,0x10,0x0F,0x0A,0x08,0x06,0x04,
- 0x02,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,
- #endif
- };
- /*
- * @Description: 发送GT911配置参数
- * @para:
- * @ mode:0,参数不保存到flash
- * @ mode:1,参数保存到flash
- * @return:
- */
- u8 GT911_Send_Cfg(u8 mode)
- {
- u8 buf[2];
- u8 i = 0;
- buf[0] = 0;
- buf[1] = mode; //是否写入到GT911 FLASH? 即是否掉电保存
- for(i = 0;i < sizeof(GT911_CFG_TBL);i++)
- {
- buf[0] += GT911_CFG_TBL[i]; //计算校验和
- }
- buf[0] = (~buf[0]) + 1;
-
- GT911_WR_Reg(GT_CFGS_REG,(u8*)GT911_CFG_TBL,sizeof(GT911_CFG_TBL)); //发送寄存器配置
- GT911_WR_Reg(GT_CHECK_REG,buf,2); //写入校验和,和配置更新标记
- return 0;
- }
- /*
- * @Description: 向GT911写入一次数据
- * @para:
- * @ reg:起始寄存器地址
- * @ buf:数据缓缓存区
- * @ len:写数据长度
- * @return:
- */
- u8 GT911_WR_Reg(u16 reg,u8 *buf,u8 len)
- {
- u8 i;
- u8 ret = 0;
- CT_IIC_Start();
- CT_IIC_Send_Byte(GT911_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;
- }
- /*
- * @Description:向GT911读出一次数据
- * @para:
- * @ reg:起始寄存器地址
- * @ buf:数据缓缓存区
- * @ len:写数据长度
- * @return:
- */
- void GT911_RD_Reg(u16 reg,u8 *buf,u8 len)
- {
- u8 i;
- CT_IIC_Start();
- CT_IIC_Send_Byte(GT911_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(GT911_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(); //产生一个停止条件
- }
- /*
- * @Description:初始化GT911触摸屏
- * @para:
- * @return:0,初始化成功;1,初始化失败
- */
- u8 GT911_Init(void)
- {
- u8 temp[2];
- GPIO_InitTypeDef GPIO_Initure;
-
- __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
- __HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟
-
- //PH7 --> CT_INT
- GPIO_Initure.Pin = GPIO_PIN_7; //PH7
- GPIO_Initure.Mode = GPIO_MODE_INPUT; //输入
- GPIO_Initure.Pull = GPIO_PULLUP; //上拉
- GPIO_Initure.Speed = GPIO_SPEED_HIGH; //高速
- HAL_GPIO_Init(GPIOH, &GPIO_Initure); //初始化
-
- //PA4 --> CT_RST
- GPIO_Initure.Pin = GPIO_PIN_4; //PA4
- GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
- HAL_GPIO_Init(GPIOA, &GPIO_Initure); //初始化
-
- CT_IIC_Init(); //初始化电容屏的I2C总线
- GT911_RST = 0; //复位
- delay_ms(20);
- GT911_RST = 1; //释放复位
- delay_ms(50);
- temp[0] = 0;
- GT911_RD_Reg(GT911_PID_REG,temp,4); //读取ID
- #ifdef DEBUG_MODE
- printf("%s\r\n", temp); //打印GT911的芯片ID
- #endif
- if(strcmp((char *)temp, "911") == 0) //ID: GT911
- {
- temp[0] = 0X02;
- GT911_WR_Reg(GT911_CTRL_REG, temp, 1); //软复位GT9147
- GT911_RD_Reg(GT911_CFGS_REG, temp, 1); //读取GT_CFGS_REG寄存器
-
- #ifdef DEBUG_MODE
- printf("GT911 config list version:%x\r\n", temp[0]);
- #endif
-
- if(temp[0] < 0X68) //默认版本比较低,需要更新flash配置
- {
- #ifdef DEBUG_MODE
- printf("Default Ver:%x\r\n", temp[0]);
- #endif
- GT911_Send_Cfg(1); //更新并保存配置 //先屏蔽//
- delay_ms(10);
- temp[0] = 0X00;
- GT911_WR_Reg(GT911_CTRL_REG, temp, 1);//结束复位
- return 0;
- }
-
- return 1;
- }
- }
- /*
- * @Description:扫描触摸屏(采用查询方式)
- * @para:
- * @ mode:0,正常扫描.
- * @return:
- * @ 0: 触屏无触摸;
- * @ 1: 触屏有触摸
- */
- const u16 GT911_TPX_TBL[5]={GT911_TP1_REG,
- GT911_TP2_REG,
- GT911_TP3_REG,
- GT911_TP4_REG,
- GT911_TP5_REG};
- u8 GT911_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使用率
- {
- GT911_RD_Reg(GT911_GSTID_REG, &mode, 1); //读取触摸点的状态
-
- if(mode&0X80&&((mode&0XF)<6))
- {
- temp=0;
- GT911_WR_Reg(GT_GSTID_REG,&temp,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)) //触摸有效?
- {
- GT911_RD_Reg(GT911_TPX_TBL[i],buf,4); //读取XY坐标值
- if(tp_dev.touchtype&0X01)
- {
- tp_dev.x[i]=(((u16)(buf[1]&0X0F)<<8)+buf[0]); //lcddev.width-
- tp_dev.y[i]=((u16)(buf[3]&0X0F)<<8)+buf[2];
- }
- else
- {
- tp_dev.y[i]=((u16)(buf[1]&0X0F)<<8)+buf[0];
- tp_dev.x[i]=((u16)(buf[3]&0X0F)<<8)+buf[2];
- }
- printf("touch\n");
- }
- }
- res=1;
- if(tp_dev.x[0]>lcddev.width||tp_dev.y[0]>lcddev.height) //非法数据(坐标超出了)
- {
- if((mode&0XF)>1) //有其他点有数据,则复第二个触点的数据到第一个触点.
- {
- tp_dev.x[0]=tp_dev.x[1];
- tp_dev.y[0]=tp_dev.y[1];
- t=0; //触发一次,则会最少连续监测10次,从而提高命中率
- }
- else //非法数据,则忽略此次数据(还原原来的)
- {
- tp_dev.x[0]=tp_dev.x[4];
- tp_dev.y[0]=tp_dev.y[4];
- mode=0X80;
- tp_dev.sta = temp; //恢复tp_dev.sta
- }
- }
- else
- {
- t=0; //触发一次,则会最少连续监测10次,从而提高命中率
- }
- }
- }
-
- 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开始计数
- //printf("运行到SCAN\r\n");
- }
- return res;
- }
复制代码
问题:printf("touch\n");当触摸了打印按键之后,按理来说只有触摸打印按钮的过程中才会被执行,但是当我松开按键之后,这行也会不定期的打印,大神给点知道意见呗,谢谢
|
|