微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新人想问一下关于1602多级菜单显示的东西

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

时间:10-02 整理:3721RD 点击:
#include<reg51.h>
#include<intrins.h>       
#include"lcd.h"


sbit k1=P1^0;
sbit k2=P1^1;
sbit 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文件。就看主程序的话为什么不能实现按第一个键进入第一个菜单,按第二个键入第二个按第三个返回呢?

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

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


sbit k1=P1^0;
sbit k2=P1^1;
sbit 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);
         }
}       

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top