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

📄 kboard.c

📁 国外牛人写的键盘扫描程序;算法很巧妙。值得学习
💻 C
字号:
/**
 * \addtogroup Kboard
 * @{
 */

/*****************************************************************************/
/**
 * \file Kboard.c
 * 4 x 4 keyboard routines for 8051 and Keil C51.
 * \author Copyright (c) 2005, Murray R. Van Luyn. <vanluynm@iinet.net.au>
 * \version 0.2
 * \date 13-07-05
 */
/*****************************************************************************/

/*****************************************************************************
 *
 *     THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
 *     OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 *     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 *     ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 *     DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 *     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 *     GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 *     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 *     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 *     NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 *     SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 ******************************************************************************/

#include "Kboard.h"

/*****************************************************************************
 *
 *                                Global Variables
 *
 *****************************************************************************/
/* 
 * Keyboard scan row/ column output and input pattern codes.
 */
static const unsigned char code KEY_IO[16] = {0x77, 0xB7, 0xD7, 0xE7,
                                              0x7B, 0xBB, 0xDB, 0xEB,
                                              0x7D, 0xBD, 0xDD, 0xED,
                                              0x7E, 0xBE, 0xDE, 0xEE};

/* 
 * Keyboard key position to ASCII representation codes.
 */
static const char code KEY_MAP[16] = {'1', '2', '3', 'A',
                                      '4', '5', '6', 'B',
                                      '7', '8', '9', 'C',
                                      '.', '0', '\r', '\b'}; // CR BS

/*****************************************************************************
 *
 *                            Private Function Prototypes 
 *
 *****************************************************************************/
static unsigned char kboard_makekey(void);
static void kboard_breakkey(void);
static unsigned char kboard_idkey(void);


/*****************************************************************************
 *
 *                         Private Function Implementation
 *
 *****************************************************************************/

/*****************************************************************************
 *
 *                                kboard_makekey()  
 *
 *****************************************************************************/
static unsigned char kboard_makekey(void)
{
    unsigned char key, newkey;

    do
    {
        while((key = kboard_idkey()) == NOKEY);
#ifdef LCD_H
        lcd_beep(5);
#endif
        delay_ms(10);
    } while((newkey = kboard_idkey()) != key);

    return(key);
}

/*****************************************************************************
 *
 *                              kboard_breakkey() 
 *
 *****************************************************************************/
static void kboard_breakkey(void)
{
    do
    {
        while(kboard_idkey() != NOKEY);
        delay_ms(10);
    } while(kboard_idkey() != NOKEY);
}

/*****************************************************************************
 *
 *                                 kboard_idkey() 
 *
 *****************************************************************************/
static unsigned char kboard_idkey(void)
{
    unsigned char key = 0xFF;
    bit keyfound = 0;

    do
    {
        key++;
        KEYPORT &= 0xF0;                // clear lower nibble
        KEYPORT |= KEY_IO[key] & 0x0F;  // output lower nibble
        keyfound = ((KEYPORT & 0xF0) == (KEY_IO[key] & 0xF0));
        
    } while((key < NOKEY) && (!keyfound));

    return(key);    
}


/*****************************************************************************
 *
 *                         Public Function Implementation
 *
 *****************************************************************************/

/*****************************************************************************
 *
 *                                kboard_init()  
 *
 *****************************************************************************/
void kboard_init(void)
{
    KEYPORT = 0xFF;     // Set all bits as input
}

/*****************************************************************************
 *
 *                                 _getkey() 
 *
 *****************************************************************************/
char _getkey(void)
{
    unsigned char key = NOKEY;

    while(key == NOKEY)
    {
        key = kboard_makekey();
        kboard_breakkey();
    }

    return (KEY_MAP[key]);
}

/** @} */

⌨️ 快捷键说明

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