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