现在LCD可以显示,但是数据显示为00000,光强度模块没有起到应有的作用,麻烦你看一下
- #include<reg52.h>
- #include<math.h>
- #include<stdio.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit lcden=P2^4;
- sbit lcdrs=P2^5;
- sbit lcdwr=P2^6;
- sbit sda=P1^1;
- sbit scl=P1^0;
- uchar ge,shi,bai,qian,wan; //显示变量
- uchar buffer[8]; //接收数据缓冲区
- int s; //变量
- void chaizi(uint temp) //拆字程序
- {
- wan=temp/10000+0x30 ;
- temp=temp%10000; //取余运算
- qian=temp/1000+0x30 ;
- temp=temp%1000; //取余运算
- bai=temp/100+0x30;
- temp=temp%100; //取余运算
- shi=temp/10+0x30;
- temp=temp%10; //取余运算
- ge=temp+0x30;
- }
- void delay_us() //延时5us
- {;;}
- void delay_ms(uint t) //延时t毫秒
- {
- uchar i,j;
- for(i=0;i<t;i++)
- {
- for(j=0;j<121;j++)
- {;}};
- }
- /************I2C总线通讯************/
- void BH1750_start() //开始信号
- {
- sda=1;
- scl=1;
- delay_us();
- sda=0;
- delay_us();
- scl=0;
- }
- void BH1750_stop() //停止信号
- {
- sda=0;
- scl=1;
- delay_us();
- sda=1;
- delay_us();
- }
- void send_respons(bit ack) //写答应信号
- {
- sda=ack; //写应答信号
- scl=1; //拉高时钟线
- delay_us();
- scl=0;
- delay_us();
- }
- bit get_respons() //接受答应信号
- {
- scl=1;
- delay_us();
- CY=sda;
- scl=0;
- delay_us();
- return CY;
- }
- void send_byte(uchar date) //向IIC总线发送一个字节数据
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- date<<=1;
- sda=CY; //CY为PWS的最高位
- scl=1;
- delay_us();
- scl=0;
- delay_us();
- }
- get_respons();
- }
- uchar get_byte() //从IIC总线接收一个字节数据
- {
- uchar j;
- uchar k=0;
- sda=1; //此时并不知道sda的状态,说以应该释放总线
- for(j=0;j<8;j++)
- {
- k<<=1;
- scl=1;
- delay_us();
- k|=sda; //k左移一位,与sda位或;不管sda是0还是1;读取的数据都存在最低位
- scl=0; //为下一次更好读数据,scl拉低
- delay_us();
- }
- return k;
- }
- void write_add(uchar date)
- {
- BH1750_start();
- send_byte(0x46); //ADD接地,地址默认为0x46
- send_byte(date);
- BH1750_stop();
- }
- void read_BH1750(void) //连续读出BH1750内部数据
- {
- uchar i;
- BH1750_start();
- send_byte(0x46+1);
- for(i=0;i<3;i++)
- {
- buffer[i]=get_byte();
- if(i == 3)
- {
- send_respons(1);
- }
- else
- {
- send_respons(0);
- }
- }
- BH1750_stop();
- delay_ms(5);
- }
- void BH1750_init()
- {
- write_add(0x01);
- }
- /************LCD显示************/
- void wait_enable(void)
- {
- P0=0xff;
- lcdrs=0;
- lcdwr=1;
- delay_us();
- lcden=1;
- delay_us();
- while(P0&0x80);
- lcden=0;
- }
- void lcd_command(uchar command,uchar shuxin)//写入指令
- {
- if(shuxin)
- wait_enable();
- lcdrs=0;
- lcdwr=0;
- delay_us();
- P0=command;//单片机上lcd的接口设置在P0口
- delay_us();
- lcden=1;
- delay_us();
- lcden=0;
- }
- void lcd_writebyte(uchar byte)//写入数据
- {
- wait_enable();
- lcdrs=1;
- lcdwr=0;
- delay_us();
- P0=byte;
- delay_us();
- lcden=1;
- delay_us();
- lcden=0;
- }
- /*void lcd_set_xy(uchar x,uchar y)//设置显示坐标
- {
- uchar address;
- if(y==0) //判断是是否为第一行
- address=0x80+x;
- else
- address=0xc0+x;
- lcd_command(address);
- }*/
- void lcd_display(uchar x,uchar y,uchar h) //lcd字符显示
- {
- y&=1;
- x&=15;
- if(y)x|=0x40;
- x|=0x80;
- lcd_command(x,0);
- lcd_writebyte(h);
- }
- /*void lcd_clean() //lcd清屏
- {
- lcd_command(0x01);
- delay_us();
- }*/
- void lcd1602_init()
- {
- lcd_command(0x38,1);
- lcd_command(0x08,1);
- lcd_command(0x01,1);
- lcd_command(0x06,1);
- lcd_command(0x0c,1);
- }
- void main()
- {
-
- float result;
- delay_ms(100);
-
- BH1750_init();
- lcd1602_init();
- while(1)
- {
- write_add(0x01);
- write_add(0x10);
- delay_ms(180); //延时180ms
- read_BH1750(); //连续读出数据,存储在BUF中
- s=buffer[0];
- s=(s<<8)+buffer[1];//合成数据,即光照数据
-
- result=(float)s/1.2;
- chaizi(result); //计算数据和显示
- lcd_display(0,0,'L');
- lcd_display(1,0,'i');
- lcd_display(2,0,'g');
- lcd_display(3,0,'h');
- lcd_display(4,0,'t');
- lcd_display(5,0,':');
-
- lcd_display(7,0,wan);
- lcd_display(8,0,qian);
- lcd_display(9,0,bai);
- lcd_display(10,0,shi);
- lcd_display(11,0,ge);
- lcd_display(13,0,'l'); ////显示数单位
- lcd_display(14,0,'x');
- lcd_display(0,1,'s');
- lcd_display(1,1,'u');
- lcd_display(2,1,'n');
- lcd_display(3,1,'>');
- lcd_display(4,1,'2');
- lcd_display(5,1,'0');
- lcd_display(9,1,'m');
- lcd_display(10,1,'o');
- lcd_display(11,1,'o');
- lcd_display(12,1,'n');
- lcd_display(13,1,'<');
- lcd_display(14,1,'2');
- lcd_display(15,1,'0');
- }
- }
复制代码 |