|
图 下面传代码
#include <reg51.h>
#include "LCD1602.h"
#include "temp.h"
unsigned char datas[9]; //定义数组
unsigned char *TempDisplay(int);
void Delay100ms(unsigned int t);
void Delay100ms(unsigned int t) //@12.000MHz
{
unsigned char i, j;
i = 195;
j = 138;
do
do
{
while (--j);
} while (--i);
while(--t);
}
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void main()
{
bit k;
LcdInit(); //初始化LCD1602
LCD_disp_string(2,0,"thermometer");
while(1)
{
Delay100ms(8);//1s钟刷一次
k = ~k;
if(k) LCD_disp_char(2,0,'T');
else LCD_disp_char(2,0,'t');
TempDisplay(Ds18b20ReadTemp());
LCD_disp_string(4,1,datas);
}
}
/*******************************************************************************
* 函数名 : LcdDisplay()
* 函数功能 : LCD显示读取到的温度
* 输入 : v
* 输出 : 无
*******************************************************************************/
unsigned char *TempDisplay(int temp) //lcd显示
{
unsigned char dat[5],i=0;
bit fu;
float tp;
if(temp< 0) //当温度值为负数
{
fu = 1;
//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
temp=temp-1;
temp=~temp;
}
else
{
fu = 0;
}
tp=temp;
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算由?.5,还是在小数点后面。
dat[0] = temp / 10000;
dat[1] = temp % 10000 / 1000;
dat[2] = temp % 1000 / 100;
dat[3] = temp % 100 / 10;
dat[4] = temp % 10;
if(fu) datas[i++] = '-';
if(dat[0]) datas[i++] = dat[0] + '0';
if(dat[1] || (i-(unsigned char)fu)) datas[i++] = dat[1] + '0';
datas[i++] = dat[2] + '0';
datas[i++] = '.';
datas[i++] = dat[3] + '0';
datas[i++] = dat[4] + '0';
datas[i++] = 0xdf;
datas[i++] = 'C';
while(i<=7) datas[i++] = ' ';
datas[i++] = 0x00;
return datas;
}
#include "LCD1602.h"
//void LCD_init(void)
//{
// LCD_delay_10us(20);
// LCD_write_command(0x38); // - - ??8???,2?,5x7
// LCD_delay_10us(5);
// LCD_write_command(0x0c); // - - ????,???,???
// LCD_delay_10us(5);
// LCD_write_command(0x06); // - - ??????,?????
// LCD_delay_10us(5);
// LCD_write_command(0x01); // - - ??????
// LCD_delay_50us(40);
//}
/*******************************************************************************
* 函 数 名 : Lcd1602_Delay1ms
* 函数功能 : 延时函数,延时1ms
* 输 入 : c
* 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //误差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
void LCD_delay_50us() //@12.000MHz
{
unsigned char i;
_nop_();
i = 22;
while (--i);
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom
* 函数功能 : 向LCD写入一个字节的命令
* 输 入 : com
* 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 0; //选择写入命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
// Lcd1602_Delay1ms(1);
LCD1602_DATAPINS = com << 4; //发送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名 : LcdWriteData
* 函数功能 : 向LCD写入一个字节的数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择写入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //写入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名 : LcdInit()
* 函数功能 : 初始化LCD屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //开显示
Lcd1602_Delay1ms(20);
LcdWriteCom(0x38); //开显示
Lcd1602_Delay1ms(5);
LcdWriteCom(0x0c); //开显示不显示光标
Lcd1602_Delay1ms(5);
LcdWriteCom(0x06); //写一个指针加1
Lcd1602_Delay1ms(5);
LcdWriteCom(0x01); //清屏
Lcd1602_Delay1ms(40);
LcdWriteCom(0x80); //设置数据指针起点
}
#else
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x32); //将8位总线转为4位总线
Lcd1602_Delay1ms(20);
LcdWriteCom(0x28); //在四位线下的初始?
Lcd1602_Delay1ms(5);
LcdWriteCom(0x0c); //开显示不显示光标
Lcd1602_Delay1ms(5);
LcdWriteCom(0x06); //写一个指针加1
Lcd1602_Delay1ms(5);
LcdWriteCom(0x01); //清屏
Lcd1602_Delay1ms(40);
LcdWriteCom(0x80); //设置数据指针起点
}
#endif
void LCD_set_xy(uchar x,uchar y)
{
uchar address;
if(y==0)
{
address=0x80+x; // - - ?????
}
else if(y==1)
{
address=0xc0+x; // - - ?????
}
LCD_delay_50us();
LcdWriteCom(address);
}
// - - ????????
void LCD_disp_char(uchar x,uchar y,uchar dat) // - - LCD_disp_char(0,1,0x38); // - - ??8
{
LCD_set_xy(x,y);
LCD_delay_50us();
LcdWriteData(dat);
}
// - - ?????????
void LCD_disp_string(uchar x,uchar y,uchar *s)
{
LCD_set_xy(x,y);
LCD_delay_50us();
while(*s!='\0')
{
LcdWriteData(*s);
s++;
}
}
//********************************
/*******?????*************
void LCD_check_busy() //????,???LCD1602?,??????????,?
{ //????????LCD????????????????
do //???????,???????????????,?
{ LCD_E=0; //for?????,??????1???????????
LCD_RS=0; //??200????????
LCD_RW=1;
LCD_DB=0xff;
LCD_E=1;
}while(LCD_DB^7==1);
}
******************************/
篇幅问题 其余程序在附件内
|
|