uch i;
uch value=0; //读出温度
static bit j; for(i=8;i>0;i--)
{ value>>=1; DQ_LOW(); NOP(); NOP(); NOP();
NOP(); //6us DQ_HIGH(); //拉至高电平
NOP(); NOP();
NOP(); //4us
j=DQ; if(j) value|=0x80;
delay(2,7); //63us
} return(value);
}
//-------------------------------------------------
//启动温度转换函数 void get_temp()
{ int i; DQ_HIGH();
reset(); //复位等待从机应答 write_byte(0XCC); //忽略ROM匹配 write_byte(0X44); //发送温度转化命令
for(i=10;i>0;i--)
{
delay(201,132);
}
reset(); //再次复位,等待从机应答 write_byte(0XCC); //忽略ROM匹配 write_byte(0XBE); //发送读温度命令 TLV=read_byte(); //读出温度低8 THV=read_byte(); //读出温度高8位
DQ_HIGH(); //释放总线 TZ=(TLV>>4)|(THV<<4); //温度整数部分
}
//--------------------------------------------------
void LCDdelay()
{
unsigned int i=500;
while(i--) {;} }
/*----------------------------------------------------*/
//状态检查
void CheckState()
{
unsigned int dat;
RW=1; //读状态
DI=0;
TRISB=0xff; //设置口为输入
while(1)
{
E=1; //高电平读数据
dat=PORTB&0x90; //当4、7位为0时为正常状态
E=0;
if(dat==0x00)break;
}
TRISB=0x00; //恢复口为输出
}
/*----------------------------------------------------*/
//写显示数据 //dat:显示数据
void WriteData(unsigned char dat)
{
CheckState();
DI=1; //写数据
RW=0; PORTB=dat;
E=1; E=0; }
/*---------------------------------------------------*/
//写指令
//command:操作LCD的指令 void WriteCommand(unsigned char dat)
{
CheckState();
RW=0; //写指令
PORTB=dat;
E=1; E=0; }
/*---------------------------------------------------*/
//设定页地址----X:0--7
void SetLine(unsigned char line)
{
line=line&0x07; //0<=line<=7
line=line|0xb8; WriteCommand(line);
}
/*---------------------------------------------------*/
//设定列地址----Y:0--63
void SetColumn(unsigned char column)
{
column=column&0x3f; //0<=column<=63
column=column|0x40; WriteCommand(column);
}
/*--------------------------------------------------*/
//设定开始行
void SetStartLine(unsigned char startline)
{
startline=startline&0x3f; //0<=startline<=63
startline=startline|0xc0; WriteCommand(startline);
}
/*--------------------------------------------------*/
//开关显示
//1:开显示 0:关显示
void SetOnOff(unsigned char state)
{
state=state|0x3e; WriteCommand(state);
}
/*--------------------------------------------------*/
//选择屏幕
//screen: 1:左屏 2:右屏
void SlectScreen(unsigned char screen)
{
switch(screen)
{
case 1: CSA=0; CSB=1;//左屏
break; case 2: CSA=1; CSB=0;//右屏
break;
} }
/*--------------------------------------------------*/
//清屏
//screen: 1:左屏 2:右屏
void ClearScreen(unsigned char screen)
{
unsigned char i,j; SlectScreen(screen); for(i=0;i<8;i++)
{ SetLine(i); for(j=0;j<64;j++)
{
WriteData(0x00); WriteData(0x00);
} } }
/*---------------------------------------------------*/
//显示一个16X16的汉字
void Show16X16(unsigned char line,unsigned char column,const unsigned char *pt)
{
unsigned char i,column_temp;
column_temp=column;
SlectScreen(1); //选通左屏 SetColumn(column); //设置起始列
SetLine(line); //设置行
for(i=0;i<16;i++)
{
if(column>=64) //如果列>=64,则选通右屏
{
SlectScreen(2);
column=columnd; //设置右屏起始列
SetColumn(column);
SetLine(line);
}
WriteData(*pt); //写数据
*pt++; column++;
}
SlectScreen(1);
SetLine(line+1); //设置汉字下半部分显示页
column=column_temp; SetColumn(column); for(i=0;i<16;i++)
{
if(column>=64)
{
SlectScreen(2); column=columnd; SetColumn(column); SetLine(line+1);
}
WriteData(*pt);
*pt++; column++;
} }
/*-------------------------------------------------------*/
//显示一个8X16的字符
void Show8X16(unsigned char line,unsigned char column,const unsigned char *pt)
{
unsigned char i,column_temp;
column_temp=column;
SlectScreen(1); //选通左屏 SetColumn(column); //设置起始列
SetLine(line); //设置行
for(i=0;i<8;i++)
{
if(column>=64) //如果列>=64,则选通右屏
{
SlectScreen(2);
column=columnd; //设置右屏起始列
SetColumn(column);
SetLine(line);
}