首页 > 代码库 > 触摸按键--模拟I2C驱动TS12芯片

触摸按键--模拟I2C驱动TS12芯片

TS12芯片驱动

使用模拟I2C驱动TS12完成触摸按键检测功能:

#include "stm8s.h"
#include "global.h"
#include "drv_key.h"

uint8_t KeyByte;


/*******************************************************************************
//  Function:     I2C_Int
//  Description: 模拟I2C 与ds1307端口初始化
//  Param:        
//  Return:       
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static void I2C_Int(void)
{
   IIC_SDA_OUTPUT;  
   IIC_SCL_OUTPUT;
}

/*******************************************************************************
//  Function:     Delay_5us
//  Description:  微妙级延时函数   延时时间约为16us
//  Param:        
//  Return:       fcpu 16MHz 时
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static void Delay_5us(void)
{
   uint8_t i;                 
   for (i=5; i>0; i--);
}

/*******************************************************************************
//  Function:     I2C_Start
//  Description:  I2C 开始传输信号  当SCL 为高时  SDA由高变低
//  Param:        
//  Return:      
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static void I2C_Start(void)
{
    // SDA 1->0 while SCL High
    SDA_HIGH;                   
    SCL_HIGH;                    
    Delay_5us(); 
    
    SDA_LOW;                   
    Delay_5us(); 
    
    SCL_LOW;                    
}

/*******************************************************************************
//  Function:     I2C_Stop
//  Description:  I2C 停止传输信号  当SCL 为高时  SDA由低变高
//  Param:        
//  Return:      
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static void I2C_Stop(void)
{
    // SDA 0->1 while SCL High
    SDA_LOW;                   
    SCL_HIGH;                   
    Delay_5us();     
    
    SDA_HIGH;                   
    Delay_5us();               
}

/*******************************************************************************
//  Function:     I2C_SendACK
//  Description:  主机向从机发送应答信号
//  Param:   应答信号 1:表示SDA高电平(无应答) 0:SDA低电平(有应答)
//  Return:      
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static void I2C_SendACK(uint8_t ack)
{
    if(ack == 0)
    {
      SDA_LOW; 
    }  
    else
    {
      SDA_HIGH; 
    }
            
    SCL_HIGH;                   
    Delay_5us();  
    
    SCL_LOW;                    
    Delay_5us();     
}

/*******************************************************************************
//  Function:     I2C_SendByte
//  Description:  模拟I2C通信 发送8位数据
//  Param:        发送的8为数据值
//  Return:       返回应答信号  0表示有应答  1表示无应答
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static uint8_t I2C_SendByte(uint8_t SendByte)
{
  static uint8_t i,RevAckTS;
  
  SDA_LOW;
  for (i= 0 ; i< 8; i++)         
  {
    SCL_LOW;    
    
    if (SendByte & 0x80)             // write data
    {
      SDA_HIGH;
    }
    else   
    {
      SDA_LOW;
    }
    
    Delay_5us();
    SendByte <<=  1;
    SCL_HIGH;                
    Delay_5us();     
  } 
  
  SCL_LOW;   
  SDA_HIGH;
  Delay_5us();  
  
  IIC_SDA_INPUT;
  
  SCL_HIGH;    
  asm("nop");
  asm("nop");  
  
  RevAckTS = (uint8_t)READ_SDA;
  
  Delay_5us();   
  SCL_LOW;   
  
  IIC_SDA_OUTPUT;
  Delay_5us();  
  
  return RevAckTS;
}

/*******************************************************************************
//  Function:     I2C_RecvByte
//  Description:  模拟I2C通信 从从机读取8位数据
//  Param:        
//  Return:       返回读取的8为数据值
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static uint8_t I2C_RecvByte()
{
    uint8_t i;
    uint8_t RecvData = 0;
    
    SDA_HIGH;     // latch the Data port befor reading
    
    IIC_SDA_INPUT;
    
    for (i=0; i<8; i++)         
    { 
       RecvData <<= 1;
        
       SCL_HIGH; 
       
       asm("nop");
       asm("nop");
       
       if (READ_SDA)
       {
          RecvData |= 0x01;
       }
       else
       {
          RecvData &= 0xfe;
       }

       Delay_5us(); 
       SCL_LOW;                
       Delay_5us();  
    }
    
   IIC_SDA_OUTPUT;
   
   return RecvData;
}

/*******************************************************************************
//  Function:     Ts12_WriteByte
//  Description:  模拟I2C通信 写入1字节数据到指定地址
//  Param:        WriteAddr:待写入数据  WriteData;写入的地址
//  Return:       1: 成功写入  0: 写入出错
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
uint8_t Ts12_WriteByte(uint8_t WriteAddr,uint8_t WriteData)
{
   I2C_Start();      
   
   if(I2C_SendByte(0xF0))    // Device Addr + Write (operation) 
   {
      return 0; 
   }
   
   if(I2C_SendByte(WriteAddr))
   {
      return 0;
   }
   
   if(I2C_SendByte(WriteData))
   {
      return 0; 
   }
   
   I2C_Stop();   
   
   return 1;
}

/*******************************************************************************
//  Function:     Ts12_ReadByte
//  Description:  模拟I2C通信 从指定地址读取1字节数据
//  Param:        ReadAddr:读取的地址
//  Return:       RevData:读取的8位数据
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
uint8_t Ts12_ReadByte(uint8_t ReadAddr)
{
  uint8_t RevData;
  
  I2C_Start();            
  I2C_SendByte(0xF0);     // Device Addr + Write (operation)   
  I2C_SendByte(ReadAddr); 
 
  I2C_Start();    
  I2C_SendByte(0xF1);     // Device Addr + Read (operation)   
  
  RevData = I2C_RecvByte();    
  
  I2C_SendACK(1);

  I2C_Stop();   
  
  return RevData;
}

void  TS12_InitAgain()
{
   I2C_Start(); 
   I2C_SendByte(0xf0);    
   I2C_SendByte(0x02); 
   I2C_SendByte(0xAA);    //Sensitivity1
   I2C_SendByte(0xAA); 
   I2C_SendByte(0xAA); 
   I2C_SendByte(0xAA); 
   I2C_SendByte(0xAA); 
   I2C_SendByte(0xAA); 
   I2C_SendByte(0x33);    //CTRL1 
   I2C_Stop();
   
   I2C_Start();  
   I2C_SendByte(0xF0);    
   I2C_SendByte(0x0A); 
   I2C_SendByte(0x00);    //Ref_rst1
   I2C_SendByte(0x00);    //Ref_rst2
   I2C_SendByte(0x00);    //Ch_hold1
   I2C_SendByte(0x00);    //Ch_hold2
   I2C_SendByte(0x00);    //Cal_hold1
   I2C_SendByte(0x00);    //Cal_hold2
   I2C_Stop();  
}

/*******************************************************************************
//  Function:     Ts12_Init
//  Description:  模拟I2C通信 写入8字节数据 从0x02~0x0f
//  Param:        pWriteData: 指针指向待写入的数组的地址
//  Return:      
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
void Ts12_Init()
{
   I2C_Int();
   
   I2C_Start();            
   I2C_SendByte(0xF0);     // Device Addr + Write (operation) 
   I2C_SendByte(0x09); 
   I2C_SendByte(0x0F); 
   I2C_Stop();    
   
   TS12_InitAgain();  
   
   I2C_Start();            
   I2C_SendByte(0xF0);     // Device Addr + Write (operation) 
   I2C_SendByte(0x09); 
   I2C_SendByte(0x07); 
   I2C_Stop();    
}


/*******************************************************************************
//  Function:     Ts12_ReadKey
//  Description:  模拟I2C通信 读取8字节数据 从0x10~0x12
//  Param:        pReadData: 指针指向保存数据的数组
//  Return:      
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
void Ts12_ReadKey()
{
  static uint8_t KeyValue1;
  static uint8_t KeyValue2;
  static uint8_t KeyValue3;
  
  I2C_Start();            
  I2C_SendByte(0xF0);     // Device Addr + Write (operation)   
  I2C_SendByte(0x10); 
//  I2C_Stop();   //此步骤需要确认  -》可加可不加

  I2C_Start();    
  I2C_SendByte(0xF1);     // Device Addr + Read (operation)   
  

  KeyValue1 = I2C_RecvByte();
  I2C_SendACK(0);    //DIO低电平 表示ACK 
  
  KeyByte = KEY_EVENT_NULL_CLICK;     //每次都清楚按键
  
  if(((KeyValue1 >> 6) & 0x03 ) >= KeyStandard)   //i-Sense 
  {
     KeyByte += KEY_EVENT_SMART_CLICK;
  }
  
  if(((KeyValue1 >> 4) & 0x03) >= KeyStandard)     //Crisper
  {
     KeyByte += KEY_EVENT_CRISPER_CLICK;
  }
  
  if(((KeyValue1 >> 2) & 0x03) >= KeyStandard)    //MODE
  {
     KeyByte += KEY_EVENT_MODE_CLICK;
  }
  
  if((KeyValue1) & 0x03 >= KeyStandard)           //DOWN
  {
     KeyByte += KEY_EVENT_DOWN_CLICK;
  }
  
  KeyValue2 = I2C_RecvByte();
  I2C_SendACK(0);    //DIO低电平 表示ACK 
  
  if(((KeyValue2 >> 6) & 0x03) >= KeyStandard)    //Auto Defrost
  {
     KeyByte += KEY_EVENT_AD_CLICK;
  }
  
  if(((KeyValue2 >> 4) & 0x03) >= KeyStandard)    //UP
  {
     KeyByte += KEY_EVENT_ICE_CLICK;
  }
  
  if(((KeyValue2 >> 2) & 0x03) >= KeyStandard)    //Fast ICE
  {
     KeyByte += KEY_EVENT_UP_CLICK;
  }
  
  if((KeyValue2 & 0x03) >= KeyStandard)           //Energy Saving
  { 
     KeyByte += KEY_EVENT_SAVE_CLICK;
  }
  
  KeyValue3 = I2C_RecvByte();
  I2C_SendACK(1);
 
  if((KeyValue3 & 0x03) >= KeyStandard)          //Manual Defrost  
  {
     KeyByte += KEY_EVENT_MD_CLICK;
  }

  I2C_Stop();   
}