|
現(xiàn)在LCD可以顯示,但是數(shù)據(jù)顯示為00000,光強度模塊沒有起到應(yīng)有的作用,麻煩你看一下
- #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]; //接收數(shù)據(jù)緩沖區(qū)
- 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) //寫答應(yīng)信號
- {
- sda=ack; //寫應(yīng)答信號
- scl=1; //拉高時鐘線
- delay_us();
- scl=0;
- delay_us();
- }
- bit get_respons() //接受答應(yīng)信號
- {
- scl=1;
- delay_us();
- CY=sda;
- scl=0;
- delay_us();
- return CY;
- }
- void send_byte(uchar date) //向IIC總線發(fā)送一個字節(jié)數(shù)據(jù)
- {
- 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總線接收一個字節(jié)數(shù)據(jù)
- {
- uchar j;
- uchar k=0;
- sda=1; //此時并不知道sda的狀態(tài),說以應(yīng)該釋放總線
- for(j=0;j<8;j++)
- {
- k<<=1;
- scl=1;
- delay_us();
- k|=sda; //k左移一位,與sda位或;不管sda是0還是1;讀取的數(shù)據(jù)都存在最低位
- scl=0; //為下一次更好讀數(shù)據(jù),scl拉低
- delay_us();
- }
- return k;
- }
- void write_add(uchar date)
- {
- BH1750_start();
- send_byte(0x46); //ADD接地,地址默認(rèn)為0x46
- send_byte(date);
- BH1750_stop();
- }
- void read_BH1750(void) //連續(xù)讀出BH1750內(nèi)部數(shù)據(jù)
- {
- 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的接口設(shè)置在P0口
- delay_us();
- lcden=1;
- delay_us();
- lcden=0;
- }
- void lcd_writebyte(uchar byte)//寫入數(shù)據(jù)
- {
- 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)//設(shè)置顯示坐標(biāo)
- {
- 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(); //連續(xù)讀出數(shù)據(jù),存儲在BUF中
- s=buffer[0];
- s=(s<<8)+buffer[1];//合成數(shù)據(jù),即光照數(shù)據(jù)
-
- result=(float)s/1.2;
- chaizi(result); //計算數(shù)據(jù)和顯示
- 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'); ////顯示數(shù)單位
- 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');
- }
- }
復(fù)制代碼 |
|