|
微信圖片_20180611192449.jpg (554.79 KB, 下載次數(shù): 39)
下載附件
圖
2018-6-11 19:25 上傳
123.png (55.17 KB, 下載次數(shù): 34)
下載附件
2018-6-11 19:26 上傳
圖 下面?zhèn)鞔a
#include <reg51.h>
#include "LCD1602.h"
#include "temp.h"
unsigned char datas[9]; //定義數(shù)組
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);
}
/*******************************************************************************
* 函數(shù)名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸入 : 無
* 輸出 : 無
*******************************************************************************/
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);
}
}
/*******************************************************************************
* 函數(shù)名 : LcdDisplay()
* 函數(shù)功能 : LCD顯示讀取到的溫度
* 輸入 : v
* 輸出 : 無
*******************************************************************************/
unsigned char *TempDisplay(int temp) //lcd顯示
{
unsigned char dat[5],i=0;
bit fu;
float tp;
if(temp< 0) //當(dāng)溫度值為負(fù)數(shù)
{
fu = 1;
//因為讀取的溫度是實際溫度的補(bǔ)碼,所以減1,再取反求出原碼
temp=temp-1;
temp=~temp;
}
else
{
fu = 0;
}
tp=temp;
temp=tp*0.0625*100+0.5;
//留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
//后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
//算由?.5,還是在小數(shù)點后面。
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);
//}
/*******************************************************************************
* 函 數(shù) 名 : Lcd1602_Delay1ms
* 函數(shù)功能 : 延時函數(shù),延時1ms
* 輸 入 : c
* 輸 出 : 無
* 說 名 : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時。
*******************************************************************************/
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);
}
/*******************************************************************************
* 函 數(shù) 名 : LcdWriteCom
* 函數(shù)功能 : 向LCD寫入一個字節(jié)的命令
* 輸 入 : com
* 輸 出 : 無
*******************************************************************************/
#ifndef LCD1602_4PINS //當(dāng)沒有定義這個LCD1602_4PINS時
void LcdWriteCom(uchar com) //寫入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //選擇發(fā)送命令
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定
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; //發(fā)送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數(shù) 名 : LcdWriteData
* 函數(shù)功能 : 向LCD寫入一個字節(jié)的數(shù)據(jù)
* 輸 入 : dat
* 輸 出 : 無
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat) //寫入數(shù)據(jù)
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇輸入數(shù)據(jù)
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //寫入時序
Lcd1602_Delay1ms(5); //保持時間
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat) //寫入數(shù)據(jù)
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇寫入數(shù)據(jù)
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
/*******************************************************************************
* 函 數(shù) 名 : LcdInit()
* 函數(shù)功能 : 初始化LCD屏
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
#ifndef LCD1602_4PINS
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //開顯示
Lcd1602_Delay1ms(20);
LcdWriteCom(0x38); //開顯示
Lcd1602_Delay1ms(5);
LcdWriteCom(0x0c); //開顯示不顯示光標(biāo)
Lcd1602_Delay1ms(5);
LcdWriteCom(0x06); //寫一個指針加1
Lcd1602_Delay1ms(5);
LcdWriteCom(0x01); //清屏
Lcd1602_Delay1ms(40);
LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點
}
#else
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x32); //將8位總線轉(zhuǎn)為4位總線
Lcd1602_Delay1ms(20);
LcdWriteCom(0x28); //在四位線下的初始?
Lcd1602_Delay1ms(5);
LcdWriteCom(0x0c); //開顯示不顯示光標(biāo)
Lcd1602_Delay1ms(5);
LcdWriteCom(0x06); //寫一個指針加1
Lcd1602_Delay1ms(5);
LcdWriteCom(0x01); //清屏
Lcd1602_Delay1ms(40);
LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點
}
#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);
}
******************************/
篇幅問題 其余程序在附件內(nèi)
|
-
-
程序.7z
2018-6-11 19:30 上傳
點擊文件名下載附件
35.57 KB, 下載次數(shù): 2
|