標題:
單片機編碼器菜單操作及數(shù)據(jù)快速輸入含長/短按,快慢轉(zhuǎn)子程序
[打印本頁]
作者:
guobaox1981
時間:
2022-10-16 23:20
標題:
單片機編碼器菜單操作及數(shù)據(jù)快速輸入含長/短按,快慢轉(zhuǎn)子程序
本單片機程序使用1Ms定時器喚醒查詢
KEY_bmq ();放入1-5ms 的定時器中斷中修改相應的時間即可
菜單操作模式語數(shù)據(jù)輸入模式采用置位menu_key切換, 1=數(shù)據(jù)輸入模式/0=菜單選擇模式
默認使用菜單模式,上翻,下翻,確認,返回
菜單選擇進入數(shù)據(jù)修改時menu_key置1,修改完保存menu_key置零回到菜單模式
數(shù)據(jù)輸入模式分快慢檔位,慢速旋轉(zhuǎn)+—1,快速旋轉(zhuǎn)進入+-10,再快速旋轉(zhuǎn)+-100。3秒無旋轉(zhuǎn)減檔
30秒無動作退出菜單。
多級菜單程序還學習中,需要一個包含多種測量主程序,大量參數(shù)顯示、修改、保存又便于維護修改,
通用性強的菜單框架。一直沒找到通俗易懂易用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相狀態(tài)暫存
bit key_b; //b相狀態(tài)暫存
bit key_c; //c按鍵狀態(tài)暫存
bit key_zj; //正傳標志
bit key_fj; //反轉(zhuǎn)標志
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 ; //換擋計時標志 有快速旋轉(zhuǎn)標志
xdata uint key_d_time; //換擋計時 快速旋轉(zhuǎn)時計數(shù)
xdata uchar key_d_num; //換擋計數(shù) 快速旋轉(zhuǎn)量
xdata uint key_jd_time; //減檔計時
xdata uchar key_hd; //檔位
bit MENU; //c相動作
bit MUN;
bit menu_key; // 1=數(shù)據(jù)輸入模式/0=菜單選擇模式
#define zheng_man KEY_M=1 //慢速正傳執(zhí)行動作 向下
#define zheng_kuai KEY_M=2 //快速正傳執(zhí)行動作 向下
#define fan_man KEY_M=3 //慢速反轉(zhuǎn)執(zhí)行動作 向上
#define fan_kuai KEY_M=4 //快速反轉(zhuǎn)執(zhí)行動作 向上
#define c_chang KEY_M=5 //按鍵c長按執(zhí)行動作 打開菜單
#define c_duan KEY_M=6 //按鍵c短按執(zhí)行動作 確認
#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) //慢轉(zhuǎn)
{
zheng_man; //慢速正傳執(zhí)行動作
}
else
{
zheng_kuai; //快速正傳執(zhí)行動作
key_d_num++; //換擋計數(shù) 快速旋轉(zhuǎn)量
key_dj=1 ; //換擋計時標志 有快速旋轉(zhuǎn)標志
}
key_zj_time = 0; //計時清零
key_zj=0; //正傳標志
key_k_time=0; //空閑計時清零
}
//---------------------------------------------------------------------
if (KEY_B==0 & key_b==1 & KEY_A==1) // B相為下降沿脈沖 A相高電平為反轉(zhuǎn)
{ 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) //慢轉(zhuǎn)
{
fan_man; //慢速反轉(zhuǎn)執(zhí)行動作
}
else
{
fan_kuai; //快速反轉(zhuǎn)執(zhí)行動作
key_d_num++; //換擋計數(shù) 快速旋轉(zhuǎn)數(shù)量
key_dj=1 ; //換擋計時標志 有快速旋轉(zhuǎn)標志
}
key_fj_time = 0; //計時清零
key_fj=0; //反轉(zhuǎn)標志
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; //執(zhí)行功能選擇
} //按鍵c長按執(zhí)行動作
else
{ c_duan;
// KEY_M=6; //執(zhí)行功能選擇
} //按鍵c短按執(zhí)行動作
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秒內(nèi)快速轉(zhuǎn)動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í)行動作 向下
key_down();
// func_index=table[func_index].down; //向下翻
break;
case 0xF2: //快速正傳執(zhí)行動作 向下
// key_down();
break;
case 0xF3: // 慢速反轉(zhuǎn)執(zhí)行動作 向上
key_up();
// func_index=table[func_index].up; //向上翻
break;
case 0xF4: //快速反轉(zhuǎn)執(zhí)行動作 向上
// key_up();
break;
case 0xF5: //按鍵c長按執(zhí)行動作 打開菜單
// MUN=1;
key_enter();
// menu_key=~menu_key;
break;
case 0x06: //確認 按鍵c短按執(zhí)行動作 確認
key_enter();
//func_index=table[func_index].enter; //確認
break;
case 0xF6: //確認 按鍵c短按執(zhí)行動作 確認
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;
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1