图形点阵式液晶可显示用户自定义的任意符号

和图形,并可卷动显示。它作为单片机系统人机交

互界面的重要组成部分被广泛应用于实时检测和显

示的仪器仪表中,例如手机上的显示屏就是图形点

阵液晶。

采用图形点阵式液晶显示较之其它显示方式主

要有以下优点:

(1) 工作电压低、功耗极低。工作电压仅为3~

5 v ,工作电流≤10 μa/ cm2 ,特别适用于低功耗的

仪器仪表中。

(2) 液晶显示属被动显示,受外界光线干扰小。

(3) 图形点阵式液晶可显示的信息量大、分辨

率高。

(4) 不产生电磁干扰。

(5) 可*性高,使用寿命长。

本文所介绍的lcd 采用128 ×64 点阵的液晶

屏,因此可显示16 ×16 点阵的汉字4 行8 列。菜单

为多级嵌套形式,最长的有13 层,主要完成对某个

测点各方面的设置或查询,可通过“向上”、“向下”、

“回退”、“确认”4 个键或遥控器来实现对菜单的选

择。具体功能:

“向上”键:在本层菜单的项目中向上移动进行

选择;

“向下”键:在本层菜单的项目中向下移动进行

选择;

“回退”键:取消本层的菜单设置,返回上层菜

单;

“确认”键:确认本层的菜单设置,进入下级菜

单。

可根据用户在菜单中的选择项对测点进行某些

设置,或者进行某些特殊的显示,例如对某个测点的

实时曲线显示等。

程序设计

根据需求,首先建立一个结构,并定义一个结构

变量kbdtabst ruct 。结构变量就是把多个不同类

型的变量结合在一起形成的一个组合型变量,构成

一个结构的各个变量称为结构元素。该结构中共有

6 个结构元素,分别是5 个字符型和1 个指针变量,

5 个字符型变量分别为当前及各个按键的索引号,

也就是*作的状态号,最后1 个指针变量指向需执

行函数。这样就可以做一个结构数组,在结构数组

里为每一个菜单项编制一个单独的函数,并根据菜

单的嵌套顺序排好本菜单项的索引号,以及本级菜

单项的上、下卷动的索引号和上、下级菜单的索引号。

具体程序如下所述:

typedef st ruct

{

uchar  keystateindex ;   / / 当前状态索引号

uchar  keydnstate ;   / / 按下“向下”键时转向的状态索引号

uchar  keyupstate ;   / / 按下“向上”键时转向的状态索引号

uchar  keycrstate ;   / / 按下“回车”键时转向的状态索引号

uchar  keybackstate ;   / / 按下“退回”键时转向的状态索引号

void  ( 3 currentoperate) ( ) ;   / / 当前状态应该执行的

功能*作

}  kbdtabst ruct ;

# define size - of keybd - menu 55   / / 菜单总长度

kbdtabst ruct code keytab[ size - of - keybd - menu ] =

