⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iic_pcf8563.c

📁 MSP430F1611+LCD12864_st7920+Key刚完成调试.请有需要的朋下载!
💻 C
字号:
/********************************************************************
文件名:i2c.c/i2c.h
名称:MSP430 模拟IIC总线程序 
********************************************************************/
//#ifndef _I2C_H
//#define _I2C_H
//#include "msp430x14x.h"
#include "msp430x16x.h"

#define SDA_1       P3OUT|=BIT1               //SDA = 1
#define SDA_0       P3OUT&=~BIT1              //SDA = 0
#define SCL_1       P3OUT|=BIT3               //SCL = 1
#define SCL_0       P3OUT&=~BIT3              //SCL = 0
#define SDA_IN      P3DIR&=~BIT1             //I/O口为输入
#define SDA_OUT     P3DIR|=BIT1               //I/0口为输出
#define J_SDA_1_or_0   (P3IN & BIT1)==BIT1

//------------------------------------------
//Delay_PCF8563 函数程序//功能:延时子程序
//==========================================
static void Delay_PCF8563(unsigned int n)
{
while(n!=0)
{n--;}
}
//=========================================
//START 函数程序
//功能:开始闪存操作
//=========================================
void Start(void)
{
  SDA_OUT;
  SDA_1;
  Delay_PCF8563(6);
  SCL_1;
  Delay_PCF8563(6);
  SDA_0;
  Delay_PCF8563(6);
  SCL_0;
  Delay_PCF8563(6);
}

//=========================================
//STOP 函数程序
//功能:停止闪存操作
//==========================================
void Stop(void)
{
  SDA_OUT;
  SDA_0;
  Delay_PCF8563(6);
  SCL_1;
  Delay_PCF8563(6);
  SDA_1;
  Delay_PCF8563(6);
}



void TX_Byte(unsigned char WriteData)
{
  unsigned char i,j;
  j=WriteData;
  SDA_OUT;
  for (i=0; i<8; i++)
  {
    if ((j&0x80)==0)
    { SDA_0;}
    else
    { SDA_1;}
    j <<=1;
    Delay_PCF8563(6);
    SCL_1;
    Delay_PCF8563(6);
    SCL_0;
    Delay_PCF8563(6);
  }
}

unsigned char RX_Byte(void)
{
  unsigned char i;
  unsigned char TempData = 0;
  SDA_IN;
  for (i=0; i<8; i++)
  {
    Delay_PCF8563(6);
    SCL_1;
    Delay_PCF8563(6);
    TempData <<= 1;
    if (J_SDA_1_or_0)
    { TempData++; }
    SCL_0;
    Delay_PCF8563(6);
  }
  SDA_OUT;
  return(TempData);
}
//=========================================
//ACK 函数程序
//功能:挂高电平表示闪存时钟信号
//==========================================
void ReceiveAck(void)
{
  SDA_IN;
  SCL_1;
  Delay_PCF8563(10);
  while (J_SDA_1_or_0);
  
  SCL_0;
  SDA_OUT;
  Delay_PCF8563(10);
}
void SendAck(unsigned char ack)
{
  SDA_OUT;
  if(ack)  SDA_1;
  else SDA_0;
  Delay_PCF8563(6);
  SCL_1;
  Delay_PCF8563(6);
  SCL_0;
  Delay_PCF8563(6);  
  return;
}

/*
unsigned char ReadWord(unsigned long int unit)//uint=address
{
  unsigned char LowAdd  = 0;
  unsigned char HighAdd = 0;
  unsigned char  TempData = 0;
  LowAdd  = (unsigned char)unit;
  HighAdd = (unsigned char)(unit >> 8);
  SDA_OUT;
  Start();
  TX_Byte(0xa0);
  ReceiveAck();
  TX_Byte(HighAdd);
  ReceiveAck();
  TX_Byte(LowAdd);
  ReceiveAck();
  Start();
  TX_Byte(0xa1);
  ReceiveAck();
  TempData  = RX_Byte();  
  Stop();
  Delay_PCF8563(8000);  
  return(TempData);
}


void WriteWord(unsigned long int uint, unsigned char WriteData)//uint=address
{
  unsigned char LowAdd  = 0;
  unsigned char HighAdd = 0;
  LowAdd  = (unsigned char)unit;
  HighAdd = (unsigned char)(unit >> 8);
  Start();
  TX_Byte(0xa0);
  ReceiveAck();
  TX_Byte(HighAdd);
  ReceiveAck();
  TX_Byte(LowAdd);
  ReceiveAck();
  TX_Byte(WriteData);
  ReceiveAck();
  Stop();
  Delay_PCF8563(8000);
}

*/

void SendStr(unsigned char  sladdr,  unsigned char  subaddr,  unsigned char  *s, unsigned char  len) 
{
  unsigned char i;
  Start();          // 开始总线
  TX_Byte(sladdr);  // 发送地址
  ReceiveAck();
  TX_Byte(subaddr); //  发送子地址
  ReceiveAck();
  
  for(i=0; i<len; i++)
  {
    TX_Byte(*s);  // 发送数据
    ReceiveAck();
    s++; 
  }
 // s--;
  Stop();              //  结束总线
  return;  
}



void RecvStr(unsigned char sladdr, unsigned char subaddr ,unsigned char *s, unsigned char  len) 
{
  unsigned char i;
  Start();          //  申请总线
  TX_Byte(sladdr);  //  发送地址
  ReceiveAck();
  TX_Byte(subaddr); //   发送从机子地址 
  ReceiveAck();
  
  Start();          //  申请总线
  TX_Byte(sladdr+1);
  ReceiveAck();
  
  for(i=0; i<len-1; i++)
  {
    
    *s =RX_Byte();  //    取出数据
    SendAck(0);
    s++;
  }
  //s--;
  *s=RX_Byte();
  SendAck(1);        //   接收最后一字节数据并发送uack
  Stop();
  return; 
}

//#endif 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -