17933|34

7219

帖子

192

TA的资源

五彩晶圆(高级)

楼主
 

【launchpad】课后练习二十之LCD1602多级菜单显示 [复制链接]

 

课后练习二十之LCD1602多级菜单显示

(最近练习了基于launch pad1602多级菜单例子,这里分享给大家,当然此方法是学习的傻孩子的教程,并非原创,但是也做了不少改进,现移植到430中,敬请各位指点)

 

1. 引言

图形点阵式液晶可显示用户自定义的任意符号和图形,并可卷动显示。它作为单片机系统人机交互界面的重要组成部分被广泛应用于实时检测和显示的仪器仪表中,例如手机上的显示屏就是图形点阵液晶。

 

2.菜单的结构体的简单介绍

菜单结构体代码(版权属于傻孩子)

struct MenuItem

{

short MenuCount;   

char *DisplayString;

void (*Subs)();

struct MenuItem *ChildrenMenus;

struct MenuItem *ParentMenus;

}  Null;

 

讲解:

 

   short MenuCount;   

当前层节点数,即每层菜单最多能显示的条目数

目的:

1、在菜单读取前先读取这个菜单总共拥有的项目数,防止越界

2、可以方便的实现菜单的滚动。例如: 即(MenuCount == 最大的菜单个数)时再继续向下一级翻页再显示。

 

  *DisplayString;

指向菜单标题的字符串,指向当选中该级菜单后所要显示的字符串。

 

   struct MenuItem *ChildrenMenus;

指向结构体指针,用于存储下一级菜单

 

   struct MenuItem *ParentMenus;

指向结构体指针,用于存储上一级菜单

( 本文中我省略了void (*Subs)(); 读者可以自行添加与完善 )

 

 

3。 应用

这里配合上前几讲讲过的状态机,状态机+多级菜单,还是蛮好玩的,下面介绍下本例子的操作方法:

P2.5 按键(我的这个外接按键,是通过另外一块开发板的按键接口接过来的)

 

         A 当按键按下,短按一次,停留一级菜单,向下翻滚。(小箭头由0 指向1 再指向2……)

       B 当按键按下,长按一次,进入二级菜单;

       C 当按键按下,短按一次,停留二级菜单,向下翻滚,(小箭头由0 指向1 再指向2……)

       D 当按键按下,长按一次,进入一级菜单,然后回到A

 

 

 

         一级菜单为:

0.LED1.ON

        1.LED1.OFF

        2.LED2.ON

        3.LED2.OFF

 

    二级菜单为:

        0.LED1_ON_ok?

        1.LED1_OFF_ok?

        2.LED2_ON_ok?

        3.LED2_OFF_ok?

 

 

4. LCD原理图

 

本文中的按键 不是用的launchpad里面的按键 是外接P2.5接按键

 

实物连接图

 

一级菜单图:

 

二级菜单图

 

 

(这个应用程序比较多,会一个一个贴出来。懒于一个一个复制粘帖的读者也不用怕,在基本应用写完后,我会写一个规整帖,上传所有的工程。)

 

课后练习二十一之LCD1602菜单.pdf (494.46 KB, 下载次数: 795)

 

  lesson24_LCD160caidan.rar (1.65 MB, 下载次数: 1680)

 

[ 本帖最后由 常见泽1 于 2012-6-25 15:27 编辑 ]

最新回复

正需要这个 谢谢啦  详情 回复 发表于 2017-6-2 09:53

点评

楼主强 想搞个菜单  详情 回复 发表于 2013-1-25 18:35
 
点赞 关注(4)

回复
举报

7219

帖子

192

TA的资源

五彩晶圆(高级)

推荐
 

