标题:
单片机编码器菜单操作及数据快速输入含长/短按,快慢转子程序
[打印本页]
作者:
guobaox1981
时间:
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;
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1