发一个状态机做的 按键扫描功能 硬件调试没有问题
本帖最后由 snwuzhisheng 于 2012-6-5 10:57 编辑硬件描述;
两个按键 一个数码管
功能描述;
当K1长按的时候 进入调节模式 四位数码管显示HXXX (其中H是高度的缩写 xxx表示数值)
当K1再次长按的时候 退出调节模式
调节模式下
当K1短按的时候 数码管在HXXXLXXXGXXX中循环显示 (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;
}
}
那个 有兴趣看完的 可以给点意见 嘿嘿 发点贴 混点分数
上面写错了
简单说
当按键1长按 进入参数设置 再次长按退出参数设置
在设置状态下 按K1 设置不同参数 按K2 增加参数
有个问题不明白,K1短按时程序如何消抖?你程序里面只有长按后下一步才能进入case 1
没看懂楼主的程序.{:dizzy:} 时光黑白 发表于 2012-6-5 10:25 static/image/common/back.gif
有个问题不明白,K1短按时程序如何消抖?你程序里面只有长按后下一步才能进入case 1
没看懂楼主的程序.{:di ...
{:3_48:}是啊 只有长按 case1 其他时候 不做处理 snwuzhisheng 发表于 2012-6-5 10:36 static/image/common/back.gif
是啊 只有长按 case1 其他时候 不做处理
{:3_54:} 一语惊醒梦中人 我完全可以 把长按去掉
按K1 在 长度 高度 宽度 参数上设置 然后第四次后 又回到正常运行状态 {:3_52:} 那不是每次进来都要设置?设置完了后才能操作别的啊。 时光黑白 发表于 2012-6-5 10:39 static/image/common/back.gif
那不是每次进来都要设置?设置完了后才能操作别的啊。
{:3_49:} 没有啊 其他任务继续进行 例如ad采集 数码管显示 我知道,我是说每次要操作按键,要先长按K1才能操作K2 {:3_48:}没错 没错 这个兄弟看的没错 就是要实现这功能 因为产品出去 一般只要设置一次就不要设置了 但是领导又不希望在程序里面改 直接烧写 这个还是延迟函数的 还是中断控制好点啊
产品要求不高的我都这么写
if(s_set==0&&flash==0)//按下3秒进入设定
{
Delayms(50);
while(s_set==0)
{
Delayms(50);
key_press_i++;
if(key_press_i>60)break;// press 3 second
}
if(key_press_i>60)
{
。。。。。
} yao1 发表于 2012-6-5 12:46 static/image/common/back.gif
这个还是延迟函数的 还是中断控制好点啊
产品要求不高的我都这么写
if(s_set==0&&flash==0)//按下3秒进入 ...
请问下 Delayms(50); 的时候是不是什么都不做 就光延时来着? snwuzhisheng 发表于 2012-6-5 14:41 static/image/common/back.gif
请问下 Delayms(50); 的时候是不是什么都不做 就光延时来着?
对 产品要求设置好后记忆才开始自动运行设置过程一切停止运行 所以延迟函数也没事 我觉得用不用状态机看产品要求 一些比较简单的就没必要用状态机的 这个程序。。。。。学习了! 先mark一下 yao1 发表于 2012-6-5 14:57 static/image/common/back.gif
我觉得用不用状态机看产品要求 一些比较简单的就没必要用状态机的
状态机只是一种方法
页:
[1]