BH1750FVI模块,单片机是用ATMEGA128,数据能显示,但不刷新?

2019-07-15 16:58发布

BH1750FVI模块,单片机用的是ATMEGA128,数据能显示,但不刷新,请高手们帮忙分析一下,谢谢!
程序:


/*****************************************
* BH1750FVI驱动程序                              *
* 功    能:IIC读取光强数据并显示        *
* 时钟频率:11.0592M                                      *
* 设    计:                                               *
* 修改日期:2014年3月20日                                 *
* 编译环境:ICC-AVR7.14                                         *
* 实验环境:ATmega128+12864                             *
*****************************************/
#include <iom128v.h>
#include <macros.h>
#include "config.h"

#define   SLA_W   0x46                      //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
#define   SLA_R   0x47                      //ALT  ADDRESS引脚接地时地址为0100011,接电源时地址为1011100

#define   BH1750_On     0x01                  //定义1750指令:通电,等待测量指令
#define   BH1750_Reset  0x07                  //定义1750指令:重置寄存器
#define   BH1750_Config 0x10                  //定义1750工作模式:一次H分辨率模式,读取时间120ms

#define I2C_ERR   0                 //出错返回0
#define I2C_CRR   1                 //正确返回1

unsigned char display[8]={0,0,0,0,0,' ','l','x'};//显示数据
unsigned char buffer[3]={0,0,0};//显示数据

void BH1750_Read(void);                                         
void conversion(unsigned int i);
void conversion1(unsigned int i);
void BH1750_init(void);

/*********************************************
IIC读取BH1750程序
**********************************************/
void BH1750_Read(void)  
{  
  unsigned char dbh,dbl;


// I2C_Stop();                                 //释放IIC总线控制

  if( I2C_Start()==I2C_ERR )                //重新开始IIC,之前没有STOP,IIC总线控制权保持
    return;
        
  if( I2C_SendWrDAdr(SLA_W)==I2C_ERR )        //发送从机写地址
    return;

  if( I2C_SendDat(BH1750_Config)==I2C_ERR )   //发送1750工作模式指令
    return;

  I2C_Stop();                                 //释放IIC总线控制

  Delay_nms(180);                             //延时120ms等待读取

  if( I2C_Start()==I2C_ERR )                  //开始IIC通信
    return;

  if( I2C_SendRdDAdr(SLA_R)==I2C_ERR )        //发送从机读地址
    return;

  if( I2C_RcvAckDat(dbh)==I2C_ERR )           //读高8位数据,主机发送ACK
    return;

  if( I2C_RcvNAckDat(dbl)==I2C_ERR )          //读低8位数据,主机发送非ACK
    return;

  I2C_Stop();

  conversion1(dbh);         //数据转换出个,十,百,位  

  LCD_Write_string(3,6,buffer);//显示数值,从第6列开始

  conversion1(dbl);         //数据转换出个,十,百,位  

  LCD_Write_string(4,6,buffer);//显示数值,从第6列开始

  conversion((dbh<<8)|dbl);         //数据转换出个,十,百,千 位  

  LCD_Write_string(1,4,display);//显示数值,从第4列开始

  conversion(((dbh<<8)|dbl)/1.2+0.5);         //数据转换出个,十,百,千 位  

  LCD_Write_string(2,4,display);//显示数值,从第9列开始
  //return (dbh<<8)|dbl;
}
/*********************************************
数据转换,十六进制数据转换成10进制
输入十六进制范围:0x00-0xff(0-255)
结果分成个十百位,以ascii存入显示区
**********************************************/
void conversion1(unsigned int i)  
{  
    buffer[0]=(i%1000)/100+0x30 ;
    buffer[1]=(i%100)/10+0x30 ;
    buffer[2]=i%10+0x30;  
}
/*********************************************
数据转换,十六进制数据转换成10进制
输入十六进制范围:0x0000-0x270f(0-9999)
结果分成个十百千位,以ascii存入显示区
**********************************************/
void conversion(unsigned int i)  
{  
           display[0]=i/10000+0x30 ;
        display[1]=(i%10000)/1000+0x30 ;
    display[2]=(i%1000)/100+0x30 ;
    display[3]=(i%100)/10+0x30 ;
    display[4]=i%10+0x30;  
}
/*********************************************
BH1750初始化,上电,清寄存器
**********************************************/
void BH1750_init(void)
{
  if( I2C_Start()==I2C_ERR )                  //开始IIC通信
    return;

  if( I2C_SendWrDAdr(SLA_W)==I2C_ERR )        //发送从机写地址
    return;

  if( I2C_SendDat(BH1750_On)==I2C_ERR )       //发送1750通电指令
    return;
        
  if( I2C_Restart()==I2C_ERR )                //重复开始IIC通信
    return;

  if( I2C_SendWrDAdr(SLA_W)==I2C_ERR )        //发送从机写地址
    return;
        
  if( I2C_SendDat(BH1750_Reset)==I2C_ERR )    //发送1750清寄存器指令
    return;
        
  I2C_Stop();
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。