打印

请教如何通过三个按键进行多功能设置

[复制链接]
6412|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
请教各位老师,我想用三个按键对多种功能进行设置,一个是设置键,另2个是左右选择键(或加减键也可)。
设置效果通过液晶显示。液晶用128*64,做了4行菜单栏,每行菜单栏有几个功能选项。我想通过设置键在不同行的菜单栏之间切换,通过左右按键选择每行的某个功能。但如果比如在第一行选择第二个功能,再跳到第二行设置,已经选定第二行第二个功能,请问怎样才能分别对每行设置。按键的部分程序如下:k1设置键 k2,k3是左右选择键,a用于在各行菜单之间切换,b,c,d分别用于在第一,第二,第三行中的某个功能切换
void key()
{
if(k1==0)
{delayms(10);
   if(k1==0)
   {
  a++;
  if(a>2)
  {a=0;}
  while(k1==0);
  }
}
  if(k2==0)
{delayms(10);
   if(k2==0)
   {
  b++;c++;d++;
  if(b>2)
  {b=2;}
  if(c>4)
  {c=4;}
  if(d>4)
  {d=4;}
  while(k2==0);
  }
}
  if(k3==0)
{delayms(10);
   if(k3==0)
   {
  b--;c--;d--;
  if(b<1)
  {b=1;}
  if(c<1)
  {c=1;}
  if(d<1)
  {d=1;}
  while(k3==0);
  }
}
}

相关帖子

沙发
zuoyou| | 2011-2-25 14:46 | 只看该作者
如果KEYPAD少的话,你的LCD界面也应间单点,如每行仅一个功能

使用特权

评论回复
板凳
ayb_ice| | 2011-2-25 15:02 | 只看该作者
合理维护状态即可,同一个键在不同的状态下执行不同的功能

使用特权

评论回复
地板
xjycug| | 2011-2-25 23:37 | 只看该作者
三个键可以有多种组合,比如长按,短按,两键组合按,主要将程序编好,每个按键都独立做一个属性,能判断键是短按还是长按,然后程序中在组合判断。可以实现很多人机功能。

使用特权

评论回复
5
milktang|  楼主 | 2011-2-28 08:35 | 只看该作者
我根据不同键值的状态好像可以了

使用特权

评论回复
6
coody| | 2011-2-28 10:33 | 只看该作者
参考3键电子表的设计

使用特权

评论回复
7
hgjinwei| | 2011-2-28 20:19 | 只看该作者
加上状态**,两个键就能整出想要的一切,数字系统还不是只有0和1

使用特权

评论回复
8
milktang|  楼主 | 2011-3-3 12:40 | 只看该作者
请问6L有3键电子表的资料吗,谢谢!

使用特权

评论回复
9
云痕| | 2011-3-3 12:48 | 只看该作者
2个按键就可以做一个完整的多级菜单功能了,我年前做的就是这样的。把所有的菜单栏定义为节点,左键确定右键移动,再+个特殊域做上翻就可以了

使用特权

评论回复
10
huangqi412| | 2011-3-3 13:35 | 只看该作者
1个按键通过长短击,也可以操作。按键越少,操作越麻烦。
先在纸上画菜单状态转换图。。。

使用特权

评论回复
11
milktang|  楼主 | 2011-4-6 09:21 | 只看该作者
感谢大家帮助!

使用特权

评论回复
12
abin0415| | 2011-4-7 13:09 | 只看该作者
设置标志位

使用特权

评论回复
13
funfactory| | 2011-4-9 19:54 | 只看该作者
在做参考,嘿嘿!

使用特权

评论回复
14
流氓兔v| | 2011-4-10 19:09 | 只看该作者
本帖最后由 流氓兔v 于 2011-4-10 21:31 编辑

做电子播放琴,,,,,昨天刚研究出来的无限添加菜单系统。
一个键有三种状态,键前沿,长按键,1S后产生作用键

使用方法:

