4996

帖子

19

TA的资源

裸片初长成(初级)

21
 

回复 20楼 shan_99 的帖子

判断是否有按键,有按键相应菜单移动,如果是OK键,返回0x00,清屏,执行选择项
此帖出自NXP MCU论坛

点评

楼主,你能把你的这两个LCD驱动函数贴给我吗?我调了好久就是不能滚动,键值都能正常获得。所以我觉得是我的LCD驱动函数和你那程序不匹配 就是这两个函数(LCMDisplayStrRvs(0, (i+1)*2, menu[page+i].MenuItem)  详情 回复 发表于 2012-10-29 21:39
个人签名我的博客
 

回复

67

帖子

0

TA的资源

一粒金砂(高级)

22
 

回复 22楼 zhaojun_xf 的帖子

楼主,你能把你的这两个LCD驱动函数贴给我吗?我调了好久就是不能滚动,键值都能正常获得。所以我觉得是我的LCD驱动函数和你那程序不匹配
就是这两个函数(LCMDisplayStrRvs(0, (i+1)*2, menu[page+i].MenuItem); // 反白显示菜单项
                                 LCMDisplayStr(0, (i+1)*2, menu[page+i].MenuItem);         // 显示菜单项               
                               )
此帖出自NXP MCU论坛

点评

不同显示屏,显示代码是不同的,你只要保证你的显示函数可以实现这样的显示功能,就一定可以正常工作的。  详情 回复 发表于 2012-10-30 09:32
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

23
 

回复 23楼 shan_99 的帖子

不同显示屏,显示代码是不同的,你只要保证你的显示函数可以实现这样的显示功能,就一定可以正常工作的。
此帖出自NXP MCU论坛

点评

还有这儿是主函数 : #include \"msp430g2553.h\" #include \"KEY_OPER.c\" #include \"mokuai_12864.c\" #include \"Menu_function.c\" void main( ) { // Stop watchdog timer to prevent time o  详情 回复 发表于 2012-11-13 19:13
楼主,我调单级菜单很久了,程序正常调通了,但显示和反白显示都正常,但是却不能正常滚动、、、、真的快要崩溃了。我急需楼主你给我指点迷津,麻烦你了!现在我把我的菜单函数和按键函数贴出来,希望楼主你帮帮我看  详情 回复 发表于 2012-11-13 19:05
 
个人签名我的博客
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

24
 

回复 21楼 蓝雨夜 的帖子

没有拍视频的习惯。。。。。。。
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

67

帖子

0

TA的资源

一粒金砂(高级)

25
 

回复 24楼 zhaojun_xf 的帖子

楼主,我调单级菜单很久了,程序正常调通了,但显示和反白显示都正常,但是却不能正常滚动、、、、真的快要崩溃了。我急需楼主你给我指点迷津,麻烦你了!现在我把我的菜单函数和按键函数贴出来,希望楼主你帮帮我看看
键盘扫描如下:
/*************************************************
MCU:***********LAUNCHPAD(MSP430G2553)************
MODULE:********KEY_OPER.c************************
FUNCTION:*******独立键盘,完成相应功能************
DESIGNER:*******张涟棋****************************
DATE:***********2012-10-10************************
*************************************************/

/******************定义全局变量******************/
unsigned char test;
//unsigned char Key_ValF=0,Key_ci=0;
#define  uint8  unsigned int
unsigned char key_flag;         //按键是否已放开:1--是,0--否
//功能键定义区
#define KV_NO      0          // 无
# define UP        1
# define Down      2
# define Enter     3
# define Esc       4

void delay_Nms(unsigned int n)//延时
{
   unsigned int i;
   unsigned int j;
   for(i = n;i > 0;i--)
      for(j = 100;j > 0;j--)
         _NOP();
}

void KEY_Port_Init()
{
   P1DIR &= ~(BIT1+BIT2+BIT3+BIT4+BIT5);//12345输入方向
   P1REN |= BIT1+BIT2+BIT3+BIT4+BIT5;//12345上下拉电阻使能
   P1IE |= BIT1+BIT2+BIT3+BIT4+BIT5;//12345使能中断
   P1IES |= (BIT1+BIT2+BIT3+BIT4+BIT5);//12345上升沿触发
}

/**************************************************************************************
* FunctionName   : Menu_KeySan()
* Description    : 获取按键值
* EntryParameter : None
* ReturnValue    : 返回按键值
**************************************************************************************/
/*uint8 Menu_KeySan(void)
{
uint8 key = KV_NO;

key = test;                               // 获取按键
if (key != KV_NO)
{
     //BuzzerSound(1);                       // 有键按下,响一声
        while(key != KV_NO)                   // 等待按键释放
  {
      key_flag   = 1;        // 设置key_Flag标识;
  }
}

return key;
}*/


#pragma vector =PORT1_VECTOR
__interrupt void P1port()
{
  unsigned char Key_Num;
  Key_Num = P1IFG;
  
  switch(Key_Num)//判断哪一位按键触发的中断
  {
  case BIT1:test=0; delay_Nms(10);break;//do {P1OUT &=~BIT0;}while(!(P1IN&BIT1));break;//检测松手P1.1
  case BIT2:test=1; delay_Nms(10);break;//do {P1OUT &=~BIT0;}while(!(P1IN&BIT2));break;//P1.2
  case BIT3:test=2; delay_Nms(10);break;//do {P1OUT |=BIT0;}while(!(P1IN&BIT3));break;//P1.3
  case BIT4:test=3; delay_Nms(10);break;//do {P1OUT &=~BIT0;}while(!(P1IN&BIT4));break;//P1.4
  case BIT5:test=4; delay_Nms(10); break;//do {P1OUT &=~BIT0;}while(!(P1IN&BIT5));break;//P1.5
  }
  
  /*for (i=test*2;i>0;i--)//仅仅检测键盘使用,调其他程序屏蔽此段
  {
     P1OUT ^=BIT6;//
     delay_Nms(500);
  }*/
  
  delay_Nms(5);
  P1IFG=0;
  //Key_ValF=1;
  //Key_ci++;
  key_flag   = 1;
}


菜单实现如下:
#define  uchar  unsigned char
#define  M_MENU_NUM 8
#define  PAGE_DISP_NUM  4
uchar key_val;
// 按键值定义
#define KV_NO                      0          // 无
#define KV_UP                      1          // 上
#define KV_DN                      2          // 下
#define KV_MD                      3          // 中
#define KV_LF                      4          // 左
#define KV_RT                      5          // 右

typedef struct _MENU_PRMT
{
     uchar Cursor;             // 光标值(当前光标位置)
     uchar PageNo;             // 菜单页(显示开始项)
     uchar Index;             // 菜单索引(当前选择的菜单项)
     uchar DispNum;             // 显示项数(每页可以现在菜单项)
     uchar MaxPage;             // 最大页数(最大有多少种显示页)
} MENU_PRMT;

MENU_PRMT MenuPrmt;//extern

/**************************************************************************************
* FunctionName   : Menu_Null()
* Description    : 空函数
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void Menu_Null(void)
{
    ;
}

// 菜单执行
typedef struct _MENU_TABLE
{
     uchar *MenuItem;            // 菜单项目名称
     void (*ItemHook)(void);                    // 要运行的菜单函数
}MENU_TABLE;

MENU_TABLE        MMenu[M_MENU_NUM] =                                                                           // 管理菜单
{
        {"1.时间设定      ", Menu_Null},                                                           // 时钟设置
        {"2.系统参数      ", Menu_Null},                                                   // 参数设置
        {"3.教学参数      ", Menu_Null},                                                   // 教学参数

        {"4.下载参数      ", Menu_Null},                                                   // 下载参数
        {"5.清除存储      ", Menu_Null},                                                   // 清除存储
        {"6.校对速度      ", Menu_Null},                                                   // 速度校对
        {"7.退出管理      ", Menu_Null},                                                           // 退出管理
        {"8.其他设置      ", Menu_Null},                                                           // 其他设置
};
/**************************************************************************************
* FunctionName   : AppMenuPrmtInit()
* Description    : 初始化菜单参数
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void AppMenuPrmtInit(void)
{
    MenuPrmt.Cursor  = 0;                                                                                 // 光标清零
        MenuPrmt.PageNo         = 0;                                                                                 //        页清零
        MenuPrmt.Index   = 0;                                                                                 //        索引清零
}

/**************************************************************************************
* FunctionName   : App_MenuSet()
* Description    : 设置菜单显示
* EntryParameter : num - 页菜单显示项,page - 最多页数
* ReturnValue    : None
**************************************************************************************/
void App_MenuSet(uint8 num, uint8 page)
{
        MenuPrmt.DispNum = num;                                                                             //        页最多显示项目数
        MenuPrmt.MaxPage = page;                                                                         //        最多页数
}

/**************************************************************************************
* FunctionName   : App_MenuDisplay()
* Description    : 显示菜单
* EntryParameter : page - 显示页,dispNum - 每一页的显示项,cursor - 光标位置
* ReturnValue    : None
**************************************************************************************/
void App_MenuDisplay(MENU_TABLE *menu,  uint8 page, uint8 dispNum, uint8 cursor)
{
    uchar i;

        for (i=0  ; i             if (cursor == i)
                {
                  
                  photodisplay(2, i+1, 5); // 反白显示菜单项
                  
                }
                else
                {
                    LCD_12864_string( i+1,3, menu[page+i-1].MenuItem);         // 显示菜单项               
                }
        }
}
            
/**************************************************************************************
* FunctionName   : App_MenuMove()
* Description    : 菜单移动
* EntryParameter : None
* ReturnValue    : 有确认返回0,否则返回1
**************************************************************************************/
uint8 App_MenuMove(uint8 key)
{
    uint8 rValue = 1;

    switch (key)
        {
            case KV_UP:                                                                                                                 // 向上
                    {
                        if (MenuPrmt.Cursor != 0)                                                         // 光标不在顶端
                                {
                                    MenuPrmt.Cursor--;                                                                 // 光标上移
                                }
                                else                                                                                                 // 光标在顶端
                                {
                                    if (MenuPrmt.PageNo != 0)                                                 // 页面没有到最小
                                        {
                                            MenuPrmt.PageNo--;                                                         // 向上翻
                                        }
                                        else
                                        {
                                            MenuPrmt.Cursor = MenuPrmt.DispNum-1;                 // 光标到底
                                                MenuPrmt.PageNo        = MenuPrmt.MaxPage-1;                 // 最后页
                                        }
                                }
                                break;
                        }

                case KV_DN:                                                                                                          // 向下
                    {
                                if (MenuPrmt.Cursor < MenuPrmt.DispNum-1)                // 光标没有到底,移动光标
                                {
                                    MenuPrmt.Cursor++;                                                                 // 光标向下移动
                                }
                                else                                                     // 光标到底
                                {
                                    if (MenuPrmt.PageNo < MenuPrmt.MaxPage-1)            // 页面没有到底,页面移动
                                    {
                                        MenuPrmt.PageNo++;                                                         // 下翻一页
                                    }
                                    else                                                 // 页面和光标都到底,返回开始页
                                    {
                                        MenuPrmt.Cursor = 0;
                                        MenuPrmt.PageNo = 0;
                                    }
                                }
                                break;
                        }

                case KV_MD:                                                                                                                 // 确认
                    {
                        MenuPrmt.Index = MenuPrmt.Cursor + MenuPrmt.PageNo;      // 计算执行项的索引
                                rValue = 0;
                        break;
                        }

                default:break;
        }
        
        return rValue;                                                                                                         // 返回执行索引
}

/**************************************************************************************
* FunctionName   : App_ManageMenu()
* Description    : 管理菜单
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void App_ManageMenu(void)
{
        LCD_12864_string(1, 1, " -= 管理系统 =- ");                                                        // 菜单标题显示
        App_MenuSet(PAGE_DISP_NUM,M_MENU_NUM-PAGE_DISP_NUM+1);                                // 页显示3项,7个菜单项5页显示
        App_MenuDisplay(MMenu, MenuPrmt.PageNo, MenuPrmt.DispNum, MenuPrmt.Cursor); // 显示菜单项

        //if (test != KV_NO)  // 有按键
        
      if(key_flag==1)
      {  
        
        {                                                        
                if (App_MenuMove(test) == 0x00)                                                                // 菜单移动
                {
                       Clear_GDRAM();                                                                                // 清屏
                        MMenu[MenuPrmt.Index].ItemHook();                                                        // 执行相应项
                }
                key_flag=0;
                test = KV_NO;                                                                                        // 清除按键值
        }
}
}
此帖出自NXP MCU论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(高级)

26
 

回复 24楼 zhaojun_xf 的帖子

还有这儿是主函数  :
#include "msp430g2553.h"
#include "KEY_OPER.c"
#include "mokuai_12864.c"
#include "Menu_function.c"


void main(  )
{
  // Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
   int_port();
   lcdinit();
   KEY_Port_Init();//中断方式
   AppMenuPrmtInit();
   
   P2DIR |= BIT3;//LCD供电
   P2OUT |= BIT3;
   _EINT();//全局中断使能
   
   App_ManageMenu();
      while(1);
}
此帖出自NXP MCU论坛

点评

你的程序太长,这样看是看不错问题的。主要应该注意几个方面: 1. 是否有按键按下; 2. 按键值是否传递到菜单中; 3. 显示项值是否变化了。 最后注意以下,你的菜单管理函数怎么在while之前?难度你是通过中  详情 回复 发表于 2012-11-14 09:04
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

27
 

回复 27楼 shan_99 的帖子

你的程序太长,这样看是看不错问题的。主要应该注意几个方面:

1. 是否有按键按下;
2. 按键值是否传递到菜单中;
3. 显示项值是否变化了。

最后注意以下,你的菜单管理函数怎么在while之前?难度你是通过中断显示的?如果不是必须在while里边调用菜单管理函数,否则按键按下,并传递到显示项中,但由于没有运行菜单管理,无法实现菜单的滚动显示。
此帖出自NXP MCU论坛

点评

楼主,我按你说的修改了后菜单已经能滚动了,但还是有一些小问题,我再好好修改哈!谢谢你哈!对了,楼主你能加我为QQ好友吗?以后有问题还向你请教,希望你不介意!我的QQ:1719097450  详情 回复 发表于 2012-11-15 19:26
 
个人签名我的博客
 
 

回复

67

帖子

0

TA的资源

一粒金砂(高级)

28
 

回复 28楼 zhaojun_xf 的帖子

楼主,我按你说的修改了后菜单已经能滚动了,但还是有一些小问题,我再好好修改哈!谢谢你哈!对了,楼主你能加我为QQ好友吗?以后有问题还向你请教,希望你不介意!我的QQ:1719097450
此帖出自NXP MCU论坛

点评

楼主,我的菜单能翻滚了 但是翻滚的不正常、很乱,我分析排除错误后发现是显示菜单和反白显示函数的问题,所以能不能麻烦楼主你把你这个程序对应的这两个LCD显示函数( LCMDisplayStrRvs(0, (i+1)*2, menu[page+i  详情 回复 发表于 2012-11-21 10:59
已经加了你的QQ,不过希望有问题就在论坛发帖,可以帮助其他网友一起成长。  详情 回复 发表于 2012-11-16 13:33
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

29
 

回复 29楼 shan_99 的帖子

已经加了你的QQ,不过希望有问题就在论坛发帖,可以帮助其他网友一起成长。
此帖出自NXP MCU论坛

点评

蒽、好的 了解  详情 回复 发表于 2012-11-16 14:44
 
个人签名我的博客
 
 

回复

67

帖子

0

TA的资源

一粒金砂(高级)

30
 

回复 30楼 zhaojun_xf 的帖子

蒽、好的  了解
此帖出自NXP MCU论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(高级)

31
 

回复 29楼 shan_99 的帖子

楼主,我的菜单能翻滚了 但是翻滚的不正常、很乱,我分析排除错误后发现是显示菜单和反白显示函数的问题,所以能不能麻烦楼主你把你这个程序对应的这两个LCD显示函数(   LCMDisplayStrRvs(0, (i+1)*2, menu[page+i].MenuItem); // 反白显示菜单项,, LCMDisplayStr(0, (i+1)*2, menu[page+i].MenuItem);      )发给我看一下
此帖出自NXP MCU论坛
 
 
 

回复

5310

帖子

453

TA的资源

五彩晶圆(高级)

32
 
楼主能不能把18种情况 中的界面变化顺序做个标号啊!,我还是没看明白
此帖出自NXP MCU论坛

点评

顺序是从左往右,从上到下。。。。。。。。。  详情 回复 发表于 2012-11-21 16:42
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

33
 

回复 33楼 蓝雨夜 的帖子

顺序是从左往右,从上到下。。。。。。。。。
此帖出自NXP MCU论坛

点评

实现是上,下键吗?  详情 回复 发表于 2012-11-21 16:52
 
个人签名我的博客
 
 

回复

5310

帖子

453

TA的资源

五彩晶圆(高级)

34
 

回复 34楼 zhaojun_xf 的帖子

实现是上,下键吗?
此帖出自NXP MCU论坛

点评

上下键翻滚菜单,OK键(中间键)是执行菜单。。  详情 回复 发表于 2012-11-21 16:54
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

35
 

回复 35楼 蓝雨夜 的帖子

上下键翻滚菜单,OK键(中间键)是执行菜单。。
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

5310

帖子

453

TA的资源

五彩晶圆(高级)

36
 
如我一直按向下键,第一排,123,再按就是到第二排左边第一个
此帖出自NXP MCU论坛

点评

错误,如果到了123,光标在第3上面,再下翻,应该是234,光标不动,在第4个上面。。。光标先是下移,移到最后一行,光标不动,菜单上移;反之,光标上移,移到最上一行,光标不动,菜单下翻,你可以看看你的手机菜单  详情 回复 发表于 2012-11-21 17:00
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

37
 

回复 37楼 蓝雨夜 的帖子

错误,如果到了123,光标在第3上面,再下翻,应该是234,光标不动,在第4个上面。。。光标先是下移,移到最后一行,光标不动,菜单上移;反之,光标上移,移到最上一行,光标不动,菜单下翻,你可以看看你的手机菜单,很类似的。。。。。。。。。。

[ 本帖最后由 zhaojun_xf 于 2012-11-21 17:01 编辑 ]
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

176

帖子

0

TA的资源

一粒金砂(中级)

38
 
认真学习一下,谢谢
此帖出自NXP MCU论坛
 
 
 

回复

977

帖子

4

TA的资源

纯净的硅(中级)

39
 
受教了!!!!!
此帖出自NXP MCU论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

40
 

回复 沙发 zhaojun_xf 的帖子

真的是 好东西啊!!
此帖出自NXP MCU论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表