LT6101 触摸面板
#include <STC8.h>
#include <DEFINE.h>
#include <intrins.h>
#include <stdio.h>
#include <delay.h>
#include <uart.h>
#include <PCF85176.h>
#include <LT6101A.h>
//================================================================
/********************************************************
功能描述 :PCF85176 (85176+TP) 芯片测试程序
设 计 人:ZQS
版 本 :1.0
说 明 :触摸测试及显示
完成时间 :2023.06.20
********************************************************/
sbit KEY = P5^0; // 按键数据输入口
#define SET_KEY_IN P5n_pure_input(1<<0) //输入口
#define RSTFLAG (*(unsigned char volatile xdata *)0xfE99)
#define LIMIT 55
xdata s16 keyTime[24];//= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ;
u8 LT_INDEX,LT_FIVE_OK;
xdata u16 LT_New_VAL[5][25];
xdata s16 LT_OLD_VAL[25] ;//= {0} ; // 触摸按键24个点
idata s16 LT_OVER_VAL[25] ;
idata s16 LT_NNEW_VAL[25] ;
xdata u8 buf[60];
/******************** 主函数 **************************/
void main(void)
{
u16 i,dd;
u16 maxIndex,maxVal;
delay(200);
//SET_KEY_IN;
RSTCFG=0X50; //开启硬件复位
Init_Uart();
INIT_LT6101(); // 初始化后是从机模式
delay(200);
LCD_TEST();
Get_LT6101_BaseVal(LT_OLD_VAL); // 每次上电时读到5组各通道数据平均值保存在LT_OLD_VAL[]
sprintf(buf, "run ************ \r\n");
buftx(buf);
LT_INDEX = 0;
LT_FIVE_OK = 0;
for(i=0;i<TL_CHANNEL_NUM;i++) keyTime[ i]=0;
while(1)
{
//RESET();
if(LT_FIVE_OK == 0) // 连续读5组各通道数据,保存到LT_New_Val[5][10]内
{
for(i=0;i<5;i++)
{
Get_LT6101_Val(LT_INDEX);
LT_INDEX++;
delay(20);
}
LT_FIVE_OK = 1;
}
else
{
if(LT_INDEX>=5) LT_INDEX = 0 ; //新的数据替换最早一次采集的数据
Get_LT6101_Val(LT_INDEX);
LT_INDEX++;
for(i=0;i<TL_CHANNEL_NUM;i++)
{
//5次数据的平均值
LT_NNEW_VAL[ i]=(LT_New_VAL[0][ i]+LT_New_VAL[1][ i]+LT_New_VAL[2][ i]+LT_New_VAL[3][ i]+LT_New_VAL[4][ i])/5;
//跟基准数据的差值
if (LT_NNEW_VAL[ i] < LT_OLD_VAL[ i])
LT_OVER_VAL[ i] =0;
else LT_OVER_VAL[ i]= (LT_NNEW_VAL[ i] - LT_OLD_VAL[ i]);
keyTime[ i] = 0 ;
}
//
////////////////////////////////////////////////////////////
maxIndex = 0;
maxVal = LT_OVER_VAL[0];
for(i=1;i<TL_CHANNEL_NUM;i++)//计算所有按键中,差值最大的值
{
if(maxVal<LT_OVER_VAL[ i])
{
maxIndex = i;
maxVal = LT_OVER_VAL[ i];
}
}
// sprintf(buf, "1111111111111111 \r\n");
// buftx(buf);
if(maxIndex==0)//差值最大的是第0通道按键
{
if(LT_OVER_VAL[0]>(LT_OVER_VAL[1]+LIMIT))
keyTime[0]=1;
else
keyTime[0]=0;
}
else if(maxIndex==(TL_CHANNEL_NUM-1))//差值最大的是最后通道按键
{
if(LT_OVER_VAL[TL_CHANNEL_NUM-1]>(LT_OVER_VAL[TL_CHANNEL_NUM-2]+LIMIT))
keyTime[TL_CHANNEL_NUM-1] = 1;
else
keyTime[TL_CHANNEL_NUM-1] = 0;
}
else
{ //最大差值的通道,同时就算其左右2边按键的差值,防止干扰导致的数据
if(LT_OVER_VAL[maxIndex]>((LT_OVER_VAL[maxIndex-1]+LT_OVER_VAL[maxIndex+1])/2+LIMIT))
keyTime[maxIndex] = 1;
else
keyTime[maxIndex] = 0;
}
for(dd=0;dd<TL_CHANNEL_NUM;dd++) // 按键序号确认
{
if(keyTime[dd]) // 有触摸则在LCD显示序号
{
dis_num(17 ,dd+1);
delay(100);
}
else // 无触摸,清空显示
{
delay(100);
}
}
}
}
}
原理图: 无
仿真: 无
代码:
STC8G2K16_LT6106+PCF85176.7z
(1.48 MB, 下载次数: 17)
|