先定义一个类似数据库结构体
#define FOCUS_VICE_OFF 1//子菜单作用——伴音声音设置——关

#define FOCUS_VICE_ON 2//子菜单作用——伴音声音设置——开

#define MAX_ITEM_VICE 2
Item_struct code Item_vice_voice[MAX_ITEM_VICE]={        {"OFF",FOCUS_VICE_OFF},
                                                                                                           {"ON",FOCUS_VICE_ON}};
#define MAX_ITEM_MUSIC 2
Item_struct code Item_vice_list[2]={        {"caimugu",0},
                                                                                   {"youling",0}};
#define MAX_MENU_KEY 2
Menu_struct code Main_menu_key[MAX_MENU_KEY]={        {"musiclist", MAX_ITEM_VICE, Item_vice_list},
                                                                                         {"bangyin", MAX_ITEM_MUSIC, Item_vice_voice}};

void key_function_key(void)
{
        if(Item_focus==FOCUS_VICE_OFF)
        {
                Flag_key_on=1;                                        //开启演奏
                Flag_beep2=0;                                        //关闭伴音
        }
        if(Item_focus==FOCUS_VICE_ON)
        {
                Flag_key_on=1;                                        //开启演奏
                Flag_beep2=1;                                        //开启伴音
        }
}
void default_display_key(void)
{
        LCD_prints(0, 0, "Key Play Music");
}


调用:



menu(MAX_MENU_KEY, Main_menu_key, default_display_key, key_function_key);

子函数:
/********************************************
* 名称:两层菜单函数
* 平台:        AT89S52  12M晶振
* 编写:abao 2011-4-9
* 修改:
* 描述: 1.0版本                  
********************************************/
uint8 Item_focus;                //子菜单焦点(决定菜单的作用)
bit Flag_menu_on;                //菜单标志
bit Flag_item_on;                //子菜单标志
uint8 Menu_order;                //菜单次序
uint8 Item_order;                //子菜单次序

void menu(uint8 max_menu, Menu_struct code *Main_menu, void (*default_display)(void), void (*key_function)(void))
{
        if(Flag_menu_on)                                //开启菜单
        {
                if(Flag_item_on)                        //子菜单
                {
                        if(MENU_KEY_NEXT)                //前一个选项
                        {
                                MENU_KEY_NEXT=0;
                                if(Item_order<Main_menu[Menu_order].item_max-1)
                                {
                                        LCD_clean();
                                        ++Item_order;
                                }
                        }
                        if(MENU_KEY_PRE)                //后一个选项
                        {
                                MENU_KEY_PRE=0;
                                if(Item_order>0)
                                {
                                        LCD_clean();
                                        --Item_order;
                                }
                        }
                        LCD_prints(5, 0, Main_menu[Menu_order].menu_name);
                        LCD_printc(0, 1, 0x7e); //显示→
                        LCD_prints(1, 1, Main_menu[Menu_order].item_struct[Item_order].item_name);
                        if(MENU_KEY_YES)                //子菜单功能选中
                        {
                                MENU_KEY_YES=0;
                                LCD_clean();
                                Flag_menu_on=0;                //关闭菜单               
                                Flag_item_on=0;                //关闭子菜单
                                Item_focus=Main_menu[Menu_order].item_struct[Item_order].item_focus;
                                (*key_function)();                                //按键作用
                        }
                }else                                                //菜单
                {
                        if(MENU_KEY_NEXT)                //前一个选项
                        {
                                MENU_KEY_NEXT=0;
                                if(Menu_order<max_menu-1)
                                {
                                        LCD_clean();
                                        ++Menu_order;
                                }
                        }
                        if(MENU_KEY_PRE)                //后一个选项
                        {
                                MENU_KEY_PRE=0;
                                if(Menu_order>0)
                                {
                                        LCD_clean();
                                        --Menu_order;
                                }
                        }

                        LCD_prints(5, 0, "Eenu");
                        LCD_printc(0, 1, 0x7e); //显示→
                        LCD_prints(1, 1, Main_menu[Menu_order].menu_name);
                        if(MENU_KEY_YES)                //开启子菜单
                        {
                                MENU_KEY_YES=0;
                                LCD_clean();               
                                Flag_item_on=1;                //开启子菜单
                        }
                }
        }else
        {
                (*default_display)();                //默认显示
        }

         if(MENU_KEY_YES)
        {
                MENU_KEY_YES=0;
                LCD_clean();               
                Flag_menu_on=1;                                //开启菜单
        }
        if(MENU_KEY_NO)                                        //取消键
        {
                MENU_KEY_NO=0;
                LCD_clean();               
                Flag_menu_on=0;                                //关闭菜单
                Flag_item_on=0;                                //关闭子菜单
        }
        if(KEY_HOME)
        {
                Flag_menu_on=0;                                //关闭菜单
                Flag_item_on=0;                                //关闭子菜单
        }
}