{

{0 ,0 ,0 ,1 ,0 , ( 3 mainjob1) } ,

{1 ,7 ,2 ,8 ,0 , ( 3 dsp point) } ,   / / 第一层

{2 ,1 ,3 ,8 ,0 , ( 3 dspcurve) ) ,   / / 第一层

{3 ,2 ,4 ,36 ,0 , ( 3 dsp kout) } ,   / / 第一层

{4 ,3 ,5 ,50 ,0 , ( 3 disclosedown) } ,   / / 第一层

程序设计

根据需求,首先建立一个结构,并定义一个结构

变量kbdtabst ruct 。结构变量就是把多个不同类

型的变量结合在一起形成的一个组合型变量,构成

一个结构的各个变量称为结构元素。该结构中共有

6 个结构元素,分别是5 个字符型和1 个指针变量,

5 个字符型变量分别为当前及各个按键的索引号,

也就是*作的状态号,最后1 个指针变量指向需执

行函数。这样就可以做一个结构数组,在结构数组

里为每一个菜单项编制一个单独的函数,并根据菜

单的嵌套顺序排好本菜单项的索引号,以及本级菜

单项的上、下卷动的索引号和上、下级菜单的索引号。

具体程序如下所述:

typedef st ruct

{

uchar  keystateindex ;   / / 当前状态索引号

uchar  keydnstate ;   / / 按下“向下”键时转向的状态索引号

uchar  keyupstate ;   / / 按下“向上”键时转向的状态索引号

uchar  keycrstate ;   / / 按下“回车”键时转向的状态索引号

uchar  keybackstate ;   / / 按下“退回”键时转向的状态索引号

void  ( 3 currentoperate) ( ) ;   / / 当前状态应该执行的

功能*作

}  kbdtabst ruct ;

# define size - of keybd - menu 55   / / 菜单总长度

kbdtabst ruct code keytab[ size - of - keybd - menu ] =

{

{0 ,0 ,0 ,1 ,0 , ( 3 mainjob1) } ,

{1 ,7 ,2 ,8 ,0 , ( 3 dsp point) } ,   / / 第一层

{2 ,1 ,3 ,8 ,0 , ( 3 dspcurve) ) ,   / / 第一层

{3 ,2 ,4 ,36 ,0 , ( 3 dsp kout) } ,   / / 第一层

{4 ,3 ,5 ,50 ,0 , ( 3 disclosedown) } ,   / / 第一层

下面是一个具体的例子:

unsigned char tempin,tempout,temprun;

unsigned char Key_Value();

unsigned char Change_Value(unsigned char);

void Delay_1(unsigned int m);

void Run_Satus();

char * MainMenuTitle = "主菜单";

const char * MainMenuItems[] = {

"1.室内温度调整",

"2.室外温度调整",

"3.运行时间调整",

"4.ESC退出",

};

TMenu MainMenu;

void OnSelectMainMenu(int index)

{

if (index < 0 || index >= sizeof(MainMenuItems) / sizeof(char *)) return;

ClearScreen();

switch (index) {

case 0:

TextOut(0, 1, "室内调整开始 ");

tempin=Change_Value(tempin);

TextOut(0, 1, "室内调整完毕");

Delay_1(300000);

break;

case 1:

TextOut(0, 1, "室外调整开始 ");

tempout=Change_Value(tempout);

TextOut(0, 1, "室外调整完毕");

Delay_1(300000);

break;

case 2:

TextOut(0, 1, "运行时间调整开始");

tempout=Change_Value(temprun);

TextOut(0, 1, "运行时间完毕");

Delay_1(300000);

break;

case 3:

break;

}

ClearScreen();

}

UINT OnMainMenuOk(void * arg)

{

TMenu * pMenu = (TMenu *)arg;

if (pMenu) OnSelectMainMenu(pMenu->Current);

return 0;

}

UINT OnMainMenuCancel(void * arg)

{

TMenu * pMenu = (TMenu *)arg;

if (pMenu) {

CloseMenu(pMenu);

}

return 0;

}

UINT OnMainMenuOtherKey(void * arg)

{

TMenu * pMenu = (TMenu *)arg;

char key;

if (pMenu) {

key = pMenu->EventArg;

OnSelectMainMenu(key - '1');

DrawMenu(pMenu);

}

return 0;

}

void InitMenu()

{

InitializeMenu(&MainMenu, MainMenuTitle, MainMenuItems, sizeof

(MainMenuItems) / sizeof(char *));

MainMenu.OnOk = OnMainMenuOk;

MainMenu.OnOtherKey = OnMainMenuOtherKey;

MainMenu.OnCancel = OnMainMenuCancel;

}

unsigned char Key_Value()

{

unsigned char KeyTemp;

KeyTemp=GetKey();

switch(KeyTemp)

{

case(VK_ESCAPE):

return(0);

break;

case(VK_ENTER):

return(1);

break;

case(VK_UP):

return(2);

break;

case(VK_DOWN):

return(3);

break;

}

}

unsigned char Change_Value(unsigned char temp2)

{

unsigned char temp3;

temp3=temp2;

while((Key_Value()!=0)&&(Key_Value()!=1))

{

if(Key_Value()==2)temp3++;

else if(Key_Value()==3)temp3--;

ClearLine(1);

TextOut(0, 1, "调整状态%d", temp3);

}

if(Key_Value()==1)return(temp3);

else if(Key_Value()==0) return(temp2);

}

void Delay_1(unsigned int m)

{

while(m--);

}

void Run_Satus()

{

ClearScreen();

TextOut(0, 0, "室内温度%d",tempin);

TextOut(0, 1, "室外温度%d",tempout);

TextOut(0, 2, "运行时间%d",temprun);

TextOut(0, 3, "ENTER 进入调整");

}

void tmain()

{

tempin=30;

tempout=30;

temprun=30;

unsigned char key;

InitMenu();

while(1)

{

Run_Satus();

key=GetKey();

if(key==VK_ENTER)ShowMenu(&MainMenu);

}

}

单片机c语言调试菜单,单片机c语言下lcd多级菜单的一种实现方法相关推荐

  1. java中菜单分几级_JAVA构造多级菜单

    很多时候我们在前段展现时要用到多级菜单,刚好今天做了个简单的,整理一下: 首先我们要确定要展现的菜单结构: --根菜单 --一级菜单A --二级菜单A --三级菜单A --一级菜单B 与Hiberna ...

  2. html京东下拉菜单设置,div css下拉导航菜单(图+演示)

    div css下拉导航菜单(图+演示),div css下拉导航菜单,css导航菜单下拉 CSS导航菜单(CSS下拉菜单演示图) 查看演示-CSS下拉菜单样式:下拉导航菜单/ 以下有DIV CSS下拉菜 ...

  3. java多级菜单列表怎么做_JAVA构造多级菜单

    很多时候我们在前段展现时要用到多级菜单,刚好今天做了个简单的,整理一下: 首先我们要确定要展现的菜单结构: --根菜单 --一级菜单A --二级菜单A --三级菜单A --一级菜单B 与Hiberna ...

  4. c语言 printf分栏输出,excel表格分栏打印输出的两种巧妙方法_excel教程

    有时Excel中的表格只有两三列内容,这样在处理完表格中数据如果直接打印输出就会显得很不美观,且浪费纸张.如果能象Word和WPS那样具有分栏功能就好了.下面我们就借助外力对Excel中的表格实现分栏 ...

  5. c语言能让键盘失灵怎么办,电脑键盘个别字母失灵的三种解决方法

    电脑键盘是电脑输入设备中最常用的设备之一,也是大家使用最频繁的的设备.由于电脑键盘使用频度高,容易出现个别字母失灵的情况,在没换新键盘之前,有什么办法能修复一下?导致键盘失灵的原因有三个,一是笔记本开 ...

  6. c语言错误1004,excel宏运行时提示错误1004的三种解决方法

    在使用excel宏功能的时候,一些网友会遇到excel宏运行不了,软件提示:"运行时错误1004,应用程序定义或对象定义错误"的问题,那么,excel宏运行时错误1004怎么办?幸 ...

  7. c语言 printf分栏输出,Exce表格分栏打印输出的两种巧妙方法

    作者: 王道才 原创 有时Excel中的表格只有两三列内容,这样在处理完表格中数据如果直接打印输出就会显得很不美观,且浪费纸张.如果能象Word和WPS那样具有分栏功能就好了.下面我们就借助外力对Ex ...

  8. 基于状态机的LCD多级菜单设计

    文章地址链接1:https://blog.csdn.net/embedded_guzi/article/details/35835755 文章地址链接2:http://eeskill.com/arti ...

  9. STM32简易多级菜单(数组查表法)

    单片机开发中,有时会用到屏幕来显示内容,当需要逐级显示内容时,就需要使用多级菜单的形式了. 1 多级菜单 多级菜单的实现,大体分为两种设计思路: 通过双向链表实现 通过数组查表实现 总体思路都是把菜单 ...

最新文章

  1. SL2_RedSkin
  2. 二十六、深入HashCode与equals的区别(上篇)
  3. 概述类的加载器及类加载过程
  4. oracle 连多表查询语句,Oracle join多表查询
  5. form表单提交之前判断
  6. jzoj2137-(GDKOI2004)城市统计【二维前缀和,bfs】
  7. Java|C++工作笔记-控制台带参数运行程序
  8. nutch2.3.1 scoring-opic 插件url评分为0 问题
  9. 自动化测试【用例设计秘籍】
  10. HW 静态路由实现PC间互通
  11. 双目摄像头的帧同步输入fsync信号_读源码长知识 | Android卡顿真的是因为”掉帧“?...
  12. 百度的“知心搜索”揭秘
  13. Cadence Allegro 高亮功能的使用技巧图文教程
  14. 大型语言模型,真的能够理解人类吗?
  15. 点聚AIP电子签章在Chrome、Edge新内核、360系列、FireFox、IE、Opera等浏览器中实现网页内嵌效果案例(一)
  16. 相机标定+极线矫正+elas生成视差图
  17. scara机器人动荷载_【机器人在线】SCARA机械结构参数计算说明 下
  18. 我喜欢的刀刀语录(一)
  19. 龙芯CPU开发系统固件与内核接口手册资料
  20. Docer学习(一)

热门文章

  1. java类加载器顺序_java中类的加载顺序介绍(ClassLoader)
  2. 工作流学习笔记-过程管理
  3. ASP.NET CORE 在IIS10 中设置上传文件大小的限制
  4. LWJGL入门指南:使用《我的世界》(Minecraft)同款游戏库开发一个超级“简单”的3D射击游戏
  5. 【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用
  6. 将逗号隔开的字符串String转换为list<T>集合
  7. looks调色插件 Red Giant Magic Bullet Looks for Mac
  8. 《救时宰相于谦》 郦波
  9. CSS自动换行、强制不换行、强制断行、超出显示省略号
  10. 【Unity】Git上传Unity工程GitHub