#include"Disp.h"
sbit BEEP=P3^1; //報(bào)警聲輸出
sbit LCD_RS=P1^0;
sbit LCD_RW=P1^1;
sbit LCD_EN=P1^2;
uchar code Temp_Disp_Title[] = ("Safe Temp<=37 C");
uchar Current_Temp_Display_Buffer[] = ("Temp:
");
//溫度字符
uchar code Temperature_Char[8] =
{0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};
//溫度小數(shù)位對(duì)照表
uchar code df_Table[] =
{0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar CurrentT = 0;
//當(dāng)前讀取的溫度整數(shù)部分
uchar Temp_Value[2] = {0x00,0x00}; //DS18B20讀取的溫度值
uchar Display_Digit[] = {0,0,0,0}; //待顯示的各溫度數(shù)位
//聲響延時(shí)
uint code ToneDelay=65000;
//延時(shí)
void DelayMS(uint ms)
{
uchar t;
while(ms--)
for(t=0;t<120;t++);
}
//T0定時(shí)器控制播放
void Timer0_Play_Music( ) interrupt 1
{
TH0=ToneDelay/256;
TL0=ToneDelay%6;
BEEP=!BEEP;
}
void PlaySound()
{
int i;
for(i=0;i<10;i++)
{
//Tone_Index=Song_Tone_Pointer[i];
TR0=1;//啟動(dòng)定時(shí)器0
DelayMS(15);
TR0=0;//關(guān)閉定時(shí)器0
}
}
//延時(shí)1
void DelayXus(int x)
{
uchar i;
while(x--)
for(i=0;i<200;i++);
}
//LCD忙等待
bit LCD_Busy_Check()
{
bit result;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P2&0x80);
LCD_EN=0;
return result;
}
//寫指令
void Write_LCD_Command(uchar cmd)
{
while(LCD_Busy_Check(
));
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_( );
_nop_( );
P2=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
//寫數(shù)據(jù)
void Write_LCD_Data(uchar dat)
{
while(LCD_Busy_Check( ));
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P2=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
//初始化LCD
void InitLCD()
{
Write_LCD_Command(0x01);
DelayXus(5);
Write_LCD_Command(0x38);
DelayXus(5);
Write_LCD_Command(0x0c);
DelayXus(5);
Write_LCD_Command(0x06);
DelayXus(5);
}
//在LCD上顯示當(dāng)前溫度
void Display_Temperature( )
{
uchar i;
//延時(shí)值與負(fù)號(hào)標(biāo)識(shí)
uchar t=150,ng=0;
//高5位全為1(0xF8)則為負(fù)數(shù),為負(fù)數(shù)時(shí)取反加1,并設(shè)置負(fù)數(shù)標(biāo)識(shí)
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00) Temp_Value[1]++;
ng=1;//負(fù)號(hào)標(biāo)識(shí)置1
}
//查表得到溫度小數(shù)部分
Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];
//獲取溫度整數(shù)部分(高字節(jié)中的低3位與低字節(jié)中的高4位,無符號(hào))
CurrentT=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
//將整數(shù)部分分解為3位待顯示數(shù)字
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT0/10;
Display_Digit[1]=CurrentT;
//刷新LCD顯示緩沖
Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';
Current_Temp_Display_Buffer[10]='.';
Current_Temp_Display_Buffer[ 9]=Display_Digit[1]+'0';
Current_Temp_Display_Buffer[ 8]=Display_Digit[2]+'0';
Current_Temp_Display_Buffer[ 7]=Display_Digit[3]+'0';
//高位為0時(shí)不顯示
if(Display_Digit[3]==0)
Current_Temp_Display_Buffer[7]=' ';
//高位為0且次高位為0時(shí),次高位不顯示
if(Display_Digit[2]==0&&Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]=' ';
//負(fù)號(hào)顯示在恰當(dāng)位置
if(ng)
{
if(Current_Temp_Display_Buffer[8]==' ')
Current_Temp_Display_Buffer[8]='-';
else if(Current_Temp_Display_Buffer[7]==' ')
Current_Temp_Display_Buffer[7]='-';
else
Current_Temp_Display_Buffer[6]='-';
}
//在第一行顯示標(biāo)題
Set_LCD_POS(0x00);
for(i=0;i<16;i++)
{
Write_LCD_Data(Temp_Disp_Title[i]);
}
//在第二行顯示當(dāng)前溫度
Set_LCD_POS(0x40);
for(i=0;i<12;i++)
{
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
}
//顯示溫度符號(hào)
Set_LCD_POS(0x4e);
Write_LCD_Data(0x00);
Set_LCD_POS(0x4c);
Write_LCD_Data(0x00);
Set_LCD_POS(0x4d);
Write_LCD_Data('C');
//超過預(yù)設(shè)溫度,報(bào)警
if(CurrentT>37)
{
PlaySound();
}
}
//設(shè)置顯示位置
void Set_LCD_POS(uchar pos)
{
Write_LCD_Command(pos|0x80);
}