按键子菜单,8MS循环一次:

/********************************************
* 函数:读矩阵键盘
* 输入:K0~K15
* 输出:Key_Flag0,Key_Flag1,EKey_Flag0,EKey_Flag1
* 使用:key_read();
********************************************/

sbit IOROW1=P1^0;                        //第1 行按键
sbit IOROW2=P1^1;                        //第2 行按键
sbit IOROW3=P1^2;                        //第3 行按键
sbit IOROW4=P1^3;                        //第4 行按键

uint8 Key_Time;                                //读键去抖延时
uint8 Lkey_time;                        //长按键延时时间
bit Lkey_state;                                //长按键状态
bit Lkey_flag;                                //长按标志
uint8 bdata Key_Flag0;                //KEY0
sbit K0=Key_Flag0^0;
sbit K1=Key_Flag0^1;
sbit K2=Key_Flag0^2;
sbit K3=Key_Flag0^3;
sbit K4=Key_Flag0^4;
sbit K5=Key_Flag0^5;
sbit K6=Key_Flag0^6;
sbit K7=Key_Flag0^7;
uint8 bdata Key_Flag1;                 //KEY1按键状态
sbit K8=Key_Flag1^0;
sbit K9=Key_Flag1^1;
sbit K10=Key_Flag1^2;
sbit K11=Key_Flag1^3;
sbit K12=Key_Flag1^4;
sbit K13=Key_Flag1^5;
sbit K14=Key_Flag1^6;
sbit K15=Key_Flag1^7;
uint8 bdata EKey_Flag0;                //KEY0键前沿
sbit EK0=EKey_Flag0^0;
sbit EK1=EKey_Flag0^1;
sbit EK2=EKey_Flag0^2;
sbit EK3=EKey_Flag0^3;
sbit EK4=EKey_Flag0^4;
sbit EK5=EKey_Flag0^5;
sbit EK6=EKey_Flag0^6;
sbit EK7=EKey_Flag0^7;
uint8 bdata EKey_Flag1;                //EKEY1键前沿
sbit EK8=EKey_Flag1^0;
sbit EK9=EKey_Flag1^1;
sbit EK10=EKey_Flag1^2;
sbit EK11=EKey_Flag1^3;
sbit EK12=EKey_Flag1^4;
sbit EK13=EKey_Flag1^5;
sbit EK14=EKey_Flag1^6;
sbit EK15=EKey_Flag1^7;         
uint8 bdata LKey_Flag0;                //KEY0长按键
sbit LK0=LKey_Flag0^0;
sbit LK1=LKey_Flag0^1;
sbit LK2=LKey_Flag0^2;
sbit LK3=LKey_Flag0^3;
sbit LK4=LKey_Flag0^4;
sbit LK5=LKey_Flag0^5;
sbit LK6=LKey_Flag0^6;
sbit LK7=LKey_Flag0^7;
uint8 bdata LKey_Flag1;                 //KEY1长按键状态
sbit LK8=LKey_Flag1^0;
sbit LK9=LKey_Flag1^1;
sbit LK10=LKey_Flag1^2;
sbit LK11=LKey_Flag1^3;
sbit LK12=LKey_Flag1^4;
sbit LK13=LKey_Flag1^5;
sbit LK14=LKey_Flag1^6;
sbit LK15=LKey_Flag1^7;
//读矩阵键盘
void key_read(void)                                       
{
        uint8  Key_Temp0, Key_Temp1;        //临时键        
        P1 = 0xff;                                                //扫描第2行键
        IOROW1= 0;                        
        Key_Temp0 = ((P1 & 0xf0) ^ 0xf0)>> 4;
        P1= P1 | 0xff;                                        //扫描第1行键
        IOROW2= 0;                  
        Key_Temp0 = Key_Temp0 + ((P1 & 0xf0) ^ 0xf0);
        P1= P1 | 0xff;                                   //扫描第4行键
        IOROW3= 0;
        Key_Temp1 =((P1 & 0xf0) ^ 0xf0)>> 4;        
        P1= P1 | 0xff;                                        //扫描第3行键
        IOROW4= 0;
        Key_Temp1 = Key_Temp1 + ((P1 & 0xf0) ^ 0xf0);

        if((Key_Temp0 != EKey_Flag0) || (Key_Temp1 != EKey_Flag1))        //按键去抖
        {
                if( !Key_Time )
                {        
                        EKey_Flag0 = (Key_Flag0 ^ Key_Temp0) & Key_Temp0;                                
                        EKey_Flag1 = (Key_Flag1 ^ Key_Temp1) & Key_Temp1;
                        Key_Flag1 = Key_Temp1;
                        Key_Flag0 = Key_Temp0;
                        ++Lkey_time;
                        if(Lkey_state)
                        {
                                if(Lkey_time==25)//200ms
                                {
                                        Lkey_time=0;
                                        Lkey_flag=1;
                                }else
                                {
                                        Lkey_flag=0;                 
                                }
               
                        }else
                        {
                                if(Lkey_time==125)//长按键1s
                                {
                                        Lkey_time=0;
                                        Lkey_state=1;
                                        Lkey_flag=1;
                                }else
                                {
                                        Lkey_flag=0;                 
                                }
                }                                                                                
                }else
                {
                        --Key_Time;
                        Key_Temp1 = Key_Flag1;
                        Key_Temp0 = Key_Flag0;
                }               
        }else
        {
                Lkey_state=0;                                //长按键标志清0 长按键第一次延迟1S响应
                 Lkey_time=0;                                //长按键延时时间清0
                Key_Time = 2;
                EKey_Flag1 = 0;
                EKey_Flag0 = 0;
                Key_Flag1 = Key_Temp1;
                Key_Flag0 = Key_Temp0;
        }

        if(Lkey_flag)                                        //长按键标志为1
        {
                LKey_Flag0 = Key_Flag0;
                LKey_Flag1 = Key_Flag1;
        }else
        {
                LKey_Flag0 = 0;
                LKey_Flag1 = 0;
        }                                       
}

使用特权

评论回复
15
sysdriver| | 2011-4-10 20:32 | 只看该作者
本帖最后由 sysdriver 于 2011-4-10 20:34 编辑

LS是怎么对齐的?难道是复制后一个个移动的?那就太有毅力了!
可以选高级回复,然后里面有个插入代码的
 
void key_function_key(void)
{
        if(Item_focus==FOCUS_VICE_OFF)
        {
                Flag_key_on=1;
                Flag_beep2=0;
        }
        if(Item_focus==FOCUS_VICE_ON)
        {
                Flag_key_on=1;
                Flag_beep2=1;
        }
}

使用特权

评论回复
16
流氓兔v| | 2011-4-10 21:26 | 只看该作者
我直接复制黏贴的,,,由于句子比较长,刚试了下,反而会错位。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

267

帖子

4

粉丝