搜索
bottom↓
回复: 12

keil c语言

[复制链接]

出0入0汤圆

发表于 2011-12-9 16:24:46 | 显示全部楼层 |阅读模式
怎么实现多功能按键?即在按下设置键后,再按键进行相关配置,最后按确定键确定刚才的设置,请问这个程序怎样写?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-12-9 17:03:30 | 显示全部楼层
你说的这么不具体我们怎么帮你呢,如果你有屏幕的,就做个菜单

出0入0汤圆

发表于 2011-12-9 17:05:11 | 显示全部楼层
纯软件的设计问题。。
把所有键都搞成编码,每个键对应一个号。
把设置操作产生的编码存入数组。。
然后校验,执行对应操作。。

出0入0汤圆

发表于 2011-12-9 17:24:28 | 显示全部楼层
可以设置一个一个变量 num  每次按键让num++  (例如: if(anjian==0) {num++;if(num>=4) num=0;}); 然后去判断num的值进行相关配置  num有三个值可以给你用的。。

出0入0汤圆

发表于 2011-12-9 17:57:02 | 显示全部楼层
回复【1楼】prozm
-----------------------------------------------------------------------
你好像得用至少两个键来实现吧,一个用来显示光标,另一个用来调节,你去网上搜下带有年月日的时钟程序,那应该有(我也不太懂,是个新手)

出0入0汤圆

发表于 2011-12-9 21:41:06 | 显示全部楼层
#ifndef                _MENU_H_
#define     _MENU_H_                 

#include"AT89X52.h"
#include"LCD1602.h"

#define KEY_NULL         0x00
#define KEY_ESC                0x01
#define KEY_SET                0x08
#define KEY_UP                0x02
#define KEY_DOWN        0x04

///-----------------------------------------------
//          LCD相关定义
///-----------------------------------------------
#define         LCD_MAX_DISP_LINES        (2)


///--------------------------------------------------------------------
//  MENU相关定义
///--------------------------------------------------------------------
#define IS_ROOTMENU                        0xFF
#define NOT_ROOTMENU                0x00
//菜单类型:正常菜单,选项型菜单(返回一数值),显示信息型菜单(显示一定信息)
#define MENUTYPE_NORMAL                0x01
#define MENUTYPE_OPTION                0x02
#define MENUTYPE_DISP                0x03

//--------------------------------------------------------------------*
//  目录结构体定义
//---------------------------------------------------------------------*/
struct  MenuItem                                                //typedef
{
        char         CurLevelMenuMaximum;                //本级菜单的最大个数
        char         *DisplayString;                                //菜单条显示内容
        void         (*CurrentOperator)();                //该菜单需要的操作函数指针
        struct         MenuItem *ChildrenMenus;        //子菜单指针
        struct         MenuItem *ParentMenus;                //父菜单指针
        unsigned char         MenuType;                                //菜单类型:正常菜单,选项型菜单(返回一数值),显示信息型菜单(显示一定信息)
        unsigned char   *ReturnParameter;        //返回参数
}        Null;

unsigned char Para = 3;

void         NullOperator(void)
{                                                }

//--------------------------------------------------------------------*
//  菜单数组声明
//---------------------------------------------------------------------*/
struct         MenuItem RootMenu[4];
struct         MenuItem RunState[3];
struct         MenuItem SetTime[1];
struct         MenuItem SetDateTime[1];

//--------------------------------------------------------------------*
// 全局变量定义声明区*
//---------------------------------------------------------------------*/
struct         MenuItem (*MenuPoint) = RootMenu;
char         DisplayStart = 0;
char         UserChoose = 0;
char         DisplayPoint = 0;
char         MaxItems;
unsigned         char NullParameter = 0;
unsigned         char Option = 0;


//--------------------------------------------------------------------*
//        char CurLevelMenuMaximum;                //本级菜单的最大个数
//        char *DisplayString;                        //菜单条显示内容
//        void (*CurrentOperator)();                //该菜单需要的操作函数指针
//        struct MenuItem *ChildrenMenus;        //子菜单指针
//        struct MenuItem *ParentMenus;        //父菜单指针
//---------------------------------------------------------------------*/
const unsigned char RootMenu_RunState[] = {"  1.OpenSystem "};
const unsigned char RootMenu_SetTime [] = {"  2.SetPasword "};
const unsigned char RootMenu_DataOper[] = {"  3.DataOper   "};
const unsigned char RootMenu_SysInfo [] = {"  4.SysInfo    "};

