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

📄 liquid.c

📁 用MSP430(C)写的红外抄表程序,是初学者好代码
💻 C
字号:
/******************************************************************************/
//功能:完成掖晶显示
/******************************************************************************/

#include <msp430x14x.h>
#define  uchar  unsigned char

#define  SLV_ADR  70          //从机地址
#define  SUB_ADR  80          //从机单元地址
#define  MODE_CLEAR  0xD0       //清屏指令
#define  MODE_Display  58     //显示控制字  
#define  MODE_Flash  0x70     //闪烁控制字


unsigned char display[20];

#define SDA_1       P5OUT |=  BIT0              //SDA = 1
#define SDA_0       P5OUT &=~ BIT0              //SDA = 0
#define SCL_1       P4OUT |=  BIT7              //SCL = 1
#define SCL_0       P4OUT &=~ BIT7              //SCL = 0
#define DIR_IN      P5DIR &=~ BIT0;  SDA_1      //I/O口为输入
#define DIR_OUT     P5DIR |=  BIT0              //I/0口为输出
#define SDA_IN      ((P5IN >> 3) & 0x01)        //Read SDA

unsigned int a[50];

/********************************************************************
*
* 名称: Delay
* 说明:
* 功能: 根据入口参数延长时间
* 调用:无
* 输入: n 写入的数据
* 返回值: 无
***********************************************************************/
static void Delay(unsigned int n)
{
   unsigned int i;
 
   for (i=0; i<n; i++) {;}
}

/**********************************************************************
*
* 名称: Init
* 说明:
* 功能: 设置I2C通讯初始状态
* 调用: Delay();
* 输入: 无
* 返回值: 无
***********************************************************************/
void Init(void)
{
  SCL_1;
  Delay(5);
  SDA_1;
  Delay(5);
}
/**********************************************************************
*
* 名称: Start
* 说明:
* 功能: 启动I2C通讯
* 调用: Delay();
* 输入: 无
* 返回值: 无
***********************************************************************/
void Start(void)
{
  SDA_1;
  Delay(5);
  SCL_1;
  Delay(5);
  SDA_0;
  Delay(5);
  SCL_0;
  Delay(5);
}

/**********************************************************************
*
* 名称: Stop
* 说明:
* 功能: 停止I2C通讯
* 调用: Delay();
* 输入: 无
* 返回值: 无
***********************************************************************/
void Stop(void)
{
  SDA_0;
  Delay(5);
  SCL_1;
  Delay(5);
  SDA_1;
  Delay(5);
}

/**********************************************************************
*
* 名称: WriteByte
* 说明:
* 功能: 写入一个字节的数据
* 调用: Delay();
* 输入: WriteData
* 返回值: 无
***********************************************************************/
void WriteByte(unsigned char WriteData)
{
  unsigned char i;
  for (i=0; i<8; i++)
  {
    SCL_0;
    Delay(5);
    if (((WriteData >> 7) & 0x01) == 0x01)
    {
      SDA_1;
    }
    else
    {
      SDA_0;
    }
    Delay(5);
    SCL_1;
    WriteData = WriteData << 1;
    Delay(5);
  }
  SCL_0;
  SDA_1;
  Delay(5);
  Delay(5);
}

/**********************************************************************
*
* 名称: ReadByte
* 说明:
* 功能: 读取一个字节的数据
* 调用: Delay();
* 输入: ReadByte
* 返回值: 返回一个unsigned char数据
***********************************************************************/
unsigned char ReadByte(void)
{
  unsigned char i;
  unsigned char TempBit  = 0;
  unsigned char TempData = 0;
  SCL_0;
  Delay(5);
  SDA_1;
  for (i=0; i<8; i++)
  {
    Delay(5);
    SCL_1;
    Delay(5);
    DIR_IN;
    if (SDA_IN == 0x01 /*sda==1*/)
    {
      TempBit = 1;
    }
    else
    {
      TempBit = 0;
    }
    DIR_OUT;
    TempData = (TempData << 1) | TempBit;
    SCL_0;
  }
  Delay(5);
  return(TempData);
}


/**********************************************************************
*
* 名称: ReadByte
* 说明:
* 功能: 读取一个字节的数据
* 调用: Delay();
* 输入: ReadByte
* 返回值: 返回一个unsigned char数据
***********************************************************************/
void ReceiveAck(void)
{
  unsigned char i = 0;
  SCL_1;
  Delay(5);
  DIR_IN;
  while ((SDA_IN == 0x01 /*sda==1*/) && (i < 255)/*调试方便,可以不要*/)
  {
    i++;
  }
  DIR_OUT;
  SCL_0;
  Delay(5);
  //while(1);
}


/**********************************************************************
*
* 名称: ReadByte
* 说明:
* 功能: 读取一个字节的数据
* 调用: Delay();
* 输入: ReadByte
* 返回值: 返回一个unsigned char数据
***********************************************************************/
void Acknowledge(void)
{
  SCL_0;
  Delay(5);
  DIR_OUT;
  SDA_0;
  SCL_1;
  Delay(5);
  SCL_0;
}
/*
void Display_Data(void)
   {
    uchar i=0;
    uchar size=ByteCnt;

    START(); //发送I2C 总线起始条件

    SendByte(SlvAdr); //发送被控器总线地址

    SendByte(SubAdr); //发送单元地址

      // SendByte(0x73); //闪烁方式为正常,闪烁频率为0.5Hz 的命令字送缓冲区首址,
      //如果不需要闪烁应将数#70H 送入缓冲区首址
    SendByte(0x70); //不闪烁


    do
     {
       SendByte(XmtDat[i]); //发送数据
       i++;
      } while(--size!=0);
        
      STOP();

      delay(100); 
      }

 void ClearLcd(void)
    {
      uchar size=ByteCnt;

      START(); //启动I2C 总线

      SendByte(SlvAdr); //送器件地址

      SendByte(SubAdr); //发送单元地址

      SendByte(0x70);

      do
      {
        SendByte(0x00); //发送数据
      } while(--size!=0);

      STOP();

      delay(200);
      }

  void PCF8576SET(void)
    {
      START();

      SendByte(SlvAdr); //送器件地址

      SendByte(MODE2); //取方式命令字

      SendByte(Bank_sel);

      STOP();
     }
*/
/******************************************************************************/
//液晶显示驱动程序
/******************************************************************************/
//void liquid_main(unsigned char *DataBuff)
void main(void)
{
  unsigned char i,display;
  WDTCTL = WDTPW +WDTHOLD;                  // Stop Watchdog Timer
  DCOCTL = DCO0 + DCO1 + DCO2;              // Max DCO
  P5DIR =  0xff;
  P4DIR =  0xff;
  Start();
 WriteByte(SLV_ADR);
 ReceiveAck();
 WriteByte(SUB_ADR);
 ReceiveAck();
 /*
 //WriteByte(MODE_CLEAR);
 WriteByte(MODE_Display);
 ReceiveAck();
 WriteByte(MODE_Flash);
 ReceiveAck();
 */
 for(i=0;i<20;i++)
  {
   //display = *DataBuff;
   WriteByte(0xff);
   ReceiveAck();
   WriteByte(0xff);
   ReceiveAck();
   //DataBuff++;
  }
 Stop();
 while(1);
}

⌨️ 快捷键说明

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