找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM8模拟 IIC 触摸芯片按键值读取程序

[复制链接]
跳转到指定楼层
楼主
ID:389674 发表于 2018-9-4 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

单片机型号:STM8AF5286UC
SCL PB4
SDA PB5

/////////////////////////////触摸按键端口和引脚配置//////////////////////////////
#define  Touch_IIC_PORT   GPIOB  // 触摸按键引脚配置 SCL PB4;SDA PB5;INT PB3
#define  Touch_IIC_SDA    GPIO_PIN_5
#define  Touch_IIC_SCL    GPIO_PIN_4
#define  Touch_Key_Int    GPIO_PIN_3 //PB3 触摸按键INT输入

#define CON_ADDR 0x81 // {A[6:0] + RWB} = 81H

#define SDA_On   GPIO_WriteHigh(Touch_IIC_PORT,Touch_IIC_SDA)
#define SDA_Off  GPIO_WriteLow(Touch_IIC_PORT,Touch_IIC_SDA)

#define SCL_On   GPIO_WriteHigh(Touch_IIC_PORT,Touch_IIC_SCL)
#define SCL_Off   GPIO_WriteLow(Touch_IIC_PORT,Touch_IIC_SCL)


///////////////////////////////////////////////////////////////////////////////
unsigned int Touch_Data; //触摸按键的值

unsigned int ReadKey(void)
{
unsigned char bitnum,temp,addr;
unsigned int key2byte;
unsigned char bit_temp;
addr=CON_ADDR;
key2byte=0xffff;

SDA_Off; // 拉低 SDA 端口送出 START 信号
for(temp=0;temp<4;temp++){} //延时
//发送 8 位地址字节 (A[6:0]+RWB)
for(bitnum=0;bitnum<8;bitnum++)
{
SCL_Off;
temp=addr&0x80;
if(temp==0x80)
{SDA_On;}
else
{SDA_Off;}
addr=addr<<1;
for(temp=0;temp<40;temp++){} //延时
SCL_On;
for(temp=0;temp<40;temp++){} //延时
}
SDA_On; //释放 SDA 端口,将 SDA 设置为输入端口
SCL_Off;
GPIO_Init(Touch_IIC_PORT,Touch_IIC_SDA,GPIO_MODE_IN_PU_NO_IT  );//SDA输入
for(temp=0;temp<40;temp++){} //延时
SCL_On;
for(temp=0;temp<40;temp++){} //延时



bit_temp=GPIO_ReadInputPin(Touch_IIC_PORT,Touch_IIC_SDA) ;
//if(bit_temp==0x01) //读 ack 回应
//ERR=0; //ack 信号没有读到,指示通信有误
//读 16 位按键数据字节(D[15:0])
for(bitnum=0;bitnum<16;bitnum++)
{
SCL_Off;
for(temp=0;temp<40;temp++){} //延时
SCL_On;
for(temp=0;temp<40;temp++){} //延时
bit_temp=GPIO_ReadInputPin(Touch_IIC_PORT,Touch_IIC_SDA) ;
if(bit_temp==0x01)
{
key2byte=key2byte<<1;
key2byte=key2byte|0x01;
}
else
{
key2byte=key2byte<<1;
}
}
     GPIO_Init(Touch_IIC_PORT,Touch_IIC_SDA,GPIO_MODE_OUT_PP_HIGH_FAST );//SDA输出

SCL_Off;
SDA_On;
for(temp=0;temp<40;temp++){} //延时
SCL_On; //发送 NACK 信号
for(temp=0;temp<40;temp++){} //延时
SCL_Off;
SDA_Off;
for(temp=0;temp<40;temp++){} //延时
SCL_On;
for(temp=0;temp<40;temp++){} //延时
SDA_On;
key2byte=key2byte^0xffff;
return(key2byte);
}
void IO_config(void)
{


   GPIO_Init(Touch_IIC_PORT,Touch_Key_Int,GPIO_MODE_IN_PU_NO_IT );     //INT输入
   GPIO_Init(Touch_IIC_PORT,Touch_IIC_SCL,GPIO_MODE_OUT_PP_HIGH_FAST );//SCL输出
   GPIO_Init(Touch_IIC_PORT,Touch_IIC_SDA,GPIO_MODE_OUT_PP_HIGH_FAST );//SDA输出
   //GPIO_Init(Touch_IIC_PORT,Touch_IIC_SDA,GPIO_MODE_IN_PU_NO_IT  );//SDA输入


}
int main(void)
{


    /*设置内部高速时钟16M为主时钟*/

  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);



  IO_config();

     while(1)
     {
        if (GPIO_ReadInputPin(Touch_IIC_PORT,Touch_Key_Int) == 0)
      {
         Touch_Data=ReadKey();
         if(Touch_Data==0x0400)
         {BAR1_Y_ON();}
         else  if(Touch_Data==0x0800)
          {BAR2_Y_ON();}
         else  if(Touch_Data==0x1000)
          {BAR3_Y_ON();}
         else
         {;}
      }
      else
      {

       BAR1_Y_OFF();BAR2_Y_OFF();BAR3_Y_OFF();
      }
     }

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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