struct MenuItem xdata RootMenu[4]=        //根目录菜单
{
        {4,RootMenu_RunState,NullOperator ,RunState,&Null,MENUTYPE_NORMAL,&NullParameter},
        {4,RootMenu_SetTime ,NullOperator ,SetTime ,&Null,MENUTYPE_NORMAL,&NullParameter},//SetDateTime
        {4,RootMenu_DataOper,NullOperator ,&Null   ,&Null,MENUTYPE_NORMAL,&NullParameter},//
        {4,RootMenu_SysInfo ,NullOperator ,&Null   ,&Null,MENUTYPE_NORMAL,&NullParameter},
};

const unsigned char RunState0[] = {"  2400          "};
const unsigned char RunState1[] = {"  4800          "};
const unsigned char RunState2[] = {"  9600          "};

struct MenuItem xdata RunState[3]=        //1级目录菜单A
{
        {3,RunState0,NullOperator,&Null,RootMenu,MENUTYPE_OPTION,&Para},
        {3,RunState1,NullOperator,&Null,RootMenu,MENUTYPE_OPTION,&Para},
        {3,RunState2,NullOperator,&Null,RootMenu,MENUTYPE_OPTION,&Para},
};

const unsigned char SetTime0[]  = {"  Test          "};
struct MenuItem xdata SetTime[1]=        //2级目录菜单A
{
        {1,SetTime0,NullOperator,&Null,RootMenu ,MENUTYPE_DISP,&NullParameter},
};

//--------------------------------------------------------------------*
// 函数声明区*
//---------------------------------------------------------------------*/
void sHOWMENU(void);
void KeyProcess_MenuUpdate(unsigned char KeyNum);

//------------------------------------------------------------------*
// 函数说明:目录显示函数*
//------------------------------------------------------------------*/
void        sHOWMENU(void)
{                char StrTemp[17];
                unsigned char i = 0x00;
                bit M;
                MaxItems     = MenuPoint[0].CurLevelMenuMaximum;
                DisplayPoint = DisplayStart;

                if (MaxItems >= 2)
                        {        for (i = 0;i < LCD_MAX_DISP_LINES;i++)
                                        {        WrintStringFor_LCD1602(i,0,MenuPoint[DisplayPoint].DisplayString);
                                                if (MenuPoint[DisplayPoint].MenuType != MENUTYPE_DISP)       
                                                        {        if ((DisplayPoint) == UserChoose)
                                                                        {Set_LCD1602(0,i,0x7e);}
                                                                else
                                                                        {Set_LCD1602(0,i,' ');}
                                                                WrintStringFor_LCD1602(1,i,StrTemp);
                                                        }
                                                else{        WrintStringFor_LCD1602(0,i,StrTemp);}
                                                DisplayPoint += 1;
                                                if ((DisplayPoint) == (MaxItems))
                                                {
                                                                DisplayPoint = 0;
                                                }       
                                        }
                        }
                else{        for (i = 0; i < MaxItems;i++)
                                        {        WrintStringFor_LCD1602(i,0,MenuPoint[DisplayPoint].DisplayString);
                                                if (MenuPoint[DisplayPoint].MenuType != MENUTYPE_DISP)
                                                {        if ((DisplayPoint) == UserChoose)
                                                                {        Set_LCD1602(0,i,0x7e);        }
                                                        else{   Set_LCD1602(0,i, ' ');  }
                                                        WrintStringFor_LCD1602(1,i,StrTemp);
                                                }
                                                else        {   WrintStringFor_LCD1602(0,i,StrTemp);}
                                                DisplayPoint += 1;
                                                if ((DisplayPoint) == (MaxItems))
                                                                {        DisplayPoint = 0;                }
                                        }
                                //-----------------------------------------------------------------------/
                                //TODO:当该级菜单数<LCD能显示的行数,有些行需要显示空白
                                for (i= MaxItems;i < LCD_MAX_DISP_LINES;i++)
                                {
                                                WrintStringFor_LCD1602(0, i, "                ");
                                }
                                //-----------------------------------------------------------------------*/
                        }
}

