51单片机按键实现lcd1602界面切换不同功能函数

我想通过按键切换lcd1602显示不同的界面,比如按key1的话lcd1602就会显示温湿度的界面,按key2的话显示光照的界面,按key3显示土壤湿度的界面。


u8 keyflag()
{
        if(K1==0)
        {
            delay_ms(1000);
            if(K1==0)
            {
                    return 1;
            }while(K1==0);
        }
        if(K2==0)
        {
            delay_ms(1000);
            if(K2==0)
            {
                    return 2;
            }while(K2==0);
        }
        if(K3==0)
        {
            delay_ms(1000);
            if(K3==0)
            {
                    return 3;
            }while(K3==0);
        }
        if(K4==0)
        {
            delay_ms(1000);
            if(K4==0)
            {
                return 4;
            }while(K4==0);
        }
        
        return 0;
}
void Scankey()
{
        u8 temp=0;
        while(1)
        {
                temp=keyflag();
            switch(temp)
            {
                case 1:
                    ds1302function();
                break;
                case 2:
                    dht11_function();
                break;
                case 3:
                     illumi_fun();
                break;
                case 4:
                    yl69function();
                default :
                    break;
            
            }
        }
        
}
void main()
    
{
    lcd1602_init();
        while(1)
        {
                keyflag();
                Scankey();
        }

}

上面是我的代码
出现的实现现象不符合我的要求;
首先是每一个模块都可以单独的在lcd1602上面显示,但是按键只有一次有效也就是说,我按key1的时候,lcd上会显示当前的界面,此时我在按key2,界面并没有改变,而按key3也是;但是当我重新烧入的时候按key2键会显示key2对应的界面,而按别的又会没有效果;我想问一下是什么原因?
我都是一个模块一个模块显示成功集成好的,实在不懂是什么原因?毕设这一关过不了,毕设就没有办法完成啦?

不要滥用无限循环否则影响其他执行,主函数已经循环执行Scankey()函数,Scankey()函数内就不该再用无限循环不结束。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^