程序较多 贴出部分程序

  1. Timer.c

  2.  

  3. /***********************************************

  4. ****      LAUNCH PAD 学习之LCD菜单       ***

  5. ****         MCU: msp430g2452                ***

  6. ****       作者:  常见泽                    ***

  7. ****                                         ***

  8. ****                                         ***

  9. ****           2012.06.22.2108                ***

  10. ****       实验现象:LCD 20126月22        ***

  11. ****   

  12. 通过KEY 短按一下 进入下一个菜单,共四个菜单,长按选择菜单,执行相应的动作

  13. ***

  14. **** P1.0~P1.7LCD数据口 P2.0 P2.1 en rs    ***

  15. ***********************************************/

  16.  

  17. #include <msp430g2452.h>

  18. #include"Key.h"

  19. #include"lcd1602.h"

  20. #include"timer.h"

  21. volatile unsigned int time_10ms_ok = 0;

  22.  

  23.     

  24.  

  25. struct      MenuItem  MainMenu[4] =             //结构体主菜单

  26. {      

  27.         {4,"0.LED1.ON ",NextMenu,&Null},

  28.         {4,"1.LED1.OFF",NextMenu,&Null},

  29.         {4,"2.LED2.ON ",NextMenu,&Null},

  30.        {4,"3.LED2.OFF",NextMenu,&Null},

  31. };

  32.  

  33. struct      MenuItem NextMenu[4] =            //子菜单

  34. {

  35.         {4,"0.LED1_ON_ok? ",&Null,MainMenu},

  36.         {4,"1.LED1_OFF_ok?",&Null,MainMenu},

  37.         {4,"2.LED2_ON_ok? ",&Null,MainMenu},

  38.         {4,"3.LED2_OFF_ok?",&Null,MainMenu},

  39. };

  40.  

  41. struct      MenuItem (*MenuPoint) = MainMenu;

  42.  

  43.  

  44.  

  45. //*------------------------------------------------------------------------------

  46. //*显示函数

  47. //*------------------------------------------------------------------------------

  48. void  ShowMenu(void)

  49. {

  50. unsigned char i = 0;

  51. MaxItems = MenuPoint[0].MenuCount;                //获取当前菜单的条目数

  52. DisplayPoint = DisplayStart;                      //显示菜单的编号

  53. if( MaxItems > LCD1602_Max_Display_Line ) //如果大于能显示的菜单数做处理

  54. {

  55.   for ( i = 0;i < LCD1602_Max_Display_Line;i++ )

  56.   {

  57.     LCD1602wRITESTring( i,1,MenuPoint[DisplayPoint].DisplayString );//2行分别显示两个菜单

  58.                //string(x,y,*date) x=0 第一行 Y为横轴位置

  59.             if ((DisplayPoint) == (UserChoose))

  60.     {

  61.       LCD1602SetAddr(0,0,0x7e);   //写小箭头

  62.     }

  63.     else

  64.     {

  65.       LCD1602SetAddr(i,0,' ');         //写空格

  66.     }

  67.               DisplayPoint += 1;   //字符串偏移量+1

  68.     if ((DisplayPoint) == (MaxItems))

  69.     {

  70.               DisplayPoint = 0;

  71.     }

  72. }// end of for(^)   

  73.       }

  74. }

  75.  

  76. void ExcuteMenu(void)

  77. {

  78. unsigned char GetKeyNum;

  79. if (time_10ms_ok)

  80. {             //确定有功能按键被按下的情况下才执行其功能

  81.            time_10ms_ok = 0;

  82.            GetKeyNum = key_driver();

  83.            if((GetKeyNum == 1)||(GetKeyNum == 2))

  84.            {

  85.             //ShowMenu();     

  86.             //P2OUT  |=  BIT3;   //LED1_on

  87.           

  88.     switch (GetKeyNum)

  89.     {

  90.       case S_key://短按键

  91.                   UserChoose++;

  92.           if (UserChoose == MaxItems)

  93.           {

  94.             UserChoose = 0;//当用户的选择数大于最大菜单数量,则选定的清零到第一个

  95.           }

  96.                  

  97.                   GetKeyNum=0;

  98.     break;

  99.  

  100.   case L_key:  //长按键

  101.             if (MenuPoint[UserChoose].ChildrenMenus != &Null)

  102.     {  

  103.              

  104.               MenuPoint     = MenuPoint[UserChoose].ChildrenMenus;  //指向子菜单

  105.       SavePoint     = UserChoose;  //显示菜单的编号

  106.       UserChoose    = 0;

  107.               DisplayStart  = 0;

  108.             }

  109.              

  110.             else if (MenuPoint[UserChoose].ParentMenus != &Null)

  111.     {                           

  112.       MenuPoint   = MenuPoint[UserChoose].ParentMenus;    //指向父菜单

  113.       UserChoose  = 0;

  114.       DisplayStart= SavePoint-1;

  115.       UserChoose  = SavePoint;     //恢复先前的菜单

  116.             }

  117.             GetKeyNum=0;

  118.             break;

  119.            

  120.         default: break;

  121.   }

  122. //*--------------------------------------------------------------------

  123. //*菜单循环处理

  124.         if ((UserChoose < DisplayStart) || (UserChoose >= (DisplayStart + 1 )))

  125. {

  126.           DisplayStart = UserChoose;

  127.         } 

  128.         write_com(0x01);

  129.         delay_nms(3);

  130.         ShowMenu();

  131. }

  132.         }

  133. }

  134.  

  135. void main(void)

  136. {

  137.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  138.    P1DIR   |= 0xff;                     //P1.0为输出

  139.   P2DIR   |=  (BIT0|BIT1|BIT2|BIT3|BIT4);

  140.   P2OUT   &=  (~(BIT0|BIT1|BIT2|BIT3|BIT4));

  141.   CCR0  = 10000;

  142.   TACTL = TASSEL_2 + MC_1+TACLR;                  // MCLK,upmode

  143.   CCTL0 = CCIE;                                   // 允许中断

  144.  

  145.   _EINT();

  146.  

  147.   init_LCD();               //液晶显示初始化

  148.   ShowMenu();                 //显示菜单

  149.                

  150.   while(1)

  151.   {

  152.     ExcuteMenu();

  153.   }

  154. }

  155.  

  156. #pragma vector= TIMER0_A0_VECTOR

  157. __interrupt void Timer_A (void)

  158. {

  159.  

  160.     //P1OUT ^= 0x01;                            // Toggle P1.0

  161.    time_10ms_ok=1;

  162.     CCTL0 &=  ~CCIFG;

  163.   //TAIFG = 0;

  164. }

