找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1796|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)編碼器菜單操作及數(shù)據(jù)快速輸入含長/短按,快慢轉(zhuǎn)子程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:309610 發(fā)表于 2022-10-16 23:20 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本單片機(jī)程序使用1Ms定時(shí)器喚醒查詢
KEY_bmq ();放入1-5ms 的定時(shí)器中斷中修改相應(yīng)的時(shí)間即可
菜單操作模式語數(shù)據(jù)輸入模式采用置位menu_key切換, 1=數(shù)據(jù)輸入模式/0=菜單選擇模式
默認(rèn)使用菜單模式,上翻,下翻,確認(rèn),返回
菜單選擇進(jìn)入數(shù)據(jù)修改時(shí)menu_key置1,修改完保存menu_key置零回到菜單模式
數(shù)據(jù)輸入模式分快慢檔位,慢速旋轉(zhuǎn)+—1,快速旋轉(zhuǎn)進(jìn)入+-10,再快速旋轉(zhuǎn)+-100。3秒無旋轉(zhuǎn)減檔
30秒無動(dòng)作退出菜單。
多級菜單程序還學(xué)習(xí)中,需要一個(gè)包含多種測量主程序,大量參數(shù)顯示、修改、保存又便于維護(hù)修改,
通用性強(qiáng)的菜單框架。一直沒找到通俗易懂易用51多級菜單程序。希望給個(gè)推薦
自學(xué)瞎編的程序,大神勿噴.

#include "C8051F410.h"   //本人使用的是C8051F410單片機(jī)其他51改成相應(yīng)的頭文件
#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相狀態(tài)暫存
bit key_b;   //b相狀態(tài)暫存
bit key_c;   //c按鍵狀態(tài)暫存
bit key_zj;   //正傳標(biāo)志
bit key_fj;  //反轉(zhuǎn)標(biāo)志
bit key_cj;   //c按鍵標(biāo)志

xdata uint key_zj_time;   //加脈沖計(jì)時(shí)
xdata uint key_fj_time;   //反脈沖計(jì)時(shí)
xdata uint key_cj_time;   //c按鍵計(jì)時(shí)

xdata uint key_k_time;     //空閑計(jì)時(shí)

bit   key_dj ;       //換擋計(jì)時(shí)標(biāo)志        有快速旋轉(zhuǎn)標(biāo)志
xdata uint  key_d_time;           //換擋計(jì)時(shí) 快速旋轉(zhuǎn)時(shí)計(jì)數(shù)
xdata uchar key_d_num;     //換擋計(jì)數(shù) 快速旋轉(zhuǎn)量
xdata uint  key_jd_time;   //減檔計(jì)時(shí)
xdata uchar key_hd;        //檔位

bit   MENU;           //c相動(dòng)作
bit   MUN;
bit menu_key;                     // 1=數(shù)據(jù)輸入模式/0=菜單選擇模式
#define zheng_man   KEY_M=1       //慢速正傳執(zhí)行動(dòng)作        向下
#define zheng_kuai  KEY_M=2       //快速正傳執(zhí)行動(dòng)作        向下
#define fan_man     KEY_M=3       //慢速反轉(zhuǎn)執(zhí)行動(dòng)作        向上
#define fan_kuai    KEY_M=4       //快速反轉(zhuǎn)執(zhí)行動(dòng)作        向上
#define c_chang     KEY_M=5       //按鍵c長按執(zhí)行動(dòng)作        打開菜單
#define c_duan      KEY_M=6       //按鍵c短按執(zhí)行動(dòng)作   確認(rèn)
#define Wu_key      KEY_M=7       //30S無按鍵動(dòng)作                關(guān)閉菜單

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)                    //正傳計(jì)時(shí)消抖
    { key_zj_time++; }
        
if (KEY_A==1 & key_zj==1 & key_zj_time>10)      // KEY_A 恢復(fù)高電平并且計(jì)時(shí)大于5ms(消抖)
    {
         if (key_zj_time>100)         //慢轉(zhuǎn)
            {
                 zheng_man;                                 //慢速正傳執(zhí)行動(dòng)作
                 }                  
      else              
                {
                 zheng_kuai;                         //快速正傳執(zhí)行動(dòng)作
                 key_d_num++;                         //換擋計(jì)數(shù) 快速旋轉(zhuǎn)量
                 key_dj=1 ;                                 //換擋計(jì)時(shí)標(biāo)志        有快速旋轉(zhuǎn)標(biāo)志
                 }   
      key_zj_time = 0;            //計(jì)時(shí)清零
          key_zj=0;                                          //正傳標(biāo)志
          key_k_time=0;              //空閑計(jì)時(shí)清零
         
      }
