|
問(wèn)題:如何將LCD1602第二在修改High值后Low的值不會(huì)自動(dòng)移動(dòng)位置,Low:-9之后不會(huì)產(chǎn)生亂碼,在這個(gè)代碼基礎(chǔ)上怎么修改可以實(shí)現(xiàn)
#include <reg52.h>
#include <stdio.h>
#define DATA_PORT P0 //數(shù)據(jù)口
#define uchar unsigned char
#define uint unsigned int
int temp = 0; //存儲(chǔ)溫度
int tempOver = 00; //過(guò)溫溫度
int tempLow = -9; //低溫溫度
sbit key1 = P3^0; //增加過(guò)溫溫度
sbit key2 = P3^1; //減小過(guò)溫溫度
sbit key3 = P3^2; //增加低溫溫度
sbit key4 = P3^3; //減小低溫溫度
uint key_result = 0; //保存按鍵結(jié)果
int biaozhi;
//引腳定義
sbit du=P2^6;
sbit we=P2^7;
sbit RS=P3^5; //數(shù)據(jù)(低)/命令(高)選擇引腳
sbit LCDRW=P3^6; //寫,低電平有效
sbit EN=P3^4; //使能,低電平有效
sbit beep=P2^3;
char Display1[16]; //第一行顯示數(shù)組
char Display2[16]; //第二行顯示數(shù)組
void key_delay(uchar t)
{
int j;
for(;t!=0; t--)
for (j=0;j<255;j++);
}
//@@*按鍵檢測(cè) 如果按鍵1被按下就返回1
//如果按鍵2被按下就返回2 如果沒(méi)有按鍵按下就返回0*/
/********************************1602****************************/
void delay_ms(uchar t)
{
int j;
for(;t!=0; t--)
for (j=0;j<255;j++);
}
//--------------------------------------------
// 寫數(shù)據(jù)函數(shù)
//--------------------------------------------
void write_data(char dat)
{
RS=1; //數(shù)據(jù)
DATA_PORT=dat; //把數(shù)據(jù)總到P口
delay_ms(5); //延時(shí)
EN=1;
delay_ms(5); //延時(shí)
EN=0; //關(guān)使能
}
//--------------------------------------------
// 寫命令函數(shù)
//--------------------------------------------
void write_com(char com)
{
RS=0; //命令
DATA_PORT=com;
delay_ms(5); //當(dāng)晶振較高時(shí)加延時(shí)
EN=1;
delay_ms(5); //當(dāng)晶振較高時(shí)加延時(shí)
EN=0;
}
//--------------------------------------------
// 打印函數(shù)函數(shù)
// 第一個(gè)參數(shù)為要打印的字符串 第二個(gè)參數(shù)為要顯示的行
//--------------------------------------------
void print_string(char *str,uchar line){
int i;
//@@*如果line參數(shù)為1則光標(biāo)移到第一行 如果為2則移到第二行*/
if(line == 1)
write_com(0x80); //第一行
else if(line == 2)
write_com(0xc0); //第二行
for(i=0;str[i]!=0;i++)
{
write_data(str[i]);
}
}
//--------------------------------------------
// 1602初始化
//--------------------------------------------
void lcd_init()
{
EN=0;
LCDRW=0;
RS=0;
write_com(0x36); //set text home address
write_com(0x38);
write_com(0x0c); //開(kāi)顯示,不顯示光標(biāo) 0x0f為開(kāi)顯示,開(kāi)光標(biāo)
write_com(0x06); //寫一個(gè)字符后地址加一
write_com(0x01); //顯示清零,數(shù)據(jù)指針清零
write_com(0x80); //第一行
}
//@@*顯示函數(shù)*/
void display(void)
{
char *string1 = "TEM : ";
char *string2 = " C ";
char *string3 = "High:";
char *string4 = "Low:";
//顯示溫度
sprintf((char*)Display1,"%s%d%s",string1,temp,string2);
print_string(Display1,1);
//顯示過(guò)溫低溫點(diǎn)
sprintf((char*)Display2,"%s%d %s%d",string3,tempOver,string4,tempLow);
print_string(Display2,2);
}
/**********************************1602************************************/
/***************************18b20***********************************/
/***************************溫度傳感器信號(hào)引腳******************************************/
sbit DQ=P2^2; //數(shù)據(jù)傳輸線接單片機(jī)的相應(yīng)的引腳
/****************************************************************************
函數(shù)功能:延時(shí)子程序
****************************************************************************/
void delay(uint k)
{
while(k--);
}
/****************************************************************************
函數(shù)功能:DS18B20初始化子程序
****************************************************************************/
void ds18b20_init(void)
{
DQ=1; //DQ先置高
delay(16); //延時(shí)
DQ = 0; //發(fā)送復(fù)位脈沖
delay(80); //延時(shí)(>480us)
DQ = 1; //拉高數(shù)據(jù)線
delay(16); //等待(15~60us)
delay(60);
DQ = 1;
}
/****************************************************************************
函數(shù)功能:向DS18B20讀一字節(jié)數(shù)據(jù)
入口參數(shù):
出口參數(shù):dat
****************************************************************************/
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat=0;
DQ=1;
delay(1);
for (i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
delay(1);
if(DQ)
dat|=0x80;
delay(30);
DQ=1;
}
return dat;
}
/****************************************************************************
函數(shù)功能:向DS18B20寫一字節(jié)數(shù)據(jù)
入口參數(shù):dat
出口參數(shù):
****************************************************************************/
void WriteOneChar(uchar dat)
{
uchar i=0;
DQ=1;
delay(1);
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
}
/****************************************************************************
函數(shù)功能:向DS18B20讀溫度值
入口參數(shù):
出口參數(shù):temperature
溫度讀取流程: 初始化->跳過(guò)讀序列號(hào)->啟動(dòng)溫度轉(zhuǎn)化->延時(shí)->初始化->跳過(guò)讀序列號(hào)->讀取溫度并顯示
****************************************************************************/
float ReadTemperature(void)
{
float temperature = 0.0;
uint temflag = 0;
uint tt = 0;
uchar tempL=0; //臨時(shí)變量低位
uchar tempH=0; //臨時(shí)變量高位
ds18b20_init(); //初始化
WriteOneChar(0xcc); //跳過(guò)讀序列號(hào)的操作
WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
delay(125); //轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí)
ds18b20_init(); //初始化
WriteOneChar(0xcc); //跳過(guò)讀序列號(hào)的操作
WriteOneChar(0xbe); //讀溫度寄存器(頭兩個(gè)值分別為溫度的低位和高位)
tempL=ReadOneChar(); //讀出溫度的低位LSB
tempH=ReadOneChar(); //讀出溫度的高位MSB
//溫度轉(zhuǎn)換,把高低位做相應(yīng)的運(yùn)算轉(zhuǎn)化為實(shí)際溫度
tt = tempH<<8;
tt = tt|tempL;
if(tt&0xf800) //判斷是否是負(fù)溫度
{ //是負(fù)溫度
tt = ~tt + 1; temflag = 0;
}
else
{
tt = tt; temflag = 1;
}
temperature = (float)tt;
temperature = temperature * 0.0625;
// delay(200);
/*負(fù)溫度*/
if(temflag == 0)
{
temperature = -temperature;
}
/*正溫度*/
else
{
temperature = temperature;
}
return temperature; //返回溫度值
}
/************************************18b20*****************************************/
void key_scan(void)
{
//@@*先將按鍵電平拉高*/
key1 = 1;
key2 = 1;
key3 = 1;
key4 = 1;
//@@*檢測(cè)按鍵1是否被按下*/
if(key1 == 0)
{
key_delay(5);
if(key1 == 0)
{
tempOver++;
if(tempOver>85)
{
tempOver=-10;
}
display();
}
}
//@@*檢測(cè)按鍵2是否被按下*/
if(key2 == 0)
{
key_delay(5);
if(key2 == 0)
{
tempOver--;
if(tempOver< -10)
{
tempOver=85;
}
display();
}
}
//@@*檢測(cè)按鍵3是否被按下*/
if(key3 == 0)
{
key_delay(5);
if(key3 == 0)
{
tempLow++;
if(tempLow>85)
{
tempLow=-10;
}
display();
}
}
//@@*檢測(cè)按鍵4是否被按下*/
if(key4 == 0)
{
key_delay(5);
if(key4 == 0)
{
tempLow--;
if(tempLow<-10)
{
tempLow=85;
}
display();
}
}
}
void main()
{
lcd_init();
P0=0xff;
du=we=0; //判斷是否有按鍵被按下,然后調(diào)用THTL函數(shù),
while(1)
{
temp = (int)ReadTemperature(); //讀取溫度
display(); //顯示
key_scan(); //判斷是否有按鍵被按下,然后調(diào)用THTL函數(shù)
//@@*過(guò)溫 蜂鳴器響,*/
if(temp > tempOver)
{
beep=1;
}
// /@@*低溫 蜂鳴器響 */
else if(temp < tempLow)
{
beep=1;
}
}
}
|
|