|
本單片機(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;
}
|
評分
-
查看全部評分
|