#include “io430.h”
typedef unsigned int uint;
typedef unsigned char uchar;
/****BH1750 IO界说******/
#define SCL_H P3OUT |= BIT6//此IO在硬件上需求更改
#define SCL_L P3OUT &= ~BIT6
#define SDA_H P3OUT |= BIT7
#define SDA_L P3OUT &= ~BIT7
#define SDA_IN P3DIR &= ~BIT7 //SDA改成输入形式
#define SDA_OUT P3DIR |= BIT7 //SDA变回输出形式
#define SDA_VAL P3IN&BIT7 //SDA的位值
/*********LCD1602 IO define************/
#define DataDir P4DIR
#define DataPort P4OUT
#define Busy 0x80
#define CtrlDir P5DIR
#define CLR_RS P5OUT&=~BIT0 //RS = P5.0
#define SET_RS P5OUT|=BIT0
#define CLR_RW P5OUT&=~BIT1//RW = P5.1
#define SET_RW P5OUT|=BIT1
#define CLR_EN P5OUT&=~BIT2//EN = P5.2
#define SET_EN P5OUT|=BIT2
#define _NOP() __no_operation()
#defineSlaveAddress0x46//界说器材在IIC总线中的从地址,依据ALT ADDRESS地址引脚不同修正
//ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
unsigned char ge,shi,bai,qian,wan;//显现变量
int dis_data;
uchar BUF[8];
/******************************************************************************/
/*******************************延时函数***************************************/
/******************************************************************************/
/*******************************************
延时约15us的时刻
********************************************/
void Delay5us(void)
{
uchar i;
for(i = 0;i < 15;i++);
_NOP();
}
void Delay5ms(void)
{
uint i=40000;
while (i != 0)
{
i–;
}
}
/*******************************************
延时MS的时刻
********************************************/
void delay(uint x)
{
uchar i;
while(x–)for(i=0;i<125;i++);
}
/******************************************************************************/
/*******************************BH1750相关函数*********************************/
/******************************************************************************/
/**************************************
起始信号
**************************************/
void BH1750_Start()
{
SDA_H; //拉高数据线
SCL_H; //拉高时钟线
Delay5us(); //延时
SDA_L; //发生下降沿
Delay5us(); //延时
SCL_L; //拉低时钟线
}
/**************************************
中止信号
**************************************/
void BH1750_Stop()
{
SDA_L; //拉低数据线
SCL_H; //拉高时钟线
Delay5us(); //延时
SDA_H; //发生上升沿
Delay5us(); //延时
}
/**************************************
发送应对信号
进口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(void)
{
SDA_L; //写应对信号
_NOP();_NOP();
SCL_H; //拉高时钟线
Delay5us(); //延时
SCL_L; //拉低时钟线
_NOP();_NOP();
SDA_H;
Delay5us(); //延时
}
/********************************************
非应对
********************************************/
void mnack(void)
{
SDA_H;
_NOP(); _NOP();
SCL_H;
Delay5us();
SCL_L;
_NOP(); _NOP();
SDA_L;
Delay5us();
}
/**************************************
接纳应对信号
**************************************/
uchar BH1750_RecvACK()
{
uchar ack;
SDA_H;
_NOP(); _NOP();
SCL_H;
_NOP(); _NOP();
SDA_IN;
_NOP(); _NOP();
ack = SDA_VAL; //读入SDA数值
SCL_L;
Delay5us();
SDA_OUT;
if(ack) return 0;
else return 1;
}
/*******************************************
write1
********************************************/
void write1(void)
{
SDA_H;
//Delay5us();
SCL_H;
Delay5us();
SCL_L;
Delay5us();
}
/*******************************************
write0
********************************************/
void write0(void)
{
SDA_L;
// Delay5us();
SCL_H;
Delay5us();
SCL_L;
Delay5us();
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{ //8位计数器
if(dat&0x80)
write1();
else
write0();
dat <<= 1; //移出数据的最高位
}
BH1750_RecvACK();
}
/**************************************
从IIC总线接纳一个字节数据
**************************************/
unsigned char BH1750_RecvByte()
{
unsigned char i;
unsigned char dat = 0,flag;
SDA_H; //使能内部上拉,预备读取数据,
for (i = 0; i < 8; i++)
{ //8位计数器
//SDA_H;
//Delay5us();
SCL_H;
SDA_IN;
Delay5us();
flag=SDA_VAL;
dat <<= 1;
if(flag)
dat|=0x01;
SDA_OUT;
SCL_L;
Delay5us();
}
return dat;
}