搜索
bottom↓
回复: 8

请教版主 关于你的键盘状态机的延时函数

[复制链接]

出0入0汤圆

发表于 2009-6-3 22:38:06 | 显示全部楼层 |阅读模式
在《深入浅出》中看到版主写的键盘状态机函数
unsigned char Key_service (void)
{
    static unsigned char KeyStatu = Key_Press;
    static unsigned char KeyTimer = 0;
    static unsigned char KeyTmpValue;

    switch (KeyStatu)
    {
        case Key_Press :                //检测按键按下
        {
            if (KeyPin != 0xFF)         //检测是否有键按下
            {
                KeyTmpValue = KeyPin;   //暂存键值
                KeyStatu++;             //如检测到有键按下则翻转处理状态
                KeyTimer = 10;          //初始化抗抖动定时器,抗抖动时间10mS
            }
            break;
        }

        case Key_Bounce :            //抗抖动
        {
            KeyTimer--;
            if (KeyTimer == 0)
            {
                if (KeyPin != KeyTmpValue)      //检测按键是否依然按下
                    KeyStatu = Key_Press;       //按键信号不在了,当作干扰信号丢弃
                else
                    KeyStatu++;
            }
            break;
        }

        case Key_Release :          //等待按键松开
        {
            if (KeyPin == 0xFF)
            {                       //若按键已经释放,则提取键值
                switch (KeyTmpValue)
                {
                    case 0xFE :
                    {
                        KeyStatu = Key_Press;
                        return Key_8;
                        break;
                    }
                    
                    case 0xFD :
                    {
                        KeyStatu = Key_Press;
                        return Key_7;
                        break;
                    }
                    
                    case 0xFB :
                    {
                        KeyStatu = Key_Press;
                        return Key_6;
                        break;
                    }
                    
                    case 0xF7 :
                    {
                        KeyStatu = Key_Press;
                        return Key_5;
                        break;
                    }
                    
                    case 0xEF :
                    {
                        KeyStatu = Key_Press;
                        return Key_4;
                        break;
                    }
                    
                    case 0xDF :
                    {
                        KeyStatu = Key_Press;
                        return Key_3;
                        break;
                    }
                    
                    case 0xBF :
                    {
                        KeyStatu = Key_Press;
                        return Key_2;
                        break;
                    }
                    
                    case 0x7F :
                    {
                        KeyStatu = Key_Press;
                        return Key_1;
                        break;
                    }
                }
                KeyStatu = Key_Press;           //读到的端口状态无法解析
            }                               //End Of "if (KeyPin == 0)"
            break;
        }                                   //End Of " case Key_Release :"
    }                                       //End Of "switch (KeyStatu)"
    return Key_Null;
}


其中
KeyTimer = 10;          //初始化抗抖动定时器,抗抖动时间10mS

KeyTimer--;
相配合,请问这个的原理是不是每次主函数循环到这里的时候就对KeyTimer减一?
也就是说这个函数的延时是用主函数循环10次作为基础的。
如果这样的话 如果主函数很长和很短是不是会影响到延时效果呢?

出0入0汤圆

发表于 2009-6-4 08:24:23 | 显示全部楼层
这个函数应该是固定1MS调用一次的吧,你在看看

出0入0汤圆

 楼主| 发表于 2009-6-4 10:54:54 | 显示全部楼层
哦  对哦,用定时器10MS调用一次。。

出0入296汤圆

发表于 2009-6-5 12:44:47 | 显示全部楼层
飘过……

出0入0汤圆

发表于 2009-6-28 01:45:02 | 显示全部楼层
unsigned char Key_service (void)
{
    static unsigned char KeyStatu = Key_Press;
    static unsigned char KeyTimer = 0;
    static unsigned char KeyTmpValue;

    switch (KeyStatu)
    {
        case Key_Press :               
        {
            if (KeyPin != 0xFF)           
            {
                KeyTmpValue = KeyPin;                  
               KeyStatu++;         
                KeyTimer = 10;         
            }
            break;             //是不是在这里跳出switch   那后面的两个case  不是没有用了吗  



看不懂 后面两个case 程序是怎么进去的

出0入0汤圆

发表于 2009-6-28 02:41:05 | 显示全部楼层
K,4L看看C语言基础方面的书再来吧

switch case你会用吗?
不会用翻书...

出0入0汤圆

发表于 2009-7-4 09:35:46 | 显示全部楼层
break跳出当前case,后面的case在符合其的条件发生时进去。

出0入0汤圆

发表于 2009-7-12 22:59:28 | 显示全部楼层
楼上的,你懂C吗?break是跳出当前case吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 17:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表