本帖最后由 snwuzhisheng 于 2012-6-5 10:57 编辑
硬件描述;
两个按键 一个数码管
功能描述;
当K1长按的时候 进入调节模式 四位数码管显示HXXX (其中H是高度的缩写 xxx表示数值)
当K1再次长按的时候 退出调节模式
调节模式下
当K1短按的时候 数码管在HXXX LXXX GXXX中循环显示 (H代表高度 L代表长度 G代表高度)
当K2短按的时候 增加xxx数值 按下一直按下 一直增加
这个函数每隔100ms 调用一次 没有专门的按键消抖状态 运行良好
void keylong()
{
static unsigned char state=0,keynum; //keynum用来技术按键次数 keynum=2的话 说明200ms内 按下累计有两次按下了
switch (state)
{
case 0://只有当K1长按时 进入调节模式
if(K1==0)
{
keynum++;
if (keynum>=10)//连续的按了十个周期 10*100ms 是长按 进入case 1
{
keynum=0;
state=1;
KEY_DELAY=100;//扫描周期重新赋值 100ms
oillevel=10000;//这个不要管吧 数码管程序对这个数值计算后 就显示H000了
goto out;//直接退出多重嵌套
}
}
else//不是连续的按 那就累加清零
keynum=0;
KEY_DELAY=100; //这个是扫描的周期 100ms扫描一次
out:
break;
case 1: //K1短按切换不同模式 K2按加数值(有连续加功能) K1长按退出
if(K1==0)
{
/*----------------短按--*/
oillevel=oillevel+1000;//这个不要管吧 数码管程序对这个数值计算后 就在H000 L000 G000循环显示
KEY_DELAY=100;
if(oillevel>=12500) oillevel=10000;//超过返回 H000
/*----------------长按--*/
keynum++;
if(keynum>=10) {state=0;keynum=0;oillevel=999;goto out1;}
}
else
keynum=0;
if(K2==0) oillevel++; //如果K2 被按下 数码管就一直加数值 当然单次按的话 也会加 100ms只是实验值 挺好的 没具体研究
KEY_DELAY=100;
out1:
break;
}
}
那个 有兴趣看完的 可以给点意见 嘿嘿 发点贴 混点分数
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
状态机只是一种方法
一周热门 更多>