标题:
关于单片机lcd1602多级菜单的显示
[打印本页]
作者:
圣无名
时间:
2017-4-18 10:46
标题:
关于单片机lcd1602多级菜单的显示
这是自己写的一个程序 没有往上面写1602的.h文件
不知道哪里出了问题,总是不能实现按下k1进入第一个菜单,按下k2进入第二个菜单,按下k3返回的功能 求大神给看一下吧 万分感谢
#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();
}
}
复制代码
作者:
admin
时间:
2017-4-19 04:00
现在这样能显示什么?
作者:
admin
时间:
2017-4-19 04:00
现在这样能显示什么?
作者:
octcity
时间:
2017-4-19 08:22
请多描述一下
作者:
圣无名
时间:
2017-4-19 09:54
admin 发表于 2017-4-19 04:00
现在这样能显示什么?
不能,应该是赋值出现问题了。具体的还在想....
作者:
bayga456
时间:
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内容都去掉应该就可以了。
以上如不对,请见谅。
作者:
FxMan
时间:
2017-4-19 10:52
看看 ,学习 我是小白。
作者:
XIN_XIN
时间:
2017-4-19 15:43
在多机通信中,主机必须要能对各个从机进行识别,在51系列单片机中可以通过SCON寄存器的SM2位来实现。当串口以方式2或方式3发送数据时,每一帧信息都是11位,第9位是数据可编程位,通过给TB8置1或置0来区别地址帧和数据帧,当该位为1时,发送地址帧;该位为0时,发送数据帧。 在多机通信过程中,主机先发送某一从机的地址,等待从机的应答,所有的从机接收到地址帧后与本机地址进行比较,若相同,则将SM2置0准备接收数据;若不同,则丢弃当前数据,SM2位不变。
作者:
圣无名
时间:
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语句的用法所以搞错了 。谢谢各位啦。具体的菜单想要什么就改动就可以了~
作者:
老来所学
时间:
2017-5-19 21:48
想请问, LcdShowStr(0,0," welcome ") ;这句话中的函数在H文件中怎么写的
作者:
18750930984
时间:
2017-9-24 22:03
谢谢。。。。。。。。
作者:
wxc19960311
时间:
2017-9-26 20:03
keyvalue()这个子函数用了吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1