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

📄 key.c

📁 单片机开发列程
💻 C
字号:
#define __KEY_H__
#include "Config.h"

#define KEYPORT P6                  //定义端口
#define KEYPORTPINCFG P6PINCFG      //定义端口
#define KEYMASK 0x0F                //按键的屏蔽码,屏蔽掉高位的LED,定义成宏方便使用.
/********************************************************************************************************
**函数名称:KeyDelay
**函数功能:用于按键的延时去抖
**输    入:uchar DelayLoops   延时循环次数,控制延时时间
**输    出:无
********************************************************************************************************/
void KeyDelay(uchar DelayLoops)
{
    uint i;
    for(; DelayLoops > 0; DelayLoops --)
    {
        for(i = 5000; i > 0; i --)
        {;}
    }  
}

/****************************************************************************************************
**函数名称:KeyRead
**函数功能:读按键程序
**输    入:无
**输    出:返回读到的键值
**全局变量:uchar code KeyDecode[4]->用于按键解码
**          GlKeyFlag  保存上次的键值
****************************************************************************************************/
uchar code KeyDecode[4] = {0x0E,0x0D,0x0B,0x07};            //按下不同键对应的代码
uchar GlKeyFlag = KEYMASK;                                  //纪录上一次按键的全局变量

uchar KeyRead(void)
{
    uchar KeyBuf,KeyBuf1,i;
    
    PORTINEN |= (BIT0 | BIT1 | BIT2 | BIT3);                //使能按键输入
    //KEYPORTPINCFG |= 0x0F;                                //设置低四位为输入    
    //------------------------------------------------------------------------------
    //判定本次有无按键按下
    //------------------------------------------------------------------------------
    KeyBuf  = KEYPORT;
    KeyBuf &= KEYMASK;                                      //屏蔽无关位
    if(KeyBuf1 != KEYMASK)                                  //有键按下
    {
        KeyDelay(1);                                        //延时去抖

        KeyBuf1  = KEYPORT;
        KeyBuf1 &= KEYMASK;                                 //再读
        if((KeyBuf1 != KEYMASK) && (KeyBuf1 == KeyBuf))     
                                    //延时后还是有按键中断且与第一次的相同说明有键按下
        {;}                         //有键按下,则键值被保存,随后再判断
        else
        {
            KeyBuf  = KEYMASK;     
            KeyBuf1 = KEYMASK;      //无键按下,将所有标志清零
        }
    }
    //------------------------------------------------------------------------------
    //根据本次读到的键值和全局变量保存的值判定有无键按下
    //------------------------------------------------------------------------------
    if(KeyBuf == KEYMASK)           //本次无键按下,清全局标志
    {
        if(GlKeyFlag != KEYMASK)    //如果全局变量保存的是有键状态,则将其清除
        {
            GlKeyFlag = KEYMASK;    //保存无键状态               
        } 
    }
    else                            //如果检测到有键按下
    {
        if(GlKeyFlag == KEYMASK)    //如果上次没有键按下则判定这次按键有效
        {
            GlKeyFlag = KeyBuf;     //将这次的键值保存到全局变量   
        }
       else                         //这次的键值与上次的键值一样或为其他键值,说明健还未松手,判定无键
        {
            KeyBuf = KEYMASK;       //判定无键                   
        }          
    }
    //------------------------------------------------------------------------------
    //返回结果
    //------------------------------------------------------------------------------
    if(KeyBuf != KEYMASK)               //如果有键按下
    {
        for(i = 0; i < 4; i ++)         //通过读到的代码查找按键
        {
            if(KeyBuf == KeyDecode[i])
            {
     	        return (i + 1 + 0x30);  //返回按键对应的ASIIC '1','2','3','4'
            }            
        }
    }

    return 0;   //如果没有键按下或是没有找到对应的键值,则返回0,否则返回对应的字符
}

⌨️ 快捷键说明

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