搜索
bottom↓
回复: 1

发一个非主流读按键程序,

[复制链接]

出0入0汤圆

发表于 2015-8-15 20:36:52 | 显示全部楼层 |阅读模式
论坛上很多大侠的读按键程序,特别是傻孩子大侠的, 可惜我看不懂, 我发一个我用了几年的按键, 不用对列, 占用资源较少, 不知是否有人读按键思路是否和我的一样? 让高手见笔了


//==========================================
//共四个按键


typedef union
{
        unsigned char byte;
        struct
        {
                unsigned char b0:1;
                unsigned char b1:1;
                unsigned char b2:1;
                unsigned char b3:1;
                unsigned char b4:1;
                unsigned char b5:1;
                unsigned char b6:1;
                unsigned char b7:1;
        }bits;
}uByte;

#define KEY_NULL 0b00001111
#define KEY_SHORT_TM 2
#define KEY_LONG_TM (2500/10)
#define KEY_CT_TM_START (950/10)
#define KEY_CT_TM_ERR (240/10)
#define KEY_CT_TM_START1 (2050/10)
#define KEY_CT_TM_ERR1 (400/10)

uByte vFlag,vFlag1;
#define bKeyLock vFlag.bits.b2
#define bKeyCtLock vFlag.bits.b3
#define bKeyLock1 vFlag.bits.b4
#define bKeyLock2 vFlag.bits.b5
#define bKeyLock3 vFlag.bits.b6


unsigned char vKCodeBuf,vKCodeCur,vKCodeOld,vKCodeOldBak;
unsigned char vKeyTm,vKeyTmContinue,vKeyTmContinue1,vKeyTmOld;
unsigned char vKeyVal;


//========================================================
void GET_KEY(void)
{
        vKeyVal = KEY_NUSE;
        if(vKCodeCur == vKCodeOld)
        {
                if(vKeyTm < 0xff)
                {
                        vKeyTm++;
                }
                if(vKeyTmContinue < 0xff)
                {
                        vKeyTmContinue++;
                }
                if(vKeyTmContinue1 < 0xff)
                {
                        vKeyTmContinue1++;
                }
        }
        else
        {
                vKCodeOldBak = vKCodeOld;
                vKCodeOld = vKCodeCur;
                vKeyTmOld = vKeyTm;
                vKeyTm = 0;
                vKeyTmContinue = 0;
                vKeyTmContinue1 = 0;
        }
       
        if(vKCodeCur == KEY_NULL)
        {
                if(vKeyTm == KEY_SHORT_TM)
                {
                        if(vKeyTmOld >= KEY_SHORT_TM)
                        {                       
                                switch(vKCodeOldBak)//松开按键,得到对应的键值
                                {
                                        case 0b1110:
                                                vKeyVal = 1;
                                                break;
                                        case 0b1101:
                                                vKeyVal = 2;
                                                break;
                                        case 0b1011:
                                                vKeyVal = 3;
                                                break;
                                        case 0b0111:
                                                vKeyVal = 4;
                                                break;
                                        default:
                                                break;
                                }                               
                        }
                }
                else if(vKeyTm == KEY_SHORT_TM+1) //松开后,去掉所有加锁互斥的标志.
                {
                        bKeyLock = 0;
                        bKeyCtLock = 0;
                        bKeyLock1 = 0;
                        bKeyLock2 = 0;
                        bKeyLock3 = 0;
//                        bKeyLock4 = 0;       
                }
        }
       
        else
        {
                if((vKeyTm == KEY_SHORT_TM) && (bKeyLock == 0)) //短按,得到立即键值
                {
                        bKeyLock = 1;
                        switch(vKCodeCur)
                        {
                                case 0b1110:
                                        vKeyVal = 5;
                                        break;
                                case 0b1101:
                                        vKeyVal = 6;
                                        break;
                                case 0b1011:
                                        vKeyVal = 7;
                                        break;
                                case 0b0111:
                                        vKeyVal = 8;
                                        break;
                                default:
                                        break;                               
                        }
                }
                if(vKeyTmContinue >= (KEY_CT_TM_START+KEY_CT_TM_ERR))//连续按住,类似连加
                {
                        bKeyLock1 = 1;
                        vKeyTmContinue = KEY_CT_TM_START;        //按住一秒的时候得到一个键值,以后每隔200毫秒得到一个键值
                        switch(vKCodeCur)
                        {
                                case 0b1110:
                                        vKeyVal = 9;
                                        break;
                                case 0b1101:
                                        vKeyVal = 10;
                                        break;
                                case 0b1011:
                                        vKeyVal = 11;
                                        break;
                                case 0b0111:
                                        vKeyVal = 12;
                                        break;
                                default:
                                        break;                                               
                        }
                }
               
                if(vKeyTmContinue1 >= (KEY_CT_TM_START1+KEY_CT_TM_ERR1))
                {
                        vKeyTmContinue1 = KEY_CT_TM_START1;
                        switch(vKCodeCur)
                        {
                                case 0b1110:
                                        vKeyVal = 13;
                                        break;
                                case 0b1101:
                                        vKeyVal = 14;
                                        break;
                                case 0b1011:
                                        vKeyVal = 15;
                                        break;
                                case 0b0111:
                                        vKeyVal = 16;
                                        break;
                                default:
                                        break;                                               
                        }
                }
               
                if(vKeyTm == KEY_LONG_TM)  //长按3秒得到键值.
                {
                        bKeyLock1 = 1;
                        bKeyLock3 = 1;
                        switch(vKCodeCur)
                        {
                                case 0b1110:
                                        vKeyVal = 17;
                                        break;
                                case 0b1101:
                                        vKeyVal = 18;
                                        break;
                                case 0b1011:
                                        vKeyVal = 19;
                                        break;
                                case 0b0111:
                                        vKeyVal = 20;
                                        break;
                                default:
                                        break;                                       
                        }
                }
        }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入12汤圆

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

本版积分规则

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

GMT+8, 2024-5-9 08:10

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

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