我想把溫度值用12864顯示出來,但是溫度變量的值不顯示,請各位大神幫忙看看。
程序如下
#include <stc12c5a60s2.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P1^2;
sbit DQ=P1^3;
uchar code table1[]="溫度:";
uchar code table2[]="°C";
void display1();
void display2();
void display3();
unsigned int read_temp();
void init_12864();
void write_com(uchar com);
unsigned char str[10] ;
unsigned int t ;
void main()
{
init_12864();
display1();
display2();
while(1)
{
t=read_temp();
sprintf(str,"%d",t);
display3();
write_com(0x01);
}
}
void DELAY_MS (unsigned int a)//毫秒級延時函數
{
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
void delay(unsigned int time)
{
while(--time);
}
void write_com(uchar com)//寫入一個命令
{
RS=0;
RW=0;
E=0;
DELAY_MS(1);
P0=com;//通過P0把命令給12864
DELAY_MS(1);
E=1;
DELAY_MS(5);
E=0;
DELAY_MS(5);
}
void write_dat(uchar dat)//寫入一個數據
{
RS=1;
RW=0;
E=0;
DELAY_MS(1);
P0=dat;//通過P0把數據給12864
DELAY_MS(1);
E=1;
DELAY_MS(5);
E=0;
DELAY_MS(5);
}
void init_12864()//12864液晶初始化(根據時序圖編寫)
{
DELAY_MS(100);
write_com(0x30);
DELAY_MS(1);
write_com(0x0e);//打開所有顯示
DELAY_MS(1);
write_com(0x0c);//不顯示光標
DELAY_MS(1);
write_com(0x06);//地址指針自動加一
DELAY_MS(1);
write_com(0x01);//清屏
DELAY_MS(1);
}
void display1()
{
uchar i;
write_com(0x80);
for(i=0;i<6;i++)
{
write_dat(table1[i]);
DELAY_MS (5);
}
}
void display2()
{
uchar i;
write_com(0x86);
for(i=0;i<4;i++)
{
write_dat(table2[i]);
DELAY_MS(5);
}
}
void display3()
{
uchar i;
write_com(0x88);
for(i=0;i<16;i++)
{
write_dat(str[i]);
DELAY_MS(5);
}
}
// ****************DS18B20復位函數************************/
void OwReset(void)
{
DQ=1;//從高拉倒低
delay(200);
DQ=0;
delay(1000); //550 us
DQ=1;
delay(1000); //延時500 us 這是DQ應該為0 說明復位成功 這里沒有用死循環判斷 怕干擾時鐘
DQ=1; //拉高電平
}
/****************DS18B20寫命令函數************************/
//向1-WIRE 總線上寫1個字節
void WriteByte(unsigned char val)
{
unsigned char i;
for(i=8;i>0;i--)
{
DQ=1; //從高拉倒低
DQ=0; //5 us
DQ=val&0x01; //最低位移出
delay(100); //66 us
val=val/2; //右移1位
}
DQ=1;
delay(1);
}
//
/****************DS18B20讀1字節函數************************/
//從總線上取1個字節
unsigned char ReadByte(void)
{
unsigned char i;
unsigned char value=0;
for(i=8;i>0;i--)
{
DQ=1;
value>>=1; //value=value>>1
DQ=0; //4 us
DQ=1; //4 us
if(DQ)value|=0x80;
delay(100); //66 us
}
DQ=1;
return(value);
}
/****************讀出溫度函數************************/
//
unsigned int ReadTemp() //讀溫度并轉換成三位有效數字
{
unsigned char a=0;
unsigned char b=0;
unsigned int t,m;
OwReset(); //總線復位
delay(500);
WriteByte(0xcc); //發命令
WriteByte(0x44); //發轉換命令
OwReset();
delay(100);
WriteByte(0xcc); //發命令
WriteByte(0xbe);
a=ReadByte(); //讀溫度值的第字節
b=ReadByte(); //讀溫度值的高字節
t=b;
t <<=8; // 低位補0 即0x00
t =t |a; // 兩字節合成一個整型變量。
t=t>>4; //高位補1
m=b;
m<<=8;
m=m|a;
m=m&0x0f;
t=t*10+m;
return t;
}
|