/*************************************/
/******功能:1602液晶控制函數*********/
/******* 1602_display.h ************/
/*************************************/
uchar code table0[] = {"Range:25.0-090.0"};
uchar code table1[] = {"tempe:"};
void delay(uchar z)
{
uchar x = 0;
uchar y = 0;
for (x=z; x>0; x--)
for (y=110; y>0; y--);
}
bit Test() //檢忙
{
bit STA7 = 0;
RS = 0;
RW = 1;
E = 1;
STA7 = (bit)(P0&0x80);
delay(5);
E = 0;
return STA7;
}
void Write_order(uchar order) //寫指令
{
while (Test()); //不忙檢測
RS = 0;
RW = 0;
P0 = order;
delay(5);
E = 1;
delay(5);
E = 0;
}
void Write_data(uchar dat) //寫數據
{
while (Test()); //不忙檢測
RS = 1;
RW = 0;
P0 = dat;
delay(5);
E = 1;
delay(5);
E = 0;
}
uchar Read_order() //讀指令
{
uchar order = 0;
while (Test()); //不忙檢測
P0 = 0xff;
RS = 0;
RW = 1;
delay(5);
E = 1;
delay(5);
order = P0;
E = 0;
return order;
}
uchar Read_data() //讀數據
{
uchar dat = 0;
while (Test()); //不忙檢測
RS = 1;
RW = 1;
delay(5);
E = 1;
delay(5);
dat = P0;
E = 0;
return dat;
}
void Init_1602()
{
uchar i = 0;
Write_order(0x38);
Write_order(0x0f);
Write_order(0x80); //地址
i = 0;
while (table0 != '\0')
{
Write_data(table0);
i++;
}
Write_order(0x80 + 0x40); //地址
i = 0;
while (table1 != '\0')
{
Write_data(table1);
i++;
}
}
void Write_tem(float tem) //寫溫度
{
Write_order(0x80 + 0x46);
Write_data(0x30 + (uint)tem / 100);
Write_data(0x30 + (uint)tem / 10 % 10);
Write_data(0x30 + (uint)tem % 10);
Write_data('.');
Write_data(0x30 + (uint)(tem * 10) % 10);
Write_data(0x30 + (uint)(tem * 100) % 10);
Write_data(0xdf);//.
Write_data('C');
Write_order(0x0c);
}
float Read_rang_low() //讀最小溫度范圍
{
uchar num0 = 0;
uchar num1 = 0;
uchar num2 = 0;
Write_order(0x80 + 6);
Read_order();
num0 = Read_data() % 16;
Write_order(0x80 + 7);
Read_order();
num1 = Read_data() % 16;
Write_order(0x80 + 9);
Read_order();
num2 = Read_data() % 16;
return (num0 * 10 + num1 + num2 * 0.1);
}
float Read_rang_high() //讀最大溫度范圍
{
uchar num0 = 0;
uchar num1 = 0;
uchar num2 = 0;
uchar num3 = 0;
Write_order(0x80 + 11);
Read_order();
num0 = Read_data() % 16;
Write_order(0x80 + 12);
Read_order();
num1 = Read_data() % 16;
Write_order(0x80 + 13);
Read_order();
num2 = Read_data() % 16;
Write_order(0x80 + 15);
Read_order();
num3 = Read_data() % 16;
return (num0 * 100 + num1 * 10 + num2 + num3 * 0.1);
}
void Control() //對溫度做相應處理
{
if (Get_DS() <= Read_rang_high()
&& Get_DS() >= Read_rang_low())
{
Hot = 0;
Feng = 1;
Alarm = 1;
}
if (Get_DS() >= Read_rang_high())//溫度高,開降溫
{
Feng = 0;
Hot = 0;
Alarm = 0;
delay(100);
Alarm = 1;
delay(100);
}
if (Get_DS() <= Read_rang_low())//溫度低,開加熱
{
Feng = 1;
Hot = 1;
Alarm = 0;
delay(100);
Alarm = 1;
delay(100);
}
}
|