LCD1602数字温度计代码

/******************************************************************
** 1602A液晶屏驱动程序
** 晶 振 频 率:11.0592M
** 作者:王勋
**QQ:249521710
**主页:https://www.360docs.net/doc/8116115330.html,/249521710
******************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int


typedef unsigned char byte;
typedef unsigned int word;
sbit DQ = P3^0;

unsigned char minus_flag=0;
unsigned char ten,one,dot1,dot2;
void Read_Temperature(void);



sbit LCM_E=P1^1;//定义接口
sbit LCM_RW=P1^0;
sbit LCM_RS=P1^2;
#define LCM_Data P0//数据接口
void LCM_WriteData(uchar WDLCM);
void LCM_WriteCommand(uchar WCLCM,BuysC);
uchar LCM_ReadData(void);
uchar LCM_ReadStatus(void);
void LCM_Init(void);
void DisplayOneChar(uchar X, uchar Y, uchar DData);
void DisplayListChar(uchar X, uchar Y, uchar code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
uchar code uctech[] = {"1602A"};
uchar code net[] = {"Temperature_of_N"};
uchar code digit[] = {"0"};

/****************************1602A写数据函数**************************/
/*函数原型:void LCM_WriteData(uchar WDLCM)
/*函数功能:1602A写数据
/*输入参数:要写入的数据
/*输出参数:无
/*调用模块:

/**********************************************************************/
void LCM_WriteData(uchar WDLCM)
{
LCM_ReadStatus();//检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0;//若晶振速度太高可以在这后加小的延时
LCM_E = 0;//延时
LCM_E = 1;
}
/****************************1602A写指令函数**************************/
/*函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC)
/*函数功能:1602A写指令
/*输入参数:要写入的指令
/*输出参数:无
/*调用模块:

/**********************************************************************/
void LCM_WriteCommand(uchar WCLCM,BuysC)//BuysC为0时忽略忙检测
{
if (BuysC) LCM_ReadStatus();//根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/****************************1602A读数据函数**************************/
/*函数原型:uchar LCM_ReadData(void)
/*函数功能:1602A读数据
/*输入参数:无
/*输出参数:1602A返回的数据
/*调用模块:

/**********************************************************************/
uchar LCM_ReadData(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
/****************************1602A读状态函数**************************/
/*函数原型:uchar LCM_ReadData(void)
/*函数功能:1602A读状态
/*输入参数:无
/*输出参数:1602A返回的状态
/*调用模块:

/**********************************************************************/
uchar

LCM_ReadStatus(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & 0x80);//检测忙信号
return(LCM_Data);
}
/****************************1602A初始化函数**************************/
/*函数原型:void LCM_Init(void)
/*函数功能:1602A初始化
/*输入参数:无
/*输出参数:无
/*调用模块:

/**********************************************************************/
void LCM_Init(void)
{
LCM_Data = 0;
LCM_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号
Delay5Ms();
LCM_WriteCommand(0x38,0);
Delay5Ms();
LCM_WriteCommand(0x38,0);
Delay5Ms();

LCM_WriteCommand(0x38,1);//显示模式设置,开始要求每次检测忙信号
LCM_WriteCommand(0x08,1);//关闭显示
LCM_WriteCommand(0x01,1);//显示清屏
LCM_WriteCommand(0x06,1);// 显示光标移动设置
LCM_WriteCommand(0x0C,1);// 显示开及光标设置
}
/******************1602A按指定位置显示一个字符函数**********************/
/*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示的字符
/*输出参数:无
/*调用模块:

/**********************************************************************/
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Y &= 0x1;
X &= 0xF;//限制X不能大于15,Y不能大于1
if (Y) X |= 0x40;//当要显示第二行时地址码+0x40;
X |= 0x80;// 算出指令码
LCM_WriteCommand(X, 0);//这里不检测忙信号,发送地址码
LCM_WriteData(DData);
}
/*******************1602A按指定位置显示一串字符函数*********************/
/*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
/*函数功能:1602A按指定位置显示一个字符
/*输入参数:X坐标 Y坐标 要显示字符串的首地址
/*输出参数:无
/*调用模块:

/**********************************************************************/
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{
uchar ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF;//限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20)//若到达字串尾则退出
{
if (X <= 0xF)//X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符
ListLength++;
X++;
}
}
}
/********************5ms延时函数************************/
/*函数原型:void Delay5Ms(void)
/*函数功能:5ms延时
/*输入参数:无
/*输出参数:无
/*调用模块:

/*********************************************************************

*/
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
/********************400ms延时延时函数************************/
/*函数原型:void Delay400Ms(void)
/*函数功能:400ms延时延时
/*输入参数:无
/*输出参数:无
/*调用模块:

/**********************************************************************/
void Delay400Ms(void)
{
uchar TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}

