MSP430F149驅(qū)動BH1750FVI程序
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總線中的從地址,根據(jù)ALT ADDRESS地址引腳不同修改
//ALT ADDRESS引腳接地時地址為0xA6,接電源時地址為0x3A
unsigned char ge,shi,bai,qian,wan;//顯示變量
int dis_data;
uchar BUF[8];
/******************************************************************************/
/*******************************延時函數(shù)***************************************/
/******************************************************************************/
/*******************************************
延時約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相關(guān)函數(shù)*********************************/
/******************************************************************************/
/**************************************
起始信號
**************************************/
void BH1750_Start()
{
SDA_H; //拉高數(shù)據(jù)線
SCL_H; //拉高時鐘線
Delay5us(); //延時
SDA_L; //產(chǎn)生下降沿
Delay5us(); //延時
SCL_L; //拉低時鐘線
}
/**************************************
停止信號
**************************************/
void BH1750_Stop()
{
SDA_L; //拉低數(shù)據(jù)線
SCL_H; //拉高時鐘線
Delay5us(); //延時
SDA_H; //產(chǎn)生上升沿
Delay5us(); //延時
}
/**************************************
發(fā)送應(yīng)答信號
入口參數(shù):ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(void)
{
SDA_L; //寫應(yīng)答信號
_NOP();_NOP();
SCL_H; //拉高時鐘線
Delay5us(); //延時
SCL_L; //拉低時鐘線
_NOP();_NOP();
SDA_H;
Delay5us(); //延時
}
/********************************************
非應(yīng)答
********************************************/
void mnack(void)
{
SDA_H;
_NOP(); _NOP();
SCL_H;
Delay5us();
SCL_L;
_NOP(); _NOP();
SDA_L;
Delay5us();
}
/**************************************
接收應(yīng)答信號
**************************************/
uchar BH1750_RecvACK()
{
uchar ack;
SDA_H;
_NOP(); _NOP();
SCL_H;
_NOP(); _NOP();
SDA_IN;
_NOP(); _NOP();
ack = SDA_VAL; //讀入SDA數(shù)值
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總線發(fā)送一個字節(jié)數(shù)據(jù)
**************************************/
void BH1750_SendByte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{ //8位計數(shù)器
if(dat&0x80)
write1();
else
write0();
dat <<= 1; //移出數(shù)據(jù)的最高位
}
BH1750_RecvACK();
}
/**************************************
從IIC總線接收一個字節(jié)數(shù)據(jù)
**************************************/
unsigned char BH1750_RecvByte()
{
unsigned char i;
unsigned char dat = 0,flag;
SDA_H; //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
for (i = 0; i < 8; i++)
{ //8位計數(shù)器
//SDA_H;
//Delay5us();
SCL_H;
SDA_IN;
Delay5us();
flag=SDA_VAL;
dat <<= 1;
if(flag)
dat|=0x01;
SDA_OUT;
SCL_L;
Delay5us();
}
return dat;
}
評論