用1602显示18b20的温度数字,可是数字一直在闪动,且没有变化,另外,想再其他位显示一些固定的信息,怎么实现啊啊啊 啊?急求,十分感谢!下面是小弟的程序,不知错在哪里了。。。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint z);
void write(uchar date);
void readtemp();
void display();
void init();
void writecom(uchar com);
void writedate(uchar da);
void zhunbei();
void lcd_pos(uchar pos);
sbit DQ=P3^3;
sbit rs=P2^0;
sbit rw=P2^1;
sbit E=P2^2;
uint h,num;
uchar flag,
time,TN,TD,TH,TL,x=22,s=25;
uchar ss,sg,xs,xg;
uchar code shu[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar code wendu[]={"Wendu: ." };
bit lcd_busy()
{
bit result ;
rs = 0 ;
rw = 1 ;
E = 1 ;
delay(5) ;
result = (bit)(P0&0x80) ;
E= 0 ;
return(result) ;
}
/****初始化函数***/
reset(void)
{
flag=1;
while(flag)
{
while(flag)
{
DQ=1;
_nop_();
_nop_();
DQ=0;
for(time=0;time<200;time++);
DQ=1;
for(time=0;time<20;time++);
flag=DQ;
}
for(time=0;time<200;time++);
flag=~DQ;
}
DQ=1;
return(flag) ; //返回信号,0=presence,1= no presence
}
/****写函数****/
void write(uchar date)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();
DQ=0;
DQ=date&0x01;
for(time=0;time<10;time++);
DQ=1;
for(time=0;time<1;time++);
date>>=1;
}
for(time=0;time<4;time++);
}
/******读函数******/
uchar read(void)
{
uchar j=0;
uchar value;
for(j=8;j>0;j--)
{
DQ=1;
_nop_();
DQ=0;
_nop_();
DQ=1;
for(time=0;time<3;time++);
value>>=1;
if(DQ==1)
value|=0x80;
else
value|=0x00;
for(time=0;time<20;time++);
}
return(value);
}
/*******读取温度****/
void readtemp()
{
reset();
write(0xcc) ;
write(0x44);
reset();
write(0xcc);
write(0xbe);
TL=read();
TH=read();
}
/**1602****/
void lcd_pos(uchar pos)
{
writecom(pos | 0x80) ; //数据指针=80+地址变量
}
/****写指令*****/
void writecom(uchar com)
{
while(lcd_busy()) ;
rs=0;
rw=0;
E=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
/*****写数据*****/
void writedate(uchar da)
{
rs=1;
rw=0;
E=0;
P0=da;
delay(5);
E=1;
delay(5);
E=0;
}
void init()
{
E=0;
writecom(0x38);
writecom(0x0e);
writecom(0x06);
writecom(0x01);
writecom(0x80);
}
/******温度显示********/
void display()
{
uchar TNS,TNG;
TNS=TN/10;
TNG=TN%10;
ss=s/10; //十位
sg=s%10; //各位
xs=x/10; //小数点后第一位
xg=x%10; //小数点后第二位
init();
lcd_pos(0x06);
writedate(shu[ss]);
lcd_pos(0x07);
writedate(shu[sg]);
lcd_pos(0x09);
writedate(shu[xs]);
lcd_pos(0x10);
writedate(shu[xg]);
}
void zhunbei()
{
init();
num=0;
while(wendu[num]!=' ')
{
writedate(wendu[num]);
num++;
}
}
/********主函数*******/
void main()
{
zhunbei();
do{
readtemp();
display();
}
while(!flag) ;
}
/***延时程序****/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
一周热门 更多>