1、LCD数字温度计代码LCD数字温度计代码 /* 1602A液晶屏驱动程序* 晶 振 频 率:11.0592M* 作者:王勋*QQ:249521710*主页:*/#include <reg51.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned inttypedef unsigned char byte;typedef unsigned int word;sbit DQ = P30;unsigned char minus_flag=0;unsigned char ten,one,dot
2、1,dot2;void Read_Temperature(void);sbit LCM_E=P11;/定义接口sbit LCM_RW=P10;sbit LCM_RS=P12;#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
3、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写数据/*输入参数:要写入的数据
4、/*输出参数:无/*调用模块:/*/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,
5、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;retur
6、n(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)/*函数功能:160
7、2A初始化/*输入参数:无/*输出参数:无/*调用模块:/*/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_Write
8、Command(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不能大于1if (Y)
9、 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
10、 code *DData)uchar ListLength;ListLength = 0;Y &= 0x1;X &= 0xF;/限制X不能大于15,Y不能大于1while (DDataListLength>0x20)/若到达字串尾则退出if (X <= 0xF)/X坐标应小于0xFDisplayOneChar(X, Y, DDataListLength);/显示单个字符ListLength+;X+;/*5ms延时函数*/*函数原型:void Delay5Ms(void)/*函数功能:5ms延时/*输入参数:无/*输出参数:无/*调用模块:/* */void Dela
11、y5Ms(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驱动程序,供调用*/* 函数名: de
12、lay* 描 述: 软件延时,* 输 入: 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
13、for end of timeslotreturn(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 timeslotDQ = 1; / then return highdelay(0);if(
14、DQ)value|=0x80;delay(5); / wait for rest of timeslotreturn(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 timeslotDQ = val&0x01;delay(7); / hold v
15、alue for remainder of timeslot DQ = 1;val=val/2;delay(5);/* 函数名: Read_Temperature* 描 述: 从DS18B20读取16进制温度值* 输 入: 无* 返 回: 未经处理的16bits,1 6进制温度值*/void Read_Temperature(void) byte c2;unsigned int temperature;ow_reset();ow_write_byte(0xCC); / Skip ROMow_write_byte(0xBE); / Read Scratch Padc0=ow_read_byte(
16、); / low 8 bit hexc1=ow_read_byte(); /high 8 bit hexow_reset();ow_write_byte(0xCC); /Skip ROMow_write_byte(0x44); / Start Conversionif(c1 & 0xFC)minus_flag=1;temperature=(c1<<8)| c0);temperature=(temperature)+1);temperature*=0.0625;elseminus_flag=0;temperature=(c1<<8)| c0) *(0.0625*1
17、00);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);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1