用LCD1602时,屏幕一直闪烁,只显示第二行的一个数字
时间:10-02
整理:3721RD
点击:
用LCD1602时,屏幕一直闪烁,只显示第二行的一个数字,求大神指导?/* 数据转换与温度显示 *//*******************************************************************/
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 ;
if(display[3]==0x30) //高位为0,不显示
{
display[3]=0x20 ;
if(display[2]==0x30) //次高位为0,不显示
display[2]=0x20 ;
}
lcd_pos(0x48) ;
lcd_wdat(display[3]) ; //百位数显示
lcd_pos(0x49) ;
lcd_wdat(display[2]) ; //十位数显示
lcd_pos(0x4a) ;
lcd_wdat(display[1]) ; //个位数显示
lcd_pos(0x4c) ;
lcd_wdat(display[0]) ; //小数位数显示
temp=display[4]; //整数部分
}
/*******************************************************************/
/* 蜂鸣器响一声 */
/*******************************************************************/
void beep()
{
unsigned char y ;
for (y=0 ;y<100 ;y++)
{
Delay(60) ;
BEEP=!BEEP ; //BEEP取反
}
BEEP=1 ; //关闭蜂鸣器
Delay(40000) ;
}
/* DS18B20 OK 显示菜单 */
/*******************************************************************/
void Ok_Menu ()
{
uchar m ;
lcd_init() ; //初始化LCD
lcd_pos(0) ; //设置显示位置为第一行的第1个字符
m = 0 ;
while(cdis1[m] != '\0')
{ //显示字符
lcd_wdat(cdis1[m]) ;
m++ ;
}
lcd_pos(0x40) ; //设置显示位置为第二行第1个字符
m = 0 ;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]) ; //显示字符
m++ ;
}
writetab() ; //自定义字符写入CGRAM
delay1(5) ;
lcd_pos(0x4d) ;
lcd_wdat(0x00) ; //显示自定义字符
}
/* DS18B20 ERROR 显示菜单 */
/*******************************************************************/
void Error_Menu ()
{
uchar m ;
lcd_init() ; //初始化LCD
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++ ;
}
}
/****************键盘输入********************/
keyscan()
{
if(K2==0) //判断K2是否按下
{
delay1(10); //延时判断K2是否按下
if(K2==0)
{
SET++; //设定温度加1
if(SET==35)
SET=20;
}
while(!K2);
}
if(K3==0) //判断K3是否按下
{
delay1(10); //延时判断K3是否按下
if(K3==0)
{
SET--; //设定温度减1
if(SET==0)
SET=20;
}
while(!K3);
}
return(SET);
}
/*************显示设定温度****************/
Disp_SET()
{
keyscan();
lcd_wdat(SET); //显示设定温度
}
/**************主程序***************/
void main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
IN1=1;
IN2=0;
Ok_Menu () ;
do
{
lcd_init(); //将液晶初始化
delay1(1); //延时1ms给硬件一点反应时间
Read_Temperature() ; //读取温度
Disp_Temperature() ; // 显示温度
keyscan(); //读取键盘子程序
lcd_wdat(SET);
delay1(2);
if((temp>SET)&&(temp<38))
{
high=Count_high ();
TR0=1;
}
else if(temp>=38) //温度过高--报警
{
delay1(5);
BEEP=0;
delay1(60) ;
BEEP=1 ; //关闭蜂鸣器
}
}
while(!presence) ;
Error_Menu () ;
do
{
Init_DS18B20() ;
beep() ;
}
while(!presence) ;
}
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 ;
if(display[3]==0x30) //高位为0,不显示
{
display[3]=0x20 ;
if(display[2]==0x30) //次高位为0,不显示
display[2]=0x20 ;
}
lcd_pos(0x48) ;
lcd_wdat(display[3]) ; //百位数显示
lcd_pos(0x49) ;
lcd_wdat(display[2]) ; //十位数显示
lcd_pos(0x4a) ;
lcd_wdat(display[1]) ; //个位数显示
lcd_pos(0x4c) ;
lcd_wdat(display[0]) ; //小数位数显示
temp=display[4]; //整数部分
}
/*******************************************************************/
/* 蜂鸣器响一声 */
/*******************************************************************/
void beep()
{
unsigned char y ;
for (y=0 ;y<100 ;y++)
{
Delay(60) ;
BEEP=!BEEP ; //BEEP取反
}
BEEP=1 ; //关闭蜂鸣器
Delay(40000) ;
}
/* DS18B20 OK 显示菜单 */
/*******************************************************************/
void Ok_Menu ()
{
uchar m ;
lcd_init() ; //初始化LCD
lcd_pos(0) ; //设置显示位置为第一行的第1个字符
m = 0 ;
while(cdis1[m] != '\0')
{ //显示字符
lcd_wdat(cdis1[m]) ;
m++ ;
}
lcd_pos(0x40) ; //设置显示位置为第二行第1个字符
m = 0 ;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]) ; //显示字符
m++ ;
}
writetab() ; //自定义字符写入CGRAM
delay1(5) ;
lcd_pos(0x4d) ;
lcd_wdat(0x00) ; //显示自定义字符
}
/* DS18B20 ERROR 显示菜单 */
/*******************************************************************/
void Error_Menu ()
{
uchar m ;
lcd_init() ; //初始化LCD
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++ ;
}
}
/****************键盘输入********************/
keyscan()
{
if(K2==0) //判断K2是否按下
{
delay1(10); //延时判断K2是否按下
if(K2==0)
{
SET++; //设定温度加1
if(SET==35)
SET=20;
}
while(!K2);
}
if(K3==0) //判断K3是否按下
{
delay1(10); //延时判断K3是否按下
if(K3==0)
{
SET--; //设定温度减1
if(SET==0)
SET=20;
}
while(!K3);
}
return(SET);
}
/*************显示设定温度****************/
Disp_SET()
{
keyscan();
lcd_wdat(SET); //显示设定温度
}
/**************主程序***************/
void main()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
IN1=1;
IN2=0;
Ok_Menu () ;
do
{
lcd_init(); //将液晶初始化
delay1(1); //延时1ms给硬件一点反应时间
Read_Temperature() ; //读取温度
Disp_Temperature() ; // 显示温度
keyscan(); //读取键盘子程序
lcd_wdat(SET);
delay1(2);
if((temp>SET)&&(temp<38))
{
high=Count_high ();
TR0=1;
}
else if(temp>=38) //温度过高--报警
{
delay1(5);
BEEP=0;
delay1(60) ;
BEEP=1 ; //关闭蜂鸣器
}
}
while(!presence) ;
Error_Menu () ;
do
{
Init_DS18B20() ;
beep() ;
}
while(!presence) ;
}