TSL2561 LCD结合显示.docx
《TSL2561 LCD结合显示.docx》由会员分享,可在线阅读,更多相关《TSL2561 LCD结合显示.docx(13页珍藏版)》请在冰豆网上搜索。
![TSL2561 LCD结合显示.docx](https://file1.bdocx.com/fileroot1/2023-2/25/cdd7abd3-bf89-4a67-8006-a82d1c2b483d/cdd7abd3-bf89-4a67-8006-a82d1c2b483d1.gif)
TSL2561LCD结合显示
#include
#include
//TSL2561地址
#defineucharunsignedchar
#defineuintunsignedint
//设备读写地址
#defineSLAVE_ADDR_WR0x52
#defineSLAVE_ADDR_RD0x53
//命令控制寄存器
#defineCONTROL0x80
#//defineTIMING0x81
#defineDATA0LOW0x8C
#defineDATA0HIGH0x8D
#defineDATA1LOW0x8E
#defineDATA1HIGH0x8F
ucharDataLow0,DataHigh0,DataLow1,DataHigh1,commad;
longdoubleChannel0,Channel1;
unsignedlongtemp=0,wet=0;
floatratio;
unsignedcharle[6];
//LCD控制脚
sbitLCD_RS=P2^5;
sbitLCD_RW=P2^6;
sbitLCD_EN=P2^7;
sbitsda=P2^0;
sbitscl=P2^1;
voiddelay(){;;;}
ucharcodecdis3[]={"guangzhaoshiyan"};
ucharcodecdis4[]={"qdu:
Lux"};
#definedelayNOP(){_nop_();_nop_();_nop_();_nop_();}
voiddelay1(intms)
{
unsignedchary;
while(ms--)
{
for(y=0;y<250;y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
voiddelays(unsignedintcnt)
{
while(--cnt);
}
voiddelay1ms(ucharx)
{
uchara,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
/******************************************************************/
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*/
/******************************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
return(result);
}
/*写指令数据到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/
/*******************************************************************/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*******************************************************************/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/
/*******************************************************************/
voidlcd_wdat(uchardat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*LCD初始化设定*/
/*******************************************************************/
voidlcd_init()
{
delay1(15);
lcd_wcmd(0x01);//清除LCD的显示内容
lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x0c);//显示开,关光标
delay1(5);
lcd_wcmd(0x06);//移动光标
delay1(5);
lcd_wcmd(0x01);//清除LCD的显示内容
delay1(5);
}
/*设定显示位置*/
/*******************************************************************/
voidlcd_pos(ucharpos)
{
lcd_wcmd(pos|0x80);//数据指针=80+地址变量
}
voidstart()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
voidstop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
voidrespons()
{
uchari;
scl=1;
delay();
while((sda==1)&&(i<250))
i++;
scl=0;
delay();
}
voidwrite_byte(unsignedchardate)
{
uchari;
for(i=0;i<8;i++)
{
scl=0;
date<<=1;
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;//释放资源
delay();
}
ucharread_byte()
{
uchari,k=0;
scl=0;
delay();
sda=1;//释放资源
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
returnk;
}
voidTSL2561_Write(ucharcommand,uchardate)
{
start();
write_byte(SLAVE_ADDR_WR);
respons();
write_byte(command);
respons();
write_byte(date);
respons();
stop();
}
ucharTSL2561_Read(ucharcommand)
{
uchardate;
start();
write_byte(SLAVE_ADDR_WR);
respons();
write_byte(command);
respons();
start();
write_byte(SLAVE_ADDR_RD);
respons();
date=read_byte();
respons();
stop();
returndate;
}
//读取光照强度
voidRead_Light()
{
DataLow0=TSL2561_Read(DATA0LOW);
delay1
(1);
DataHigh0=TSL2561_Read(DATA0HIGH);
delay1
(1);
Channel0=256*DataHigh0+DataLow0;
DataLow1=TSL2561_Read(DATA1LOW);
delay1
(1);
DataHigh1=TSL2561_Read(DATA1HIGH);
delay1
(1);
Channel1=256*DataHigh1+DataLow1;
ratio=Channel1/Channel0;
//temp=Channel0;
if((ratio>0)&&(ratio<=0.5))
{
temp=0.0304*Channel0-0.062*Channel0*(ratio*ratio/1.5);
}
elseif((ratio>0.5)&&(ratio<=0.61))
{
temp=0.0224*Channel0-0.031*Channel1;
}
elseif((ratio>0.61)&&(ratio<=0.8))
{
temp=0.0128*Channel0-0.0153*Channel1;
}
elseif((ratio>0.8)&&(ratio<=1.3))
{
temp=0.00146*Channel0-0.00112*Channel1;
}
else
{
temp=0;
}
ratio=0;
}
voiddisp(void)//显示函数
{
wet=temp;
temp=0;
le[0]=wet%10;//最低位
wet=wet/10;
le[1]=wet%10;//第二位
wet=wet/10;
le[2]=wet%10;//第三位
wet=wet/10;
le[3]=wet%10;
lcd_pos(0x47);
lcd_wdat(le[3]+48);
lcd_pos(0x48);
lcd_wdat(le[2]+48);
lcd_pos(0x49);
lcd_wdat(le[1]+48);
lcd_pos(0x4a);
lcd_wdat(le[0]+48);
delays(100);
}
voidgzh_Menu()//显示湿度的菜单
{
ucharm;
lcd_pos(0);//设置显示位置为第一行的第1个字符
m=0;
while(cdis3[m]!
='\0')
{//显示字符
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40);//设置显示位置为第二行第1个字符
m=0;
while(cdis4[m]!
='\0')
{
lcd_wdat(cdis4[m]);//显示字符
m++;
}
}
voidmain()
{
lcd_init();
gzh_Menu();
TSL2561_Write(CONTROL,0x03);//设置TSL2561未开启状态
while
(1)
{
Read_Light();
disp();
//delay1(100);
}
}