找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 622|回复: 0
打印 上一主题 下一主题
收起左侧

STC8单片机+TL6101触摸+pcf85176液晶显示程序

[复制链接]
跳转到指定楼层
楼主
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, 下载次数: 14)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表