单片机/MCUwilliam hill官网
直播中

王撒的

7年用户 5经验值
擅长:可编程逻辑
私信 关注
[问答]

新人想问一下关于1602多级菜单显示的东西

#include
#include       
#include"lcd.h"




***it k1=P1^0;
***it k2=P1^1;
***it k3=P1^2;







typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

static      flag =3;                   //标记
void delay(u16 i)                           //延时
{

        while(i--);       
}




void menu0 ()                                                              
{       

    Lcd1602_Write_Cmd(0x01);
        LcdShowStr(0,0," welcome ")        ;
       


}          

void menu1 ()                                                    
{       
    Lcd1602_Write_Cmd(0x01);

        LcdShowStr(0,0," nihao ") ;
       
       
}

void keyvalue()
{
if(k1==0)
    {
        delay(1000);
          if(k1==0)
          {
       flag=0;
           }
    }
         else
         {
          flag=3;
         }
     while(!k1);


    if(k2==0)

     {
         delay(1000) ;
         if(k2==0)
          {
             flag=1;
          }
     }
          else
         {
          flag=3;
         }
     while(!k2);


}




void key()
{
  keyvalue();
  switch(flag)
  {
   case 0:
   {
      menu0();
          if(k3==0)
             {
            delay(1000);
                if(k3==0)
                {
          flag=3 ;
                }
       }

      while(!k3);
          break;
   }


   case 1:
   {
        menu1();
        if(k3==0)
           {
                     delay(1000);
                         if(k3==0)
                         {
             flag=3 ;
                         }   
           }
          while(!k3);
                  break;
   }
   case 3:
   {
     u8 i;
    for(;i<10;i++)
              {
                Lcd1602_Write_Data('C');
              }
        break;
   }
  }
}

          





void main(void)
{


        InitLcd1602();
        while(1)
         {
          key();
         }

}       





这是我写的一个程序,没有加lcd.h文件。就看主程序的话为什么不能实现按第一个键进入第一个菜单,按第二个键入第二个按第三个返回呢?

回帖(2)

人中狼

2017-4-18 11:15:16
flag赋值错了,你现在可能的情况是,按下第一个键,flag赋了对应的值,检测到按键释放才退出扫键程序,显示第一个菜单,显示完后又开始扫键,这时没有按键按下,flag=3,退出扫键程序,进行显示,估计你现在是一直显示字符C吧,不过没看到显示地址的设置命令,所以不确定你现在显示什么。flag的赋值条件判断有问题。
举报

王撒的

2017-4-19 16:22:27
引用: 人中狼 发表于 2017-4-18 11:15
flag赋值错了,你现在可能的情况是,按下第一个键,flag赋了对应的值,检测到按键释放才退出扫键程序,显示第一个菜单,显示完后又开始扫键,这时没有按键按下,flag=3,退出扫键程序,进行显示,估计你现在是一直显示字符C吧,不过没看到显示地址的设置命令,所以不确定你现在显示什么。flag的赋值条件判断有问题。 ...

改好了,谢谢大神orz。我的switch语句有问题所以显示有问题的#include
#include       
#include"lcd.h"




***it k1=P1^0;
***it k2=P1^1;
***it k3=P1^2;







typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
     
static    int  flag =0;                   //标记
void delay(u16 i)                           //延时
{
   
        while(i--);       
}



void menu0 ()
{
     Lcd1602_Write_Cmd(0x01);
        LcdShowStr(0,0," hello ")        ;
         delay(1000);
}


void menu1 ()                                                              
{       
   
    Lcd1602_Write_Cmd(0x01);
        LcdShowStr(0,0," welcome ")        ;
         delay(1000);
}          

void menu2 ()                                                    
{       
    Lcd1602_Write_Cmd(0x01);

        LcdShowStr(0,0," nihao ") ;
       
         delay(1000);
}


void keyscan()
{
if(k1==0)
   {
      delay(1000);
           if(k1==0)
                {
                  flag=1;
                }
          
        }

  if(k2==0)
   {
      delay(1000);
           if(k2==0)
                {
                  flag=2;
                }
       
        }
   if(k3==0)
   {
      delay(1000);
           if(k3==0)
                {
                  flag=0;
                }
          
        }
}

void menu()
{
keyscan();

switch(flag)
  {
   case 0:
   {
           menu0();
   }
   break;
   case 1:
   {
           menu1();
         break;

   }
   case 2:
   {
           menu2();
        break;
       
   }


  }
}







void main(void)
{


        InitLcd1602();
        while(1)
         {
          
          menu();

          delay(5000);
         }

}       
举报

更多回帖

发帖
×
20
完善资料,
赚取积分