|
问题:如何将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;
}
}
}
|
|