找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机lcd1602多级菜单的显示

[复制链接]
跳转到指定楼层
楼主
ID:190136 发表于 2017-4-18 10:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是自己写的一个程序    没有往上面写1602的.h文件

不知道哪里出了问题,总是不能实现按下k1进入第一个菜单,按下k2进入第二个菜单,按下k3返回的功能  求大神给看一下吧  万分感谢

  1. #include<reg51.h>
  2. #include<intrins.h>        
  3. #include"lcd.h"




  4. sbit k1=P1^0;
  5. sbit k2=P1^1;
  6. sbit k3=P1^2;







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

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

  12.         while(i--);        
  13. }




  14. void menu0 ()                                                              
  15. {        

  16.     Lcd1602_Write_Cmd(0x01);
  17.         LcdShowStr(0,0," welcome ")        ;
  18.         


  19. }           

  20. void menu1 ()                                                     
  21. {        
  22.     Lcd1602_Write_Cmd(0x01);

  23.         LcdShowStr(0,0," nihao ") ;
  24.         
  25.         
  26. }

  27. void keyvalue()
  28. {
  29. if(k1==0)
  30.     {
  31.         delay(1000);
  32.           if(k1==0)
  33.           {
  34.        flag=0;
  35.            }
  36.     }
  37.          else
  38.          {
  39.           flag=3;
  40.          }
  41.      while(!k1);


  42.     if(k2==0)

  43.      {
  44.          delay(1000) ;
  45.          if(k2==0)
  46.           {
  47.              flag=1;
  48.           }
  49.      }
  50.           else
  51.          {
  52.           flag=3;
  53.          }
  54.      while(!k2);


  55. }




  56. void key()
  57. {
  58.   keyvalue();
  59.   switch(flag)
  60.   {
  61.    case 0:
  62.    {
  63.       menu0();
  64.           if(k3==0)
  65.              {
  66.             delay(1000);
  67.                 if(k3==0)
  68.                 {
  69.           flag=3 ;
  70.                 }
  71.        }

  72.       while(!k3);
  73.           break;
  74.    }


  75.    case 1:
  76.    {
  77.         menu1();
  78.         if(k3==0)
  79.            {
  80.                      delay(1000);
  81.                          if(k3==0)
  82.                          {
  83.              flag=3 ;
  84.                          }   
  85.            }
  86.           while(!k3);
  87.                   break;
  88.    }
  89.    case 3:
  90.    {
  91.      u8 i;
  92.     for(;i<10;i++)
  93.               {
  94.                 Lcd1602_Write_Data('C');
  95.               }
  96.         break;
  97.    }
  98.   }
  99. }

  100.          





  101. void main(void)
  102. {


  103.         InitLcd1602();
  104.         while(1)
  105.          {
  106.           key();
  107.          }

  108. }        
复制代码


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

使用道具 举报

沙发
ID:1 发表于 2017-4-19 04:00 | 只看该作者
现在这样能显示什么?
回复

使用道具 举报

板凳
ID:1 发表于 2017-4-19 04:00 | 只看该作者
现在这样能显示什么?
回复

使用道具 举报

地板
ID:191078 发表于 2017-4-19 08:22 | 只看该作者
请多描述一下
回复

使用道具 举报

5#
ID:190136 发表于 2017-4-19 09:54 | 只看该作者
admin 发表于 2017-4-19 04:00
现在这样能显示什么?

不能,应该是赋值出现问题了。具体的还在想....
回复

使用道具 举报

6#
ID:162136 发表于 2017-4-19 10:07 | 只看该作者
static      flag =3;//这fiag要不要申明是什么类型?
if(k1==0)            当k1按下
    {
        delay(1000);     防抖
          if(k1==0)     确定k1按下
          {
       flag=0;         
           }
    }
         else              如果k1没按下
         {
          flag=3;
         }
     while(!k1);      等待k1松开
意思就是说:k1按下flag=0;当程序再次扫描按键检测子函数时,因为没有按键按下,所以flag=3,如果其它子程序没问题,很可能一直停止在flag=3的显示页面。把if(k==0)后面的else内容都去掉应该就可以了。

以上如不对,请见谅。
回复

使用道具 举报

7#
ID:171523 发表于 2017-4-19 10:52 | 只看该作者
看看 ,学习 我是小白。
回复

使用道具 举报

8#
ID:189542 发表于 2017-4-19 15:43 | 只看该作者
在多机通信中,主机必须要能对各个从机进行识别,在51系列单片机中可以通过SCON寄存器的SM2位来实现。当串口以方式2或方式3发送数据时,每一帧信息都是11位,第9位是数据可编程位,通过给TB8置1或置0来区别地址帧和数据帧,当该位为1时,发送地址帧;该位为0时,发送数据帧。 在多机通信过程中,主机先发送某一从机的地址,等待从机的应答,所有的从机接收到地址帧后与本机地址进行比较,若相同,则将SM2置0准备接收数据;若不同,则丢弃当前数据,SM2位不变。
回复

使用道具 举报

9#
ID:190136 发表于 2017-4-19 16:21 | 只看该作者
#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);
         }

}       




已经改好了具体的功能是一开始显示第一个菜单hello  当第一按键按下时显示第二个菜单,welcome,当第二个按键按下时显示第第三个菜单,当第三个按键按下时,显示第一个菜单,也就是返回键。一开始的程序里面没想清楚switch语句的用法所以搞错了 。谢谢各位啦。具体的菜单想要什么就改动就可以了~
回复

使用道具 举报

10#
ID:95922 发表于 2017-5-19 21:48 | 只看该作者
想请问, LcdShowStr(0,0," welcome ")        ;这句话中的函数在H文件中怎么写的
回复

使用道具 举报

11#
ID:234795 发表于 2017-9-24 22:03 | 只看该作者
谢谢。。。。。。。。
回复

使用道具 举报

12#
ID:186936 发表于 2017-9-26 20:03 | 只看该作者
keyvalue()这个子函数用了吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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