求高手指点为什么lcd不显示
时间:10-02
整理:3721RD
点击:
#include <reg51.H>
#include <intrins.h>
#include<stdlib.h>
#define uint unsigned int
#define uchar unsigned char
/******************************
DS18B20引脚
******************************/
sbit DQ=P1^3; //13
uchar data temp_data[2] = {0x00,0x00} ;
uchar data display[5] = {0x00,0x00,0x00,0x00,0x00} ;
bit presence;
/******************************
继电器开关
******************************/
sbit guang=P3^3;
sbit shidi=P3^4;
sbit shigao=P3^5;
sbit wendi=P3^6;
sbit wengao=P3^7;
/******************************
定义12864引脚
******************************/
#define LCD_data P0
sbit LCD_RS=P2^4;
sbit LCD_RW=P2^3;
sbit LCD_EN=P2^2;
sbit LCD_PSB=P2^5;
/******************************
定义ADC0832引脚
******************************/
sbit ADCS =P1^4; //ADC0832 chip seclect
sbit ADDI =P1^6; //ADC0832 k in
sbit ADDO =P1^6; //ADC0832 k out
sbit ADCLK =P1^5; //ADC0832 clock signal
/******************************
12864显示各个参数
******************************/
uchar code dis1[]={"湿度:"};
uchar code dis2[]={"光照:"};
uchar code dis3[]={"温度: ."};
uchar code dis4[]={"马星云2013/12/16"};
uchar dispbuf[3];
/******************************
显示中间变量
******************************/
uint temp;
uint dat0=0;
uchar disp[]={"0123456789"};//显示数组
uchar adc[4];
uchar abc[6];
//uchar abc_1[3];
uchar bijiao[5];
uchar uart[2];
/******************************
12864驱动
******************************/
void delay_1ms(uint x) //延迟时间函数
{
uchar i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
void write_cmd(uchar cmd)
{
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=cmd;
delay_1ms(10);
LCD_EN=1;
delay_1ms(10);
LCD_EN=0;
}
void write_dat(uchar dat)
{
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delay_1ms(6);
LCD_EN=1;
delay_1ms(6);
LCD_EN=0;
}
void lcd_pos(uchar x,uchar y)
{
uchar pos;
if(x==0)
{x=0x80;}
if(x==1)
{x=0x90;}
if(x==2)
{x=0x88;}
if(x==3)
{x=0x98;}
pos=x+y;
write_cmd(pos);
}
/******************************
12864初始化
******************************/
void lcd_init()
{
LCD_PSB=1;
write_cmd(0x30);
delay_1ms(5);
write_cmd(0x0c);
delay_1ms(5);
write_cmd(0x01);
delay_1ms(5);
}
/******************************
显示名称
******************************/
void display_nm()
{
uchar i;
lcd_pos(0,0);
i=0;
while(dis1[i]!='\0')
{
write_dat(dis1[i]);
i++;
}
lcd_pos(1,0);
i=0;
while(dis2[i]!='\0')
{
write_dat(dis2[i]);
i++;
}
lcd_pos(2,0);
i=0;
while(dis3[i]!='\0')
{
write_dat(dis3[i]);
i++;
}
lcd_pos(3,0);
i=0;
while(dis4[i]!='\0')
{
write_dat(dis4[i]);
i++;
}
}
/******************************
18B20程序模块
******************************/
unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;///*小数位表,四舍五入*/
void Delay(unsigned int num)
{
while( --num ) ;
}
/*初始化ds1820 */
/*******************************************************************/
Init_DS18B20(void)
{
DQ = 1 ; //DQ复位
Delay(8) ; //稍做延时
DQ = 0 ; //单片机将DQ拉低
Delay(90) ; //精确延时 大于 480us
DQ = 1 ; //拉高总线
Delay(8) ;
presence = DQ ; //如果=0则初始化成功 =1则初始化失败
Delay(100) ;
DQ = 1 ;
return(presence) ; //返回信号,0=presence,1= no presence
}
/* 读一个字节 */
/*******************************************************************/
ReadOneChar(void)
{
unsigned char i = 0 ;
unsigned char dat = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ; // 给脉冲信号
dat >>= 1 ;
DQ = 1 ; // 给脉冲信号
if(DQ)
dat |= 0x80 ;
Delay(4) ;
}
return (dat) ;
}
/* 写一个字节 */
/*******************************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
DQ = dat&0x01 ;
Delay(5) ;
DQ = 1 ;
dat>>=1 ;
}
}
/* 读取温度 */
/*******************************************************************/
void Read_Temperature(void)
{
Init_DS18B20() ;
WriteOneChar(0xCC) ; // 跳过读序号列号的操作
WriteOneChar(0x44) ; // 启动温度转换
Init_DS18B20() ;
WriteOneChar(0xCC) ; //跳过读序号列号的操作
WriteOneChar(0xBE) ; //读取温度寄存器
temp_data[0] = ReadOneChar() ; //温度低8位
temp_data[1] = ReadOneChar() ; //温度高8位
}
/* 数据转换与温度显示 */
/*******************************************************************/
void Disp_Temperature()
{
display[4]=temp_data[0]&0x0f ;
display[0]=ditab[display[4]]+0x30 ; //查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
display[3]=display[4]/100+0x30 ;
display[1]=display[4]%100 ;
display[2]=display[1]/10+0x30 ;
display[1]=display[1]%10+0x30 ;
bijiao[4]=ditab[display[4]];
bijiao[3]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
bijiao[2]=bijiao[3]/100;//比较百位
bijiao[0]=bijiao[3]%100;
bijiao[1]=bijiao[0]/10;//比较十位
bijiao[0]=bijiao[0]%10;//比较个位
if(display[3]==0x30) //高位为0,不显示
{
display[3]=0x20 ;
if(display[2]==0x30) //次高位为0,不显示
display[2]=0x20 ;
}
lcd_pos(2,3);
write_dat(display[3]);
lcd_pos(2,4);
write_dat(display[2]);
lcd_pos(2,5);
write_dat(display[1]);
lcd_pos(2,7);
write_dat(display[0]);
}
/******************************
ADC0832数据转换
******************************/
uint Adc0832(uchar channel) //AD转换,返回结果
{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
/************************************
不同通道的0832显示
************************************/
void action(uchar x,uchar y,uchar x1,uchar y1,uchar x2,uchar y2,uint ADC)
{
dat0= ADC;
temp=dat0*1*500/255; //电压值转换,5V做为参考电压,分成256份。
dispbuf[0]=temp%10; //个位
dispbuf[1]=temp/10%10; //十位
dispbuf[2]=temp/100%10; //百位
lcd_pos(x,y);
write_dat(disp[dispbuf[2]]);
lcd_pos(x1,y1);
write_dat(disp[dispbuf[1]]);
lcd_pos(x2,y2);
write_dat(disp[dispbuf[0]]);
adc[0]=dispbuf[2];
adc[1]=dispbuf[1];
adc[2]=dispbuf[0];
}
/**************************************
串口初始化
**************************************/
void init_u()
{
TMOD=0x20; //TMOD=0010 0000B,定时器T1工作于方式2
SCON=0x40; //SCON=0100 0000B,串口工作方式1 1起始位8数据位1停止位
PCON=0x00; //PCON=0000 0000B,波特率9600 晶振11.0592
TH1=0xfd; //根据规定给定时器T1赋初值
TL1=0xfd; //根据规定给定时器T1赋初值
TR1=1;
}
/**************************************
串口发送
**************************************/
void send()
{
uchar i=3,j;
uart[0]=(Adc0832(0)*1*500/255)%255;
uart[1]=(Adc0832(1)*1*500/255)%255;
abc[0]=display[4];
abc[1]=uart[0];
abc[2]=uart[1];
abc[3]=(~wengao)&0x1;
abc[4]=(~shigao)&0x1;
abc[5]=(~guang)&0x1;
SBUF=i;
while(TI!=1);
TI=0;
delay_1ms(10);
for(j=0;j<6;j++)
{
SBUF=abc[j];
while(TI!=1);
TI=0;
delay_1ms(100);
}
}
/**************************************
控制函数
**************************************/
void kongzhi_wen()
{
if(bijiao[0]+bijiao[1]*10+bijiao[2]*100>30)
wengao=1;
if(bijiao[0]+bijiao[1]*10+bijiao[2]*100<10)
wendi=1;
else
wengao=0;
wendi=0;
}
/****************************************
函数功能:主程序
****************************************/
void main(void)
{
lcd_init();
init_u();
display_nm();
guang=1;
shigao=1;
shidi=1;
wengao=1;
wendi=1;
Read_Temperature();
Disp_Temperature();
while(1)
{
Read_Temperature();
Disp_Temperature();
action(0,5,0,6,0,7,Adc0832(0));
if(adc[2]+adc[1]*10+adc[0]*100>180)
guang=1;
if(adc[2]+adc[1]*10+adc[0]*100<120)
guang=0;
action(1,5,1,6,1,7,Adc0832(1));
if(adc[2]+adc[1]*10+adc[0]*100>180)
shigao=1;
if(adc[2]+adc[1]*10+adc[0]*100<90)
shidi=1;
else
shidi=0;
shigao=0;
kongzhi_wen();
send();
}
}
#include <intrins.h>
#include<stdlib.h>
#define uint unsigned int
#define uchar unsigned char
/******************************
DS18B20引脚
******************************/
sbit DQ=P1^3; //13
uchar data temp_data[2] = {0x00,0x00} ;
uchar data display[5] = {0x00,0x00,0x00,0x00,0x00} ;
bit presence;
/******************************
继电器开关
******************************/
sbit guang=P3^3;
sbit shidi=P3^4;
sbit shigao=P3^5;
sbit wendi=P3^6;
sbit wengao=P3^7;
/******************************
定义12864引脚
******************************/
#define LCD_data P0
sbit LCD_RS=P2^4;
sbit LCD_RW=P2^3;
sbit LCD_EN=P2^2;
sbit LCD_PSB=P2^5;
/******************************
定义ADC0832引脚
******************************/
sbit ADCS =P1^4; //ADC0832 chip seclect
sbit ADDI =P1^6; //ADC0832 k in
sbit ADDO =P1^6; //ADC0832 k out
sbit ADCLK =P1^5; //ADC0832 clock signal
/******************************
12864显示各个参数
******************************/
uchar code dis1[]={"湿度:"};
uchar code dis2[]={"光照:"};
uchar code dis3[]={"温度: ."};
uchar code dis4[]={"马星云2013/12/16"};
uchar dispbuf[3];
/******************************
显示中间变量
******************************/
uint temp;
uint dat0=0;
uchar disp[]={"0123456789"};//显示数组
uchar adc[4];
uchar abc[6];
//uchar abc_1[3];
uchar bijiao[5];
uchar uart[2];
/******************************
12864驱动
******************************/
void delay_1ms(uint x) //延迟时间函数
{
uchar i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
void write_cmd(uchar cmd)
{
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=cmd;
delay_1ms(10);
LCD_EN=1;
delay_1ms(10);
LCD_EN=0;
}
void write_dat(uchar dat)
{
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delay_1ms(6);
LCD_EN=1;
delay_1ms(6);
LCD_EN=0;
}
void lcd_pos(uchar x,uchar y)
{
uchar pos;
if(x==0)
{x=0x80;}
if(x==1)
{x=0x90;}
if(x==2)
{x=0x88;}
if(x==3)
{x=0x98;}
pos=x+y;
write_cmd(pos);
}
/******************************
12864初始化
******************************/
void lcd_init()
{
LCD_PSB=1;
write_cmd(0x30);
delay_1ms(5);
write_cmd(0x0c);
delay_1ms(5);
write_cmd(0x01);
delay_1ms(5);
}
/******************************
显示名称
******************************/
void display_nm()
{
uchar i;
lcd_pos(0,0);
i=0;
while(dis1[i]!='\0')
{
write_dat(dis1[i]);
i++;
}
lcd_pos(1,0);
i=0;
while(dis2[i]!='\0')
{
write_dat(dis2[i]);
i++;
}
lcd_pos(2,0);
i=0;
while(dis3[i]!='\0')
{
write_dat(dis3[i]);
i++;
}
lcd_pos(3,0);
i=0;
while(dis4[i]!='\0')
{
write_dat(dis4[i]);
i++;
}
}
/******************************
18B20程序模块
******************************/
unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;///*小数位表,四舍五入*/
void Delay(unsigned int num)
{
while( --num ) ;
}
/*初始化ds1820 */
/*******************************************************************/
Init_DS18B20(void)
{
DQ = 1 ; //DQ复位
Delay(8) ; //稍做延时
DQ = 0 ; //单片机将DQ拉低
Delay(90) ; //精确延时 大于 480us
DQ = 1 ; //拉高总线
Delay(8) ;
presence = DQ ; //如果=0则初始化成功 =1则初始化失败
Delay(100) ;
DQ = 1 ;
return(presence) ; //返回信号,0=presence,1= no presence
}
/* 读一个字节 */
/*******************************************************************/
ReadOneChar(void)
{
unsigned char i = 0 ;
unsigned char dat = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ; // 给脉冲信号
dat >>= 1 ;
DQ = 1 ; // 给脉冲信号
if(DQ)
dat |= 0x80 ;
Delay(4) ;
}
return (dat) ;
}
/* 写一个字节 */
/*******************************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
DQ = dat&0x01 ;
Delay(5) ;
DQ = 1 ;
dat>>=1 ;
}
}
/* 读取温度 */
/*******************************************************************/
void Read_Temperature(void)
{
Init_DS18B20() ;
WriteOneChar(0xCC) ; // 跳过读序号列号的操作
WriteOneChar(0x44) ; // 启动温度转换
Init_DS18B20() ;
WriteOneChar(0xCC) ; //跳过读序号列号的操作
WriteOneChar(0xBE) ; //读取温度寄存器
temp_data[0] = ReadOneChar() ; //温度低8位
temp_data[1] = ReadOneChar() ; //温度高8位
}
/* 数据转换与温度显示 */
/*******************************************************************/
void Disp_Temperature()
{
display[4]=temp_data[0]&0x0f ;
display[0]=ditab[display[4]]+0x30 ; //查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
display[3]=display[4]/100+0x30 ;
display[1]=display[4]%100 ;
display[2]=display[1]/10+0x30 ;
display[1]=display[1]%10+0x30 ;
bijiao[4]=ditab[display[4]];
bijiao[3]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
bijiao[2]=bijiao[3]/100;//比较百位
bijiao[0]=bijiao[3]%100;
bijiao[1]=bijiao[0]/10;//比较十位
bijiao[0]=bijiao[0]%10;//比较个位
if(display[3]==0x30) //高位为0,不显示
{
display[3]=0x20 ;
if(display[2]==0x30) //次高位为0,不显示
display[2]=0x20 ;
}
lcd_pos(2,3);
write_dat(display[3]);
lcd_pos(2,4);
write_dat(display[2]);
lcd_pos(2,5);
write_dat(display[1]);
lcd_pos(2,7);
write_dat(display[0]);
}
/******************************
ADC0832数据转换
******************************/
uint Adc0832(uchar channel) //AD转换,返回结果
{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
/************************************
不同通道的0832显示
************************************/
void action(uchar x,uchar y,uchar x1,uchar y1,uchar x2,uchar y2,uint ADC)
{
dat0= ADC;
temp=dat0*1*500/255; //电压值转换,5V做为参考电压,分成256份。
dispbuf[0]=temp%10; //个位
dispbuf[1]=temp/10%10; //十位
dispbuf[2]=temp/100%10; //百位
lcd_pos(x,y);
write_dat(disp[dispbuf[2]]);
lcd_pos(x1,y1);
write_dat(disp[dispbuf[1]]);
lcd_pos(x2,y2);
write_dat(disp[dispbuf[0]]);
adc[0]=dispbuf[2];
adc[1]=dispbuf[1];
adc[2]=dispbuf[0];
}
/**************************************
串口初始化
**************************************/
void init_u()
{
TMOD=0x20; //TMOD=0010 0000B,定时器T1工作于方式2
SCON=0x40; //SCON=0100 0000B,串口工作方式1 1起始位8数据位1停止位
PCON=0x00; //PCON=0000 0000B,波特率9600 晶振11.0592
TH1=0xfd; //根据规定给定时器T1赋初值
TL1=0xfd; //根据规定给定时器T1赋初值
TR1=1;
}
/**************************************
串口发送
**************************************/
void send()
{
uchar i=3,j;
uart[0]=(Adc0832(0)*1*500/255)%255;
uart[1]=(Adc0832(1)*1*500/255)%255;
abc[0]=display[4];
abc[1]=uart[0];
abc[2]=uart[1];
abc[3]=(~wengao)&0x1;
abc[4]=(~shigao)&0x1;
abc[5]=(~guang)&0x1;
SBUF=i;
while(TI!=1);
TI=0;
delay_1ms(10);
for(j=0;j<6;j++)
{
SBUF=abc[j];
while(TI!=1);
TI=0;
delay_1ms(100);
}
}
/**************************************
控制函数
**************************************/
void kongzhi_wen()
{
if(bijiao[0]+bijiao[1]*10+bijiao[2]*100>30)
wengao=1;
if(bijiao[0]+bijiao[1]*10+bijiao[2]*100<10)
wendi=1;
else
wengao=0;
wendi=0;
}
/****************************************
函数功能:主程序
****************************************/
void main(void)
{
lcd_init();
init_u();
display_nm();
guang=1;
shigao=1;
shidi=1;
wengao=1;
wendi=1;
Read_Temperature();
Disp_Temperature();
while(1)
{
Read_Temperature();
Disp_Temperature();
action(0,5,0,6,0,7,Adc0832(0));
if(adc[2]+adc[1]*10+adc[0]*100>180)
guang=1;
if(adc[2]+adc[1]*10+adc[0]*100<120)
guang=0;
action(1,5,1,6,1,7,Adc0832(1));
if(adc[2]+adc[1]*10+adc[0]*100>180)
shigao=1;
if(adc[2]+adc[1]*10+adc[0]*100<90)
shidi=1;
else
shidi=0;
shigao=0;
kongzhi_wen();
send();
}
}