找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 986|回复: 0
打印 上一主题 下一主题
收起左侧

单片机编码器菜单操作及数据快速输入含长/短按,快慢转子程序

[复制链接]
跳转到指定楼层
楼主
ID:309610 发表于 2022-10-16 23:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本单片机程序使用1Ms定时器唤醒查询
KEY_bmq ();放入1-5ms 的定时器中断中修改相应的时间即可
菜单操作模式语数据输入模式采用置位menu_key切换, 1=数据输入模式/0=菜单选择模式
默认使用菜单模式,上翻,下翻,确认,返回
菜单选择进入数据修改时menu_key置1,修改完保存menu_key置零回到菜单模式
数据输入模式分快慢档位,慢速旋转+—1,快速旋转进入+-10,再快速旋转+-100。3秒无旋转减档
30秒无动作退出菜单。
多级菜单程序还学习中,需要一个包含多种测量主程序,大量参数显示、修改、保存又便于维护修改,
通用性强的菜单框架。一直没找到通俗易懂易用51多级菜单程序。希望给个推荐
自学瞎编的程序,大神勿喷.

#include "C8051F410.h"   //本人使用的是C8051F410单片机其他51改成相应的头文件
#include "KEY_BMQ.h"  
#include "menu.H"        //多级菜单子程序  

sbit KEY_A =P1^6;
sbit KEY_B =P1^7;
sbit KEY_C =P1^5;

bit key_a;   //a相状态暂存
bit key_b;   //b相状态暂存
bit key_c;   //c按键状态暂存
bit key_zj;   //正传标志
bit key_fj;  //反转标志
bit key_cj;   //c按键标志

xdata uint key_zj_time;   //加脉冲计时
xdata uint key_fj_time;   //反脉冲计时
xdata uint key_cj_time;   //c按键计时

xdata uint key_k_time;     //空闲计时

bit   key_dj ;       //换挡计时标志        有快速旋转标志
xdata uint  key_d_time;           //换挡计时 快速旋转时计数
xdata uchar key_d_num;     //换挡计数 快速旋转量
xdata uint  key_jd_time;   //减档计时
xdata uchar key_hd;        //档位

bit   MENU;           //c相动作
bit   MUN;
bit menu_key;                     // 1=数据输入模式/0=菜单选择模式
#define zheng_man   KEY_M=1       //慢速正传执行动作        向下
#define zheng_kuai  KEY_M=2       //快速正传执行动作        向下
#define fan_man     KEY_M=3       //慢速反转执行动作        向上
#define fan_kuai    KEY_M=4       //快速反转执行动作        向上
#define c_chang     KEY_M=5       //按键c长按执行动作        打开菜单
#define c_duan      KEY_M=6       //按键c短按执行动作   确认
#define Wu_key      KEY_M=7       //30S无按键动作                关闭菜单

extern uchar func_index;      
extern uint numer;

