⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.c

📁 通过车载终端采集GPS数据
💻 C
字号:
#include "typedef.h"
#include "keyBoard.h"
//扫描输入
Byte code keyInput[4] = {0x07, 0x0b, 0x0d, 0x0e};

/**********************以下定义16个按键****************/
#define KEY1_1 0xfff7
#define KEY1_2 0xfffb
#define KEY1_3 0xfffd
#define KEY1_4 0xfffe
#define KEY2_1 0xff7f
#define KEY2_2 0xffbf
#define KEY2_3 0xffdf
#define KEY2_4 0xffef
#define KEY3_1 0xf7ff
#define KEY3_2 0xfbff
#define KEY3_3 0xfdff
#define KEY3_4 0xfeff
#define KEY4_1 0x7fff
#define KEY4_2 0xbfff
#define KEY4_3 0xdfff
#define KEY4_4 0xefff


#define KEY1_12 0xfff3
#define KEY_NULL 0xffff

#define KEY_FIRST_ACC       2   /*第一次按键计次*/
#define KEY_CONTINUE_ACC    10  /*连续按键间隔计次*/
#define KEY_RELEASE_ACC     2   /*按键释放间隔次数*/
static char keyCode;     /*保存按键码*/
extern Uchar volatile xdata D12_Y0;//键盘扫描时的输入地址,用到0-3
extern Uint8 xdata D12_Y2;//键盘扫描后的输出地址,用到4-7
extern idata Uchar D17CS;//赋值D12_Y0的寄存器
extern unsigned char volatile xdata D12_Y1;//原来的xCONTROLBYTE81K
extern idata unsigned char D16CS;//D12_Y1的寄存器,原来的xConByte81KValue
extern unsigned int backlightcount;
/*返回代码见key.h文件定义*/
char get_key(void)
{
    char tmp;
	key_process();

    tmp = (Uchar)keyCode;
    keyCode = 0;

    return tmp;
}

/************************************
*
按键处理流程:
1)通过比较上一次的按键值来消除抖动。不相同就清除计次,相同就累加计次。
2)累加到一定次数认为是按键稳定,发送蜂鸣声,判断按键类型。
3)当按键持续一定时间后定时发送蜂鸣声和按键类型。
4)按键释放要有一定的时间。即两次连续按键要有一定时间间隔。
5)考虑本产品的实际情况,向上和向上按键允许连续,取消和确认只能是单次按键。

当有效按键后要发送蜂鸣声。
通过简单的状态机处理按键的抖动、单次按键、连续按键。
keyState有以下几个状态:
0:第一次按键状态,消除抖动状态。不相同就清除计次,相同就累加计次,到一定的次数认为是有效按键。
1:连续按键状态。
2:释放按键状态。
*
*************************************/
//extern void debug_msgNeeded(unsigned int value);
void key_process(void)
{
    static bit initFlag = 0;
    static Byte keyState;
    static Byte keyAcc;
    static Uint16 keyKeep;
    Byte i;
	Uint16 tmp[4],test;//四行扫描的结果保存的地方
	Uint16 tmpValue;//最终保存结果

    if( initFlag == 0 )
    {
        initFlag = 1;
        keyState = 0;
        keyAcc = 0;
        keyKeep = KEY_NULL;
    }

	for (i=0; i<4; i++)
	{
		tmp[i] = 0;
		D17CS &= 0xf0;//低4位清零
		D17CS |= keyInput[i];
		D12_Y0 = D17CS;
        test = D12_Y2;//xCONTROLBYTE82;
		tmp[i] = D12_Y2 &0xf0;//xCONTROLBYTE82 & 0xF0;
		if (0 ==i)
			tmp[i] = tmp[i]>>4;
		else if (i > 1)
			tmp[i] = tmp[i] << (4*(i-1));
	}

	//确定最终输出值
	tmpValue = 0;
	for (i=0; i<4; i++)
	{
		tmpValue += tmp[i];
	}
    /*通过计次来达到消除抖动的目的*/
    if( tmpValue == keyKeep )
    {
        keyAcc ++;
    }
    else
    {
        keyAcc = 0;
        keyKeep = tmpValue;
    }

    switch(keyState)
    {
        case 0: /*第一次按键状态*/
            if( keyKeep == KEY_NULL )
            {
                keyAcc = 0;
                break;
            }

            if( keyAcc == KEY_FIRST_ACC )
            {
                keyState = 1;

                switch( keyKeep )
                {
                    case KEY1_1:
    					keyCode = KEY_CODE_ENTER;//KEY_CODE_ALT;
                        break;

                    case KEY1_2:
    					keyCode = KEY_CODE_ESC;//KEY_CODE_NUM9;
                        break;

                    case KEY1_3:
    					keyCode = KEY_CODE_MENU;//KEY_CODE_NUM5;
                        break;

                    case KEY1_4:
    					keyCode = KEY_CODE_ALT;//KEY_CODE_NUM1;
                        break;

                    case KEY2_1:
    					keyCode = KEY_CODE_NUM4;//KEY_CODE_ENTER;
                        break;

                    case KEY2_2:
    					keyCode = KEY_CODE_NUM3;//KEY_CODE_NUM0;
                        break;

                    case KEY2_3:
    					keyCode = KEY_CODE_NUM2;//KEY_CODE_NUM6;
                        break;

                    case KEY2_4:
    					keyCode = KEY_CODE_NUM1;//KEY_CODE_NUM2;
                        break;

                    case KEY3_1:
    					keyCode = KEY_CODE_NUM8;//KEY_CODE_ESC;
                        break;

                    case KEY3_2:
    					keyCode = KEY_CODE_NUM7;//KEY_CODE_START;
                        break;

                    case KEY3_3:
    					keyCode = KEY_CODE_NUM6;//KEY_CODE_NUM7;
                        break;

                    case KEY3_4:
    					keyCode = KEY_CODE_NUM5;//KEY_CODE_NUM3;
                        break;

                    case KEY4_1:
    					keyCode = KEY_CODE_START;//KEY_CODE_MENU;
                        break;

                    case KEY4_2:
    					keyCode = KEY_CODE_FUNC;//KEY_CODE_FUNC;
                        break;

                    case KEY4_3:
    					keyCode = KEY_CODE_NUM0;//KEY_CODE_NUM8;
                        break;

                    case KEY4_4:
    					keyCode = KEY_CODE_NUM9;//KEY_CODE_NUM4;
                        break;

                    case KEY1_12:
                        keyCode = KEY_LIGHT_CON;
                        break;

                    default:
    					keyState = 0;
                        keyAcc = 0;
                        break;
                }
            }
            break;

        case 1: /*连续按键状态*/
            if( keyAcc == KEY_CONTINUE_ACC )
            {
                keyAcc = KEY_FIRST_ACC;    /*防止计数溢出*/

            }
            else if( keyAcc == 0 )
            { /*按键有变化*/
                keyState = 2;
            }

            break;

        case 2: /*释放按键状态*/
            if( (keyAcc== KEY_RELEASE_ACC) && (keyKeep==KEY_NULL) )
                keyState = 0;

            break;

        default:
            keyState = 0;
            break;
    }

    return;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -