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

📄 keypad.c

📁 使用于克隆器
💻 C
字号:
/******************************************************************************
 Copyright (c) 2003 MStar Semiconductor, Inc.
 All rights reserved.

 [Module Name]: Keypad.c
 [Date]:        31-Dec-2003
 [Comment]:
   Keypad control subroutines.
 [Reversion History]:
*******************************************************************************/

#define _KEYPAD_C_

// System
#include <intrins.h>

// Common
#include "define.h"
#include "mcu.h"
#include "global.h"

// External
#include "common.h"
#include "uart.h"
#include "userpref.h"
#include "ir.h"

// Internal
#include "keypad.h"

///////////////////////////////////////////////////////////////////////////////
// <Function>: keyScanStatus
//
// <Description>: Scan key status.
//
// <Returns> : Key Status.
///////////////////////////////////////////////////////////////////////////////
#define KeyRange 15


XDATA BYTE g_ucKeyCode;
XDATA BYTE g_ucPreKeyCode;
bit g_bKeyScanEnable = 0;
void keyScanStatus(BYTE KeyPad)
{
    BYTE tmp;

    if (!g_bKeyScanEnable)
        return;

    tmp = MADC;

    if (KeyPad == Key_AD0)
    {
        //g_ucKeyCode=IRMAX;
        if ((0x88 - KeyRange) < tmp && tmp < (0x88 + KeyRange)) // AD0 OK
        {
            g_ucKeyCode = IRKEY_VOL_UP;
            g_bKeyDetect = TRUE;
            return ;
        }
        else if ((0x59 - KeyRange) < tmp && tmp < (0x59 + KeyRange)) // AD0 OK
        {
            g_ucKeyCode = IRKEY_VOL_DOWN;
            g_bKeyDetect = TRUE;
            return ;
        }
        else if ((0xC7 - KeyRange) < tmp && tmp < (0xC7 + KeyRange)) // AD0 OK
        {
            g_ucKeyCode = IRKEY_INPUT;
            g_bKeyDetect = TRUE;
            return ;
        }
    }
    else//Key_AD1
    {
        if  ((0xE3 - KeyRange) < tmp && tmp < (0xE3 + KeyRange)) // AD1 OK
        {
            g_ucKeyCode = IRKEY_POWER;
            g_bKeyDetect = TRUE;
            return ;
        }
        else if ((0x24 - KeyRange) < tmp && tmp < (0x24 + KeyRange)) // AD1 OK
        {
            g_ucKeyCode = IRKEY_CH_UP;
            g_bKeyDetect = TRUE;
            return ;
        }
        else if ((0x64 - KeyRange) < tmp && tmp < (0x64 + KeyRange)) // AD1 OK
        {
            g_ucKeyCode = IRKEY_CH_DOWN;
            g_bKeyDetect = TRUE;
            return ;
        }
        else if ((0xAC - KeyRange) < tmp && tmp < (0xAC + KeyRange)) // AD1 OK
        {
            g_ucKeyCode = IRKEY_TVMENU;
            g_bKeyDetect = TRUE;
            return ;
        }
    }
}

/////////////////////////////////////////
// delay 10 microsecond.
//
// Arguments: wValue - delay counter
////////////////////////////////////////
#ifdef DVDENABLE
void Delay10us(WORD wValue)
{
    WORD wCount; // loop counter

    while (wValue--)
    {
        wCount = DELAY_1MS_PERIOD / 100; // reset loop counter
        while (wCount--) ;
    } // while
}
#endif
///////////////////////////////////////////////////////////////////////////////
// <Function>: keyDetectHandler
//
// <Description>:
///////////////////////////////////////////////////////////////////////////////
void keyDetectHandler(void)
{
    g_bKeyScanEnable = 1;

    if (!_testbit_(g_bKeyDetect))
    {
        g_ucPreKeyCode = IRMAX;
        g_ucKeyReleaseCounter = 0;
        g_bKeyScanEnable = 1;
        return;
    }
    else
    {
        //printf("\r\nKeyCode=%x",g_ucKeyCode);
        if (g_ucKeyReleaseCounter > 0xE000 && g_ucKeyReleaseCounter < 0xEE00)
        {// key successfully received before and repeat
            //putstr(">");
            g_bIrDetect = TRUE;
            g_IrCodeParam[5] = TRUE;
            g_ucIrCode = g_ucKeyCode;
            if (g_ucIrCode == IRKEY_INPUT)
                g_ucKeyReleaseCounter = 0xFFFF;
            else if (g_ucIrCode == IRKEY_TVMENU)
                g_ucKeyReleaseCounter = 0xFFFF;
            else//volume channel
                g_ucKeyReleaseCounter = 0xEE00;
        }
        else if (g_ucKeyReleaseCounter == 0)
        {// NEW KEY PRESSED
            //putstr("-");
            if (g_ucPreKeyCode == IRMAX)
            {
                g_bIrDetect = TRUE;
                g_ucIrCode = g_ucKeyCode;
                g_IrCodeParam[5] = TRUE;
                if (g_ucKeyCode == IRKEY_POWER )
                    g_ucKeyReleaseCounter = 0x100;
                else if (g_ucIrCode == IRKEY_TVMENU)
                    g_ucKeyReleaseCounter = 0xFFFF;
                else if (g_ucIrCode == IRKEY_INPUT)
                    g_ucKeyReleaseCounter = 0xFFFF;
                else//volume chanel input
                    g_ucKeyReleaseCounter = 0xEF80;
            }
        }
        else if (g_ucKeyReleaseCounter > 0x200 && g_ucKeyReleaseCounter < 0xE000)
        {
            g_ucPreKeyCode = IRMAX;
            g_ucKeyReleaseCounter = 0;
            g_bKeyScanEnable = 1;
        }
    }
    g_ucPreKeyCode = g_ucKeyCode;
    g_bKeyScanEnable = 1;
}

⌨️ 快捷键说明

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