void KEY_bmq (void)
{
  uchar KEY_M;         //功能选择
  uchar key_hd_tmp;
//---------------------------------------------------------------------
if (KEY_A==0 & key_a==1 & KEY_B==1) //  KEY_A为下降沿脉冲 B相低电平为正传
    { key_zj=1;  
          }  
if (key_zj==1)                    //正传计时消抖
    { key_zj_time++; }
        
if (KEY_A==1 & key_zj==1 & key_zj_time>10)      // KEY_A 恢复高电平并且计时大于5ms(消抖)
    {
         if (key_zj_time>100)         //慢转
            {
                 zheng_man;                                 //慢速正传执行动作
                 }                  
      else              
                {
                 zheng_kuai;                         //快速正传执行动作
                 key_d_num++;                         //换挡计数 快速旋转量
                 key_dj=1 ;                                 //换挡计时标志        有快速旋转标志
                 }   
      key_zj_time = 0;            //计时清零
          key_zj=0;                                          //正传标志
          key_k_time=0;              //空闲计时清零
         
      }
//---------------------------------------------------------------------         
if (KEY_B==0 & key_b==1 & KEY_A==1) //  B相为下降沿脉冲 A相高电平为反转
    { key_fj=1;  
          }  
if (key_fj==1)                    //反传计时消抖
    { key_fj_time++; }
        
if (KEY_B==1 & key_fj==1 & key_fj_time>10)      // B相 恢复高电平并且计时大于5ms(消抖)
    {
         if (key_fj_time>100)         //慢转
           {
           fan_man;                           //慢速反转执行动作
           }                  
      else     
           {
            fan_kuai;                                 //快速反转执行动作
                key_d_num++;                         //换挡计数 快速旋转数量
                key_dj=1 ;                                 //换挡计时标志        有快速旋转标志
                 }   
      key_fj_time = 0;            //计时清零
          key_fj=0;                                          //反转标志
          key_k_time=0;              //空闲计时清零
         
      }
//-----------------------------------------------------------------------
if (KEY_C==0 & key_c==1 ) //  C相为下降沿脉冲
    { key_cj=1;  
          }  
if (key_cj==1)                    //C相计时消抖
    { key_cj_time++; }
        
if (KEY_C==1 & key_cj==1 & key_cj_time>5)      // B相 恢复高电平并且计时大于5ms(消抖)
    {
         if (key_cj_time>300)         //长按
          { c_chang;
//           KEY_M=5;                         //执行功能选择
          }                 //按键c长按执行动作
      else              
                { c_duan;   
//                KEY_M=6;                         //执行功能选择
                  }            //按键c短按执行动作
      key_cj_time = 0;            //计时清零
          key_cj=0;                                         //标志清零
          key_k_time=0;              //空闲计时清零
      }

//------------------------------------------------------------------------
key_a = KEY_A;   
key_b = KEY_B;
key_c = KEY_C;
key_k_time++;  //空闲计时
key_jd_time++;  //减档计时
//------------------------------------------------------------------------
if(key_dj==1)           //换挡计时
   { key_d_time++;}

  if (key_d_num>=4&key_d_time<3000)        //3秒内快速转动4次 加档
    {  if(key_hd<3)                                   //最大档位
            { key_hd++;}                                        //档位+1
         key_dj=0;key_d_num=0; key_d_time=0;   
        }   

  if (key_jd_time>=1500)         //超过2秒无输入 减档
    {  if(key_hd>0)
            {key_hd--;}                                        //档位-1
         key_dj=0;key_d_num=0; key_jd_time=0; key_d_time=0;        
         }
//------------------------------------------------------------------------
  if        (key_k_time>=8000)         //超过10秒无输入
        {
          key_k_time=0;         
//          MUN=0;                                //菜单归零
          KEY_M=7;                         //执行功能选择
          }

  key_hd_tmp=key_hd;                                    //数据输入模式
  if (menu_key==0)  key_hd_tmp=0x0f;           // 菜单选择模式
KEY_M=((key_hd_tmp<<4)&0xf0)+KEY_M;        //档位 +功能合并

          switch(KEY_M)                 //功能选择
    {
        case 0x01:            
                 numer++;
                  break;                        
                case 0x02:
                  numer++;
                  break;                                                
                case 0x11:
                  numer=numer+10;
                  break;                        
                case 0x12:
                  numer=numer+10;                                    
                  break;                        
                case 0x21:
                  numer=numer+100;
                  break;                        
                case 0x22:
                  numer=numer+100;
                  break;                        
                case 0x31:
                  numer=numer+1000;
                  break;                        
                case 0x32:
                  numer=numer+1000;
                  break;                        
                case 0x41:
                  numer=numer+10000;
                  break;                        
                case 0x42:
                  numer=numer+10000;
                   break;
                case 0x03:                 
                  numer--;
                  break;                        
                case 0x04:
                  numer--;
                  break;
                case 0x13:                 
                  numer=numer-10;
                  break;                        
                case 0x14:
                  numer=numer-10;
                  break;
                case 0x23:                 
                  numer=numer-100;
                  break;                        
                case 0x24:
                  numer=numer-100;
                  break;
                case 0x33:                 
                  numer=numer-1000;
                  break;                        
                case 0x34:
                  numer=numer-1000;
                  break;
                case 0x43:                 
                  numer=numer-10000;
                  break;                        
                case 0x44:
                  numer=numer-10000;
                  break;                        
                case 0xF1:         //  慢速正传执行动作        向下
        key_down();         
                // func_index=table[func_index].down;    //向下翻
                  break;                        
                case 0xF2:         //快速正传执行动作        向下
//       key_down();
                  break;                        
                case 0xF3:        //  慢速反转执行动作        向上
        key_up();     
                // func_index=table[func_index].up;    //向上翻
                  break;                        
                case 0xF4:        //快速反转执行动作        向上
        //                  key_up();
                  break;
                case 0xF5:          //按键c长按执行动作        打开菜单
        //           MUN=1;
                   key_enter();
                 //  menu_key=~menu_key;
                  break;
               
                case 0x06:        //确认         按键c短按执行动作   确认
                          key_enter();  
                //func_index=table[func_index].enter;    //确认
                  break;
                case 0xF6:        //确认         按键c短按执行动作   确认
        key_enter();
                 // func_index=table[func_index].enter;    //确认
                  break;
               
                case 0xF7:        //退出         30S无按键动作        返回上级菜单
         key_esc();
                  break;
        default:        
          break;           
  }
  KEY_M=0;
//current_operation_index=table[func_index].current_operation;
        
}



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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