//---------------------------------------------------------------------         
if (KEY_B==0 & key_b==1 & KEY_A==1) //  B相為下降沿脈沖 A相高電平為反轉(zhuǎn)
    { key_fj=1;  
          }  
if (key_fj==1)                    //反傳計(jì)時(shí)消抖
    { key_fj_time++; }
        
if (KEY_B==1 & key_fj==1 & key_fj_time>10)      // B相 恢復(fù)高電平并且計(jì)時(shí)大于5ms(消抖)
    {
         if (key_fj_time>100)         //慢轉(zhuǎn)
           {
           fan_man;                           //慢速反轉(zhuǎn)執(zhí)行動(dòng)作
           }                  
      else     
           {
            fan_kuai;                                 //快速反轉(zhuǎn)執(zhí)行動(dòng)作
                key_d_num++;                         //換擋計(jì)數(shù) 快速旋轉(zhuǎn)數(shù)量
                key_dj=1 ;                                 //換擋計(jì)時(shí)標(biāo)志        有快速旋轉(zhuǎn)標(biāo)志
                 }   
      key_fj_time = 0;            //計(jì)時(shí)清零
          key_fj=0;                                          //反轉(zhuǎn)標(biāo)志
          key_k_time=0;              //空閑計(jì)時(shí)清零
         
      }
//-----------------------------------------------------------------------
if (KEY_C==0 & key_c==1 ) //  C相為下降沿脈沖
    { key_cj=1;  
          }  
if (key_cj==1)                    //C相計(jì)時(shí)消抖
    { key_cj_time++; }
        
if (KEY_C==1 & key_cj==1 & key_cj_time>5)      // B相 恢復(fù)高電平并且計(jì)時(shí)大于5ms(消抖)
    {
         if (key_cj_time>300)         //長按
          { c_chang;
//           KEY_M=5;                         //執(zhí)行功能選擇
          }                 //按鍵c長按執(zhí)行動(dòng)作
      else              
                { c_duan;   
//                KEY_M=6;                         //執(zhí)行功能選擇
                  }            //按鍵c短按執(zhí)行動(dòng)作
      key_cj_time = 0;            //計(jì)時(shí)清零
          key_cj=0;                                         //標(biāo)志清零
          key_k_time=0;              //空閑計(jì)時(shí)清零
      }

//------------------------------------------------------------------------
key_a = KEY_A;   
key_b = KEY_B;
key_c = KEY_C;
key_k_time++;  //空閑計(jì)時(shí)
key_jd_time++;  //減檔計(jì)時(shí)
//------------------------------------------------------------------------
if(key_dj==1)           //換擋計(jì)時(shí)
   { key_d_time++;}

  if (key_d_num>=4&key_d_time<3000)        //3秒內(nèi)快速轉(zhuǎn)動(dòng)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;                         //執(zhí)行功能選擇
          }

  key_hd_tmp=key_hd;                                    //數(shù)據(jù)輸入模式
  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:         //  慢速正傳執(zhí)行動(dòng)作        向下
        key_down();         
                // func_index=table[func_index].down;    //向下翻
                  break;                        
                case 0xF2:         //快速正傳執(zhí)行動(dòng)作        向下
//       key_down();
                  break;                        
                case 0xF3:        //  慢速反轉(zhuǎn)執(zhí)行動(dòng)作        向上
        key_up();     
                // func_index=table[func_index].up;    //向上翻
                  break;                        
                case 0xF4:        //快速反轉(zhuǎn)執(zhí)行動(dòng)作        向上
        //                  key_up();
                  break;
                case 0xF5:          //按鍵c長按執(zhí)行動(dòng)作        打開菜單
        //           MUN=1;
                   key_enter();
                 //  menu_key=~menu_key;
                  break;
               
                case 0x06:        //確認(rèn)         按鍵c短按執(zhí)行動(dòng)作   確認(rèn)
                          key_enter();  
                //func_index=table[func_index].enter;    //確認(rèn)
                  break;
                case 0xF6:        //確認(rèn)         按鍵c短按執(zhí)行動(dòng)作   確認(rèn)
        key_enter();
                 // func_index=table[func_index].enter;    //確認(rèn)
                  break;
               
                case 0xF7:        //退出         30S無按鍵動(dòng)作        返回上級菜單
         key_esc();
                  break;
        default:        
          break;           
  }
  KEY_M=0;
//current_operation_index=table[func_index].current_operation;
        
}



評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表