制作一个三级菜单,能够通过板上按键选择不同菜单项。实现进入与退出任意菜单界面,并在LCD显示当前菜单位置,硬件为tm4c123g,开发环境为Keil uVision5,外设为uc1701
时间: 2023-05-29 16:03:07 浏览: 337
TM4C123常用代码模板.zip_TM4C123源码_ground7qw_tm4c123pwm_tm4c123代码例程_代码模
5星 · 资源好评率100%
LCD屏幕。
以下是一个可能的三级菜单示例:
第一级菜单:
1. 信息查询
2. 系统设置
3. 退出
第二级菜单:
1. 查询个人信息
2. 查询系统信息
3. 返回上一级菜单
第三级菜单:
1. 修改个人信息
2. 修改系统设置
3. 返回上一级菜单
按下板上的向上和向下按键可以选择不同的菜单项,按下确定键可以进入选定菜单项的子菜单或执行相应的操作。按下返回键可以返回到上一级菜单。
以下是一个可能的代码实现:
#include "tm4c123gh6pm.h"
#define LCD_RS (*((volatile unsigned long *)0x40004200))
#define LCD_EN (*((volatile unsigned long *)0x40004100))
#define LCD_RW (*((volatile unsigned long *)0x40004080))
#define LCD_DAT (*((volatile unsigned long *)0x40005000))
void LCD_Init(void);
void LCD_Command(unsigned char command);
void LCD_Data(unsigned char data);
void LCD_String(char *string);
void LCD_Clear(void);
void Delay(unsigned long counter);
int main(void)
{
char menu_1[3][20] = {"1. 信息查询", "2. 系统设置", "3. 退出"};
char menu_2[3][20] = {"1. 查询个人信息", "2. 查询系统信息", "3. 返回上一级菜单"};
char menu_3[3][20] = {"1. 修改个人信息", "2. 修改系统设置", "3. 返回上一级菜单"};
int current_menu = 1;
int current_selection = 0;
LCD_Init();
LCD_Clear();
LCD_String("Menu 1");
while (1)
{
// 检测向上按键
if ((GPIO_PORTF_DATA_R & 0x10) == 0)
{
current_selection--;
if (current_selection < 0)
{
current_selection = 2;
}
// 更新LCD显示
LCD_Clear();
if (current_menu == 1)
{
LCD_String(menu_1[current_selection]);
}
else if (current_menu == 2)
{
LCD_String(menu_2[current_selection]);
}
else if (current_menu == 3)
{
LCD_String(menu_3[current_selection]);
}
// 延迟一段时间,避免按键反弹
Delay(100000);
}
// 检测向下按键
if ((GPIO_PORTF_DATA_R & 0x01) == 0)
{
current_selection++;
if (current_selection > 2)
{
current_selection = 0;
}
// 更新LCD显示
LCD_Clear();
if (current_menu == 1)
{
LCD_String(menu_1[current_selection]);
}
else if (current_menu == 2)
{
LCD_String(menu_2[current_selection]);
}
else if (current_menu == 3)
{
LCD_String(menu_3[current_selection]);
}
// 延迟一段时间,避免按键反弹
Delay(100000);
}
// 检测确定按键
if ((GPIO_PORTF_DATA_R & 0x02) == 0)
{
// 进入子菜单或执行操作
if (current_menu == 1 && current_selection == 0)
{
// 进入菜单2
current_menu = 2;
current_selection = 0;
LCD_Clear();
LCD_String("Menu 2");
}
else if (current_menu == 1 && current_selection == 1)
{
// 进入菜单3
current_menu = 3;
current_selection = 0;
LCD_Clear();
LCD_String("Menu 3");
}
else if (current_menu == 1 && current_selection == 2)
{
// 退出程序
break;
}
else if (current_menu == 2 && current_selection == 0)
{
// 查询个人信息
// TODO:执行相应的操作
}
else if (current_menu == 2 && current_selection == 1)
{
// 查询系统信息
// TODO:执行相应的操作
}
else if (current_menu == 2 && current_selection == 2)
{
// 返回菜单1
current_menu = 1;
current_selection = 0;
LCD_Clear();
LCD_String("Menu 1");
}
else if (current_menu == 3 && current_selection == 0)
{
// 修改个人信息
// TODO:执行相应的操作
}
else if (current_menu == 3 && current_selection == 1)
{
// 修改系统设置
// TODO:执行相应的操作
}
else if (current_menu == 3 && current_selection == 2)
{
// 返回菜单1
current_menu = 1;
current_selection = 0;
LCD_Clear();
LCD_String("Menu 1");
}
// 延迟一段时间,避免按键反弹
Delay(100000);
}
// 检测返回按键
if ((GPIO_PORTF_DATA_R & 0x04) == 0)
{
// 返回上一级菜单
if (current_menu == 2 || current_menu == 3)
{
current_menu = 1;
current_selection = 0;
LCD_Clear();
LCD_String("Menu 1");
}
else
{
// 退出程序
break;
}
// 延迟一段时间,避免按键反弹
Delay(100000);
}
}
return 0;
}
void LCD_Init(void)
{
// 初始化LCD屏幕
// TODO:具体实现根据LCD屏幕型号和接口不同而不同
}
void LCD_Command(unsigned char command)
{
// 发送LCD指令
// TODO:具体实现根据LCD屏幕型号和接口不同而不同
}
void LCD_Data(unsigned char data)
{
// 发送LCD数据
// TODO:具体实现根据LCD屏幕型号和接口不同而不同
}
void LCD_String(char *string)
{
// 在LCD上显示字符串
while (*string)
{
LCD_Data(*string++);
}
}
void LCD_Clear(void)
{
// 清空LCD屏幕
LCD_Command(0x01);
Delay(10000);
}
void Delay(unsigned long counter)
{
// 延迟一段时间
while (counter--)
{
// do nothing
}
}
阅读全文