2019-07-18 09:35发布
★遥★臻★ 发表于 2013-5-31 16:59 曲线显示方式的设置 进度条首先确定总的进度比如总的显示时间,根据所用的时间可确定进度 没法显示负的温度 ...
最多设置5个标签!
帮忙改一下这程序吧,怎么错误越改越多
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define x1 0x80
#define x2 0x88
#define y1 0x80
#define comm 0
#define dat 1
bit flag=0;
sbit rs=P2^0;//H=data;L="command"
sbit rw=P2^1;//H=read;L=write
sbit e=P2^2;//input enable
sbit PSB=P2^3; //H=关口;L=串口
sbit rst=P2^5; //reset signal 低电平有效
sbit busy=P2^4; //lcd busy bit
sbit DQ=P3^3; //18b20数据线引脚
uchar temper[2];//存放温度的数组
void wr_lcd(uchar dat_comm,uchar content);
void delay(uint us);
//void chk_busy(void);
//void set_dot(uchar x,uchar y);
void init_lcd(void)
{
rst=1;
PSB=1;
wr_lcd(comm,0x30);/**** ***30基本指令动作********/
wr_lcd(comm,0x31);/**** ***清屏,地址指针指向00H********/
wr_lcd(comm,0x06);/**** ***光标的移动方向********/
wr_lcd(comm,0x0c);/**** ***开显示,关游标********/
}
void wr_lcd(uchar dat_comm,uchar content)
{
chk_busy();
if(dat_comm)
{
rs=1;//data
rw=0;//write
}
else
{
rs=0;//command
rw=0;//write
}
P0=content;//output dator comm
e=1;
e=0;
}
/**** ***************************读数据*******************/
read_lcd()
{
uchar content;
chk_busy();
delay(3);
P0=0xff;
delay(3);
rs=1;//data
rw=1;//read
e=1;
content=P0;//位置可能不对头影响结果
delay(3);
return(content);
}
void chk_busy(void)
{
P0=0xff;
rs=0;
rw=1;
e=1;
while(busy==1);
e=0;
}
void delay(uint us)//delay time
{
while(us--);
}
delay1(uint ms)
{
uint i,j;
wr_lcd(comm,0x30);
//wr_lcd(comm,www);
for(j=0;j<4;j++)
for(i=0;i<16;i++);
// wr_lcd(dat,chk[j*16+i]);
}
void set_dot(uchar x,uchar y)//连续打点成功
{
uchar x_byt;uchar x_bit;
uchar y_byt;uchar y_bit;
uchar tmph,tmpl; //定义两个临时变量存放
x_byt=x/16;
x_bit=x%16;
y_byt=y/32;
y_bit=y%32;
wr_lcd(comm,0x34);
wr_lcd(comm,0x80+y_bit);
wr_lcd(comm,0x80+y_byt+8*y_byt);
read_lcd();
tmph=read_lcd();
tmpl=read_lcd();
wr_lcd(comm,0x80+y_bit);
wr_lcd(comm,0x80+y_byt+8*y_byt);
if(x_bit<8)
{
wr_lcd(dat,tmph|(0x01<<(7-x_bit)));
wr_lcd(dat,tmpl);
}
else
{
wr_lcd(dat,tmpl);
wr_lcd(dat,tmpl|(0x01<<(15-x_bit)));
}
wr_lcd(comm,0x36);
}
void set_dot(uchar x,uchar y)//连续打点成功
{
uchar x_byt;uchar x_bit;
uchar y_byt;uchar y_bit;
uchar tmph,tmpl; //定义两个临时变量存放
x_byt=x/16;
x_bit=x%16;
y_byt=y/32;
y_bit=y%32;
wr_lcd(comm,0x34);
wr_lcd(comm,0x80+y_bit);
wr_lcd(comm,0x80+y_byt+8*y_byt);
read_lcd();
tmph=read_lcd();
tmpl=read_lcd();
wr_lcd(comm,0x80+y_bit);
wr_lcd(comm,0x80+y_byt+8*y_byt);
if(x_bit<8)
{
wr_lcd(dat,tmph&(~0x01<<(7-x_bit)));
wr_lcd(dat,tmpl);
}
else
{
wr_lcd(dat,tmpl);
wr_lcd(dat,tmpl&(~0x01<<(15-x_bit)));
}
wr_lcd(comm,0x36);
}
/**** ***************************清除整个gdram中的数据*******************/
void BMP_clear(void)
{
uchar i,k;
unsigned char L[1]={0};
wr_lcd(comm,0x34);// 8bit扩充指令集,即使是36H也要写两次
wr_lcd(comm,0x34);// 绘图on,基本指令集里面36H不能开绘图
for(i=0;i<32;i++) //32行
{
for(k=0;k<16;k++) //16列
{
wr_lcd(comm,0x80|i);//行位置,垂直坐标Y
wr_lcd(comm,0x80|k); //列位置,水平坐标X
// wr_lcd(comm,0x30);
wr_lcd(dat,L[0]);
wr_lcd(dat,L[0]);
}
}
wr_lcd(comm,0x34);//关绘图
//wr_lcd(comm,0x30);
}
/**** ***************************延时函数*******************/
void delay2(uint us)
{
while(us--);
}
void reset(void)//复位
{
uchar x=0;
DQ=1;
delay2(8);//稍做延时
DQ=1;// 拉高总线
delay2(14);
x=DQ;
delay2(20);
}
/**** ***************************从ds18b20读一字节*******************/
uchar readbyte(uchar date)//读一字节
{
uchar i=0;
uchar date=0;
for(i=8;i>0;i--)
{
DQ=0;
date>>=1;
DQ=1;
if(DQ)
{
date|=0x80;
delay2(4);
}
}
return(date);
}
/**** ***************************从ds18b20读一字节*******************/
uchar readbyte(void)//读一字节
{
uchar i=0;
uchar date=0;
for(i=8;i>0;i--)
{
DQ=0;
date>>=1;
DQ=1;
if(DQ)
{
date|=0x80;
delay2(4);
}
}
}
/**** ***************************向ds18b20写一字节*******************/
uchar writebyte(uchar date)//写一字节
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay2(5);
DQ=1;
date>>=1;
}
delay2(4);
}
/**** ***************************cpu获取温度值*******************/
void readtenp(void)//读取温度
{
uchar a=0;
uchar b=0;
reset();
writebyte(0xcc);//跳过序列号
writebyte(0x44);//启动温度转换
reset();
writebyte(0xcc);//
writebyte(0xbe);//读9个寄存器,前2个为温度
a=readbyte();//低温
b=readbyte();//高位
temper[0]=a&0x0f;
a=a>>4;
temper[1]=b<<4;
temper[1]=temper[1]|a;
}
zuobiao_tu()
{
uchar i;
for(i=0;i<64;i++)//da Y zhou
{
set_dot1(4,i);
}
for(i=0;i<128;i++)//da X zhou
{
set_dot1(i,57);
}
for(i=115;i<120;i++)// da T xing
{
set_dot1(i,59);
}
for(i=59;i<64;i++)//
{
set_dot1(117,i);
}
set_dot1(126,58);//da jian tou
set_dot1(125,59);
set_dot1(124,60);
set_dot1(123,61);
set_dot1(3,1);
set_dot1(2,2);
set_dot1(1,3);
set_dot1(0,4);
set_dot1(8,0);//da du
set_dot1(9,0);
set_dot1(8,1);
set_dot1(9,1);
for(i=11;i<14;i++)//da C xing zhuang
{
set_dot1(i,1);
set_dot1(i,4);
}
for(i=1;i<5;i++)//
{
set_dot1(11,i);
}
for(i=94;i<128;i++)// da ying xing kuang
{
set_dot1(i,14);
}
for(i=6;i<9;i++)//
{
set_dot1(i,59);
set_dot1(i,62);
}
for(i=1;i<5;i++)//
{
set_dot1(16,i);
set_dot1(18,i);
}
}
void main()
{
uchar xdata huanzuobiao[61];
uchar temp,tm1,tm2,tm3,tm4,m1,i=6,m2;
float backbit;
uchar dispbuf[]={0,1,2,3,4,5,6,7,8,9};
sp=0x5f;
TCON=0x05;
EX0=1;
EX1=1;
EA=1;
init_lcd();
BMP_clear();
zuobiao_tu();
for(i=0;i<60;;i++)
{
huanzuobiao=20;
}
while(1)
{
readtemp();
backbit=temper[0];
backbit= backbit*6.25;
temp=backbit;
tm1=temp%10;
temp=temp/10;
tm2=temp%10;
temp=temper[1];
tm3=temp%10;
temp=temp/10;
tm4=temp%10;
if(flag==0)
{
for(i=120;i>=6;i--)
{
if((i%2)==0)
{
set_dot2(i,57-huanzuobiao[i/2-3]);
}
}
for(i=1;i<60;i++)
{
huanzuobiao[i-1]=huanzuobiao;
}
huanzuobiao[60]=tm4&10+tm3;
for(i=126;i>=6;i--)
{
if((i%2)==0)
{
set_dot1(i,57-huanzuobiao[i/2-3]);
}
}
wr_lcd(comm,0x30);
wr_lcd(comm,0x86);
wr_lcd(dat,dispbuf[tm4]);
wr_lcd(dat,dispbuf[tm3]);
wr_lcd(dat,0x2e);
wr_lcd(dat,dispbuf[tm2]);
delay1(2500);
wr_lcd(comm,0x01);
}
else
{
wr_lcd(dat,dispbuf[tm4]);
wr_lcd(dat,dispbuf[tm3]);
wr_lcd(dat,0x2e);
wr_lcd(dat,dispbuf[tm2]);
wr_lcd(dat,dispbuf[tm1]);
}
}
}
一周热门 更多>