////////////////////////////////////////////////////
//温度程序
///////////////////////////////////////////////////


/**************************************************
* 文件名: ds1820.c
* 描 述: ds1820驱动程序,供调用
**************************************************/
/**************************************************
* 函数名: delay
* 描 述: 软件延时,
* 输 入: ticks,不同的晶体需要调整
* 返 回: 无
* 备 注: 本软件适用于11.0592MHz晶振
**************************************************/
void delay(word ticks)
{ for(;ticks>0;ticks--); }
/**************************************************
* 函数名: ow_reset
* 描 述: one wire bus单线总线的复位
* 输 入: 无
* 返 回: 1 bit, ow器件不存在出1;器件正常出0;
**************************************************/
bit ow_reset(void)
{ bit presence;
DQ = 0;
delay(29);
DQ = 1;
delay(3);
presence = DQ;
delay(25); // wait for end of timeslot
return(presence); // presence signal returned
}
/**************************************************
* 函数名: ow_read_byte
* 描 述: 从one wire总线读出一个字节
* 输 入: 无
* 返 回: 从one wire总线读出的字节
**************************************************/
byte ow_read_byte(void)
{ byte i; byte value = 0;
for (i=8;i>0;i--)
{ value>>=1;
DQ = 0; // pull DQ low to start timeslot
DQ = 1; // then return high
delay(0);
if(DQ)value|=0x80;
delay(5); // wait for rest of timeslot
}
return(value);
}
/**************************************************
* 函数名: ow_write_byte
* 描 述: 向one wire总线送出一个字节
* 输 入: 要写入的字节
* 返 回: 无
**************************************************/
void ow_write_byte(char val)
{ byte i;
for (i=8; i>0; i--) // writes byte, one bit at a time
{ DQ = 0; // pull DQ low to start timeslot
DQ = val&0x01;
delay(7); // hold value for remainder of timeslot
DQ = 1;
val=val/2;
}
delay(5);
}
/**************************************************
* 函数名: Read_Temperature
* 描 述: 从DS18B20读取16进制温度值
* 输 入: 无
* 返 回: 未经处理的16bits,1

6进制温度值
**************************************************/
void Read_Temperature(void)
{ byte c[2];
unsigned int temperature;
ow_reset();
ow_write_byte(0xCC); // Skip ROM
ow_write_byte(0xBE); // Read Scratch Pad
c[0]=ow_read_byte(); // low 8 bit hex
c[1]=ow_read_byte(); //high 8 bit hex
ow_reset();
ow_write_byte(0xCC); //Skip ROM
ow_write_byte(0x44); // Start Conversion


if(c[1] & 0xFC){
minus_flag=1;
temperature=((c[1]<<8)| c[0]);
temperature=((~temperature)+1);
temperature*=0.0625;
}else{
minus_flag=0;
temperature=((c[1]<<8)| c[0]) *(0.0625*100);
ten=temperature/1000; //十位
one=temperature/100%10;//个位
dot1=temperature%100/10;//十分位
dot2=temperature%100%10;//百分位
}

}



void main(void)
{
Delay400Ms();//启动等待,等LCM讲入工作状态
LCM_Init();//LCM初始化
Delay5Ms();//延时片刻(可不要)



DisplayListChar(0, 0, net);
DisplayListChar(0, 1,"ow_is:");
LCM_ReadData();//测试用句无意义
LCM_Data=255;

while(1){
Read_Temperature();
DisplayOneChar(6,1,0x30+ten);
DisplayOneChar(7,1,0x30+one);
DisplayOneChar(8,1,'.');
DisplayOneChar(9,1,0x30+dot1);
DisplayOneChar(10,1,0x30+dot2);
DisplayOneChar(11,1,0xdf);
DisplayOneChar(12,1,0x43);

}

}

相关文档
最新文档