//--------------------------------------------------
// [按键说明] *
// ----------------------------------- *
// [K1] KEY_UP(向上) *
// [K5] KEY_DOWN(向下) *
// [K2] KEY_ENTER(确定) *
// [K6] KEY_ESC(后退) *
//---------------------------------------------------/
void         KeyProcess_MenuUpdate(unsigned char KeyNum)
{                if (KeyNum != KEY_NULL)
                {        switch (KeyNum)
                        {        case KEY_UP:
                                         UserChoose --;
                                         if (UserChoose < 0)
                                                 {        UserChoose = MaxItems - 1;}
                                         Option --;
                                         if (Option >= MenuPoint[0].CurLevelMenuMaximum)
                                                 {        Option = MenuPoint[0].CurLevelMenuMaximum - 1;}
                                         break;
                                case KEY_ESC:
                                         if (MenuPoint[0].ParentMenus != &Null)
                                                 {        MenuPoint    = MenuPoint[0].ParentMenus;
                                                         UserChoose   = 0;
                                                        DisplayPoint = *MenuPoint[0].ReturnParameter;
                                                 }
                                         break;
                                case KEY_DOWN:
                                         UserChoose ++;
                                         if (UserChoose == MaxItems)
                                                 {        UserChoose = 0;        }
                                         Option++;
                                         if (Option >= MenuPoint[0].CurLevelMenuMaximum)
                                                 {        Option = 0;                }
                                         break;
                                case KEY_SET:
                                         if (MenuPoint[UserChoose].CurrentOperator != NullOperator)
                                                 { (*MenuPoint[UserChoose].CurrentOperator)(); }
                                         //如果菜单类型不是“正常型MENUTYPE_NORMAL”,则按KEY_SET键返回上一级菜单
                                         if ( MenuPoint[DisplayPoint].MenuType != MENUTYPE_NORMAL )
                                                {        if (MenuPoint[UserChoose].ParentMenus != &Null)                //如果操作函数不为空并且子菜单不为空,则进行菜单切换
                                                                {   * MenuPoint[0].ReturnParameter = Option;        //保存选择参数
                                                                        MenuPoint = MenuPoint[UserChoose].ParentMenus;
                                                                        UserChoose = 0;
                                                                        DisplayStart = 0;
                                                                }
                                         }
                                         else
                                                 {        if (MenuPoint[UserChoose].ChildrenMenus != &Null)        //如果操作函数不为空并且子菜单不为空,则进行菜单切换
                                                                {        MenuPoint = MenuPoint[UserChoose].ChildrenMenus;
                                                                        UserChoose        = * MenuPoint[0].ReturnParameter;
                                                                        DisplayStart = UserChoose;
                                                                        Option = UserChoose;
                                                                }
                                                }
                                        break;
                        }
                        if ((UserChoose < DisplayStart) || (UserChoose > (DisplayStart+(LCD_MAX_DISP_LINES-1))))
                                {        DisplayStart = UserChoose;                } //菜单翻页
                        sHOWMENU();
                }       
}

#endif
嘿嘿这是论坛里大神的,我正在学,表示很多看不懂

出0入0汤圆

 楼主| 发表于 2011-12-10 08:29:38 | 显示全部楼层
回复【6楼】hepday
-----------------------------------------------------------------------

谢谢,回去学习》回复【1楼】prozm
-----------------------------------------------------------------------

回复【1楼】prozm
-----------------------------------------------------------------------

模式     清零

左移     增加

取消     设定
上面就是键盘的界面,大致的功能如上所述。

出0入0汤圆

发表于 2011-12-10 17:40:18 | 显示全部楼层
这个好写吧,先找一下相关资料

出0入0汤圆

发表于 2011-12-11 10:51:20 | 显示全部楼层
在这里我还没找到一个可以帮我解决zigbee模块问题的朋友啊。哭~~%>_<%

出0入0汤圆

发表于 2011-12-14 14:32:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-14 22:02:15 | 显示全部楼层
如何学好程序?

出0入0汤圆

发表于 2012-2-27 22:27:12 | 显示全部楼层
同2楼意见。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 03:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表