找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1222|回复: 2
打印 上一主题 下一主题
收起左侧

问题:如何将LCD1602第二在修改High值后Low的值不会自动移动位置,Low:-9之后不会...

[复制链接]
跳转到指定楼层
楼主
问题:如何将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;
             }
   }
}


修改High之前.jpg (38.61 KB, 下载次数: 82)

修改High之前.jpg

修改High之后.jpg (49.77 KB, 下载次数: 61)

修改之后

修改之后
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:742007 发表于 2020-5-2 09:30 | 只看该作者
这个是仅仅修改High之之后Low会自动缩进产生乱码
回复

使用道具 举报

板凳
ID:462827 发表于 2020-5-3 01:00 | 只看该作者
sprintf生成字符串时指定数值的显示宽度就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表