51单片机LCD1602多级菜单
时间: 2023-07-02 22:19:38 浏览: 169
下面是51单片机LCD1602多级菜单的代码,可以参考:
```c
#include<reg52.h>
#include<intrins.h>
#define LCD_data P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
void delay_ms(unsigned int x);
void Write_com(unsigned char com);
void Write_data(unsigned char date);
void Init_LCD();
void Display(unsigned char row, unsigned char column, unsigned char *string);
void Menu(unsigned char *menu_item[], unsigned char n);
void main()
{
unsigned char *menu_item[]={"Menu1","Menu2","Menu3","Menu4","Menu5"};
Init_LCD();
while(1)
{
Menu(menu_item,5); //显示5个菜单项
}
}
//延时函数
void delay_ms(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<125;j++);
}
//写命令到LCD
void Write_com(unsigned char com)
{
RS=0;
RW=0;
LCD_data=com;
EN=1;
_nop_();
EN=0;
}
//写数据到LCD
void Write_data(unsigned char date)
{
RS=1;
RW=0;
LCD_data=date;
EN=1;
_nop_();
EN=0;
}
//初始化LCD
void Init_LCD()
{
Write_com(0x38); //8位数据,双行,5*7点阵
Write_com(0x0c); //显示开,无光标,不闪烁
Write_com(0x06); //写入后地址加1,不移动屏幕
Write_com(0x01); //清屏
}
//显示字符串
void Display(unsigned char row, unsigned char column, unsigned char *string)
{
unsigned char i=0;
if(row==1)
Write_com(0x80+column); //第一行
else
Write_com(0xc0+column); //第二行
while(string[i]!='\0')
{
Write_data(string[i]);
i++;
}
}
//显示菜单
void Menu(unsigned char *menu_item[], unsigned char n)
{
unsigned char i=0, j=1, k=0;
unsigned char key, flag=1;
while(flag)
{
Display(1,0,menu_item[i]); //显示菜单项
Display(2,0,menu_item[j]); //显示下一级菜单项
key=P1&0x0f; //读取按键值
delay_ms(20); //消除抖动
if(key!=0x0f) //有按键按下
{
delay_ms(20); //消除抖动
if(key!=0x0f) //再次确认按键
{
switch(key)
{
case 0x0e: //向上选择菜单项
if(i>0)
{
i--;
j--;
}
else
{
i=n-1;
j=n;
}
break;
case 0x0d: //向下选择菜单项
if(j<n)
{
i++;
j++;
}
else
{
i=0;
j=1;
}
break;
case 0x0b: //进入下一级菜单
Display(1,0,menu_item[j]); //显示下一级菜单
Display(2,0,"Return"); //显示返回菜单项
while(1) //等待按键
{
key=P1&0x0f; //读取按键值
delay_ms(20); //消除抖动
if(key!=0x0f) //有按键按下
{
delay_ms(20); //消除抖动
if(key!=0x0f) //再次确认按键
{
if(key==0x0b) //返回上一级菜单
break;
}
}
}
break;
case 0x07: //选择当前菜单项
flag=0; //退出菜单
break;
default:
break;
}
if(k!=i) //选择菜单项改变时,清除上一次选择的菜单项
{
Display(1,0," ");
Display(2,0," ");
k=i;
}
}
}
}
}
```
具体实现多级菜单的部分是在 Menu 函数中,通过不断显示当前菜单项和下一级菜单项,并根据按键的不同响应不同的操作实现的。
阅读全文