复制代码

[ 本帖最后由 常见泽1 于 2012-6-25 15:27 编辑 ]
 
 

回复

216

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
嗯嗯?楼主的20呢?怎么直接蹦到21了?我可是一直关注楼主的【课后练习】哦~~

点评

谢谢 兄弟支持啊 我也记得你了 哈哈 这个弄错了 应该是20 我修改下 交个朋友 我也是菜鸟 一起学习啊  详情 回复 发表于 2012-6-25 15:26
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

4
 

回复 板凳 千里千寻 的帖子

谢谢 兄弟支持啊 我也记得你了 哈哈 这个弄错了 应该是20 我修改下 交个朋友 我也是菜鸟 一起学习啊
 
 
 

回复

412

帖子

665

TA的资源

纯净的硅(中级)

5
 
顶 楼主

点评

多谢兄弟支持啊:victory: :victory:  详情 回复 发表于 2012-6-26 09:34
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

6
 

回复 5楼 nwx8899 的帖子

多谢兄弟支持啊
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

7
 
狂顶啊,哈哈

点评

多谢 也认识你了 你也经常在  详情 回复 发表于 2012-6-27 09:44
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

8
 

回复 7楼 FJYCHENJUN 的帖子

多谢 也认识你了 你也经常在
 
 
 

回复

2002

帖子

24

TA的资源

五彩晶圆(高级)

9
 
这个很不错啊,嘿嘿,那天也玩玩
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

10
 

新手 求助?

常见泽1,你能不能发个msp430alnuchpad 与12864相连显示字符的程序给我啊?最好附上msp430lanuchpad 与12864的连接图 我很急需这个 我室新手中的新手 麻烦你了

点评

这个是用的 LCD1602的 12864的帖子里 画出了连接图的  详情 回复 发表于 2012-7-2 16:49
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

11
 

回复 10楼 低c灰太狼 的帖子

这个是用的 LCD1602的  12864的帖子里 画出了连接图的

点评

楼主哪有12864的驱动呀  详情 回复 发表于 2014-4-24 16:09
 
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

12
 
楼主很强啊。可以加个好友,讨论一下吗?
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

13
 

楼主强 想搞个菜单

楼主强 想搞个菜单
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(初级)

14
 

好程序

作者程序编得很好啊,学习了
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

15
 
太好了 终于找到。 研究中,谢了
 
 
 

回复

846

帖子

0

TA的资源

纯净的硅(中级)

16
 
很好!!
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

17
 
常见泽1 发表于 2012-7-2 16:49
这个是用的 LCD1602的  12864的帖子里 画出了连接图的

楼主哪有12864的驱动呀
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(初级)

18
 
楼主能告诉我哪儿能下IAR For MSP430G253的版本?

点评

我的是w7 32位 IAR  详情 回复 发表于 2014-6-6 23:02
邮箱给我  详情 回复 发表于 2014-6-6 23:01
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(初级)

19
 
学习一下
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(初级)

20
 
楼主不错哈
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表