新人想问一下关于1602多级菜单显示的东西
#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);
}
}