1
电路图仿真
程序
// 遇到的问题,负数转换的时候因为我只读了整数和一位符号位,就是八位,但是刚开始定义为 int型,
//然后加0x30,一直转换错误,后来定义为 uchar, 就好了!
#include
#include
#define uint unsigned int
#define uchar unsigned char
***it DQ=P3^6;
***it lcde=P2^2;
***it lcdrw=P2^1;
***it lcdrs=P2^0;
float w=0;
int w1=0,w2=0;
uchar w3=0;
int m[12]={0};
uchar table1[]={0x07,0x05,0x07,0x00,0x00,0x00,0x00,0x00,0x07,
0x08,0x10,0x10,0x10,0x10,0x08,0x07,};
//温度单位的自定义字符代码
/**********精确延时函数群******/
void delay600us(void) //延时800us子函数
{
uchar a,b;
for(b=119;b>0;b--)
for(a=1;a>0;a--);
}
void delay750ms(void) //延时750ms
{
unsigned char a,b,c;
for(c=61;c>0;c--)
for(b=28;b>0;b--)
for(a=218;a>0;a--);
}
void delay20us(void) //延时20us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=1;a>0;a--);
}
void delay70us(void) //延时70us子函数
{
unsigned char a,b;
for(b=13;b>0;b--)
for(a=1;a>0;a--);
}
void delay(uint j) //LCD延时函数
{
uint k;
while(j)
{
for(k=50;k>0;k--);
j--;
}
}
/**************DS1820初始化**********/
void csh()
{
DQ=0;
delay600us();
DQ=1;
_nop_();
delay600us();
}
/*********DS1820写函数*******/
void write(uint j)
{
uint i;
for(i=0;i<8;i++)
{
DQ=0;
delay20us();
DQ=j&0x01;
delay70us();
j=j>>1;
DQ=1;
_nop_();
}
}
/*********DS1820读函数*******/
void read()
{
uint k;
for(k=0;k<12;k++)
{
DQ=0;
_nop_();
DQ=1;
_nop_();
m[k]=DQ;
delay70us();
delay70us();
}
w=m[0]/16+m[1]/8+m[2]/4+m[3]/2+m[4]+2*m[5]+4*m[6]+8*m[7]+16*m[8]+32*m[9]+64*m[10];
w1=10*w;//正数
w2=m[11];
w3=m[4]+2*m[5]+4*m[6]+8*m[7]+16*m[8]+32*m[9]+64*m[10]+128*m[11];//负数
w3=~(w3-1);//补码还原成原码
//算出温度值,乘个10,舍去最末三个小数,浮点变整形。
}
/*********LCD写命令*******/
void write_com(uchar com)
{
lcdrs=0;
lcde=0;
P0=com;
delay(1);
lcde=1;
delay(1);
lcde=0;
}
/*********LCD写数据*******/
void write_date(int date)
{
lcdrs=1;
P0=date;
delay(1);
lcde=1;
delay(1);
lcde=0;
}
/*********LCD初始化*******/
void init()
{
lcde=0;
write_com(0x3c); //设置5*7,8位
write_com(0x0c);//画面显示开,光标关闭,
write_com(0x06); //输入方式 光标自动加一
write_com(0x01);//清屏
}
/*********LCD显示*******/
void xianshi()
{
uchar com;
init();
if(w2==0) //判断符号位是否为0;
{
write_com(0x80); //正的话从这里执行
if((w1/1000)==0)
{
write_date(0xfe);
}
else
{
write_date(w1/1000+0x30); //百位
}
_nop_();
write_com(0x81);
if((w1/100)==0)
{
write_date(0xfe);
}
else
{
write_date(w1%1000/100+0x30); //十位
_nop_();
}
write_com(0x82);
write_date( w1%1000%100/10+0x30); //个位
_nop_();
write_com(0x83);
write_date('.'); //写上小数点
_nop_();
write_com(0x84);
write_date(w1%1000%100%10+0x30);//小数点后第一位
_nop_();
}
else //负数从这里执行
{
write_com(0x80);
write_date(0xfe);
write_com(0x82);
write_date(0xb0);
if(w3/10==0)
{
write_com(0x83);
write_date(0xfe); //十位
}
else{
write_date(w3/10+0x30); //十位
}
write_com(0x84);
write_date(w3%10+0x30); //个位
}
write_com(0x40);//往自定义寄存器CGRAM中写数据命令
for(com=0;com<16;com++)
{
write_date(table1[com]);
} //温度的单位用两个字节显示,一个字节写八行,一共需要写16个
write_com(0x85);//显示位置
write_date(0x00); //显示第一个自定义字符
write_com(0x86);
write_date(0x01);
}
/*********************** 主程序*********************/
void main()
{
csh();
write(0xcc);
write(0x44);
delay750ms();
csh();
write(0xcc);
write(0xbe);
read();
xianshi();
}
|
|