51单片机 lcd1602显示问题

在用51单片机时出现一个问题,设置按键用来切换lcd的显示界面 现在可以显示内容 就是按键设置的时候只能切换一个界面是怎么回事呢?
以下是代码:

LcdWriteCom(0x01);
        LCDWrite_String(0, 0, "Set PH L:");
        while(state==1)
        {
            if(K1==0)
            {
                state++;
                while(K1==0);
            }    

            if(K2==0)
            {
                war=war+1;
                if(war>=14)
                war=14;
                while(K2==0);
            }    
            
            if(K3==0)
            {
                war=war-1;
                if(war<=1)
                war=1;
                while(K3==0);
            }        
    
            LcdWriteCom(0xC0+6);    
            LcdWriteData('0'+war/10%10);
            LcdWriteData('0'+war%10);
        }


        LcdWriteCom(0x01);
        LCDWrite_String(0, 0, "Set PH H:");
        while(state==2)
        {
            if(K1==0)
            {
                state=3;
                while(K1==0);
            }    

            if(K2==0)
            {
                war2=war2+1;
                if(war2>=14)
                war2=14;
                while(K2==0);
            }    
            
            if(K3==0)
            {
                war2=war2-1;
                if(war2<=1)
                war2=1;
                while(K3==0);
            }        
    
            LcdWriteCom(0xC0+6);    
            LcdWriteData('0'+war2/10%10);
            LcdWriteData('0'+war2%10);
        }

结合ChatGPT部分内容参考给出建议:
你的代码中只有两个状态(state==1和state==2),因此只能切换两个界面。要实现切换多个界面,需要增加状态的数量,并在每个状态下设置不同的显示内容和按键响应。以下是一个示例代码,其中有三个状态(state==1、state==2和state==3),分别对应不同的显示内容和按键响应:

LcdWriteCom(0x01);
LCDWrite_String(0, 0, "Set PH L:");
while(state==1)
{
    if(K1==0)
    {
        state++;
        while(K1==0);
    }    

    if(K2==0)
    {
        war=war+1;
        if(war>=14)
        war=14;
        while(K2==0);
    }    

    if(K3==0)
    {
        war=war-1;
        if(war<=1)
        war=1;
        while(K3==0);
    }        

    LcdWriteCom(0xC0+6);    
    LcdWriteData('0'+war/10%10);
    LcdWriteData('0'+war%10);
}


LcdWriteCom(0x01);
LCDWrite_String(0, 0, "Set PH H:");
while(state==2)
{
    if(K1==0)
    {
        state++;
        while(K1==0);
    }    

    if(K2==0)
    {
        war2=war2+1;
        if(war2>=14)
        war2=14;
        while(K2==0);
    }    

    if(K3==0)
    {
        war2=war2-1;
        if(war2<=1)
        war2=1;
        while(K3==0);
    }        

    LcdWriteCom(0xC0+6);    
    LcdWriteData('0'+war2/10%10);
    LcdWriteData('0'+war2%10);
}


LcdWriteCom(0x01);
LCDWrite_String(0, 0, "Set PH T:");
while(state==3)
{
    if(K1==0)
    {
        state=1;
        while(K1==0);
    }    

    if(K2==0)
    {
        war3=war3+1;
        if(war3>=14)
        war3=14;
        while(K2==0);
    }    

    if(K3==0)
    {
        war3=war3-1;
        if(war3<=1)
        war3=1;
        while(K3==0);
    }        

    LcdWriteCom(0xC0+6);    
    LcdWriteData('0'+war3/10%10);
    LcdWriteData('0'+war3%10);
}

在这个示例代码中,增加了一个状态(state==3),并在该状态下设置了不同的显示内容和按键响应。当按下K1键时,状态会从state==3切换到state==1,从而实现了多个界面的切换。你可以根据需要增加更多的状态和相应的显示内容和按键响应。

不太明白只能切换一个界面是什么意思。
是界面1切换到界面2,界面2切不回来界面1吗?如果想要从界面2切换回界面1,则需要把state=3改完state=1;
另外多个条件可以用Switch语句来判断条件,增强代码的可读性。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7485763
  • 这篇博客你也可以参考下:51单片机开发板lcd1602不显示字符问题
  • 除此之外, 这篇博客: 51单片机 | LCD1602 液晶显示实验中的 三、软件设计 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •   本节所要实现的功能是:在 LCD1602 液晶上显示字符信息。
      程序框架如下:

    • 编写公共文件
      打开public.c,代码如下:

      #include "public.h"
      
      /*
      函 数 名 : delay_10us
      函数功能 : 延时函数,ten_us=1 时,大约延时 10us
      输 入 : ten_us
      输 出 : 无
      */
      void delay_10us(u16 ten_us)
      {
      	while(ten_us--);
      }
      
      /*
      函 数 名 : delay_ms
      函数功能 : ms 延时函数,ms=1 时,大约延时 1ms
      输 入 : ten_us
      输 出 : 无
      */
      void delay_ms(u16 ms)
      {
      	u16 i,j;
      	for (i=ms;i>0;i--)
      	{
      		for (j=110;j>0;j--);
      	}
      }
      

      其头文件public.h

      /*
      头文件作用如下:包含头文件,定义全局变量,声明函数
      */
      #ifndef _public_H
      #define _public_H
      
      #include "reg52.h"
      
      //对系统默认数据类型进行重定义 
      typedef unsigned char u8;
      typedef unsigned int u16;
      
      //函数声明
      void delay_10us(u16 ten_us);
      void delay_ms(u16 ms);
      
      
      #endif
      
    • 编写 LCD1602 显示函数

    • 编写主函数

  • 您还可以看一下 朱有鹏老师的LCD1602和12864显示器-第1季第17部分课程中的 1.17.5.LCD1602控制器的低层时序2小节, 巩固相关知识点
#include "public.h"
 
/*
函 数 名 : delay_10us
函数功能 : 延时函数,ten_us=1 时,大约延时 10us
输 入 : ten_us
输 出 : 无
*/
void delay_10us(u16 ten_us)
{
    while(ten_us--);
}
 
/*
函 数 名 : delay_ms
函数功能 : ms 延时函数,ms=1 时,大约延时 1ms
输 入 : ten_us
输 出 : 无
*/
void delay_ms(u16 ms)
{
    u16 i,j;
    for (i=ms;i>0;i--)
    {
        for (j=110;j>0;j--);
    }
}