久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1674|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区福利视频 | 欧美国产日韩在线观看 | 一级黄色夫妻生活 | 亚洲在线观看视频 | 国产一区二区在线播放视频 | 91精品国产色综合久久 | 午夜av毛片 | 久久中文字幕电影 | 久久久久91 | 亚洲欧美bt | 免费激情网站 | 亚洲精品视频一区二区三区 | 欧美高清视频 | 日韩一区二区视频 | 三级av在线 | 日韩av免费在线电影 | 久久噜噜噜精品国产亚洲综合 | 亚洲视频在线一区 | 在线视频a| 亚洲欧美日韩一区二区 | 国产成人免费在线观看 | 亚洲免费网 | 国产成人网 | 一区中文字幕 | 在线视频亚洲 | 精品一区二区在线观看 | 精品国产一区二区三区四区在线 | 日本涩涩网 | 黑人精品欧美一区二区蜜桃 | 麻豆av免费观看 | 一区二区三区高清在线观看 | 99成人在线视频 | 成人免费在线视频 | 免费在线观看一区二区三区 | 亚洲一区二区av | 国产一区在线视频 | 99riav3国产精品视频 | 国产精品123区| 亚洲福利网站 | 久久久久久久久久久久久久国产 | 亚洲精品久久久久久久久久吃药 |