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

📄 kb.c

📁 《嵌入式系统-使用HCS12微控制器的设计与应用》在CodeWarrior开发环境下的源程序。
💻 C
字号:
//[KB.c]键盘扫描识别-------------------------------------------------------*
//本文件包含:                                                              *
//    (1)KB_Init:键盘初始化                                                *
//    (2)KB_Scan1:单次扫描读取键值                                         *
//    (3)KB_Def:键值转为定义值                                             *
//    (4)KB_ScanN:多次扫描键盘消除"抖动"问题                               *
//-------------------------------------------------------------------------*

//头文件
#include "KB.h"    //键盘扫描识别头文件

//KB_Init:键盘初始化函数---------------------------------------------------*
//功  能:初始化键盘中断的引脚,但未开放键盘中断                            *
//参  数:无                                                                *
//返  回:无                                                                *
//-------------------------------------------------------------------------*
void KB_Init(void)
{
    KB_P = 0x00;     //复位KB_P
    KB_D = 0x0F;     //定义7-4为输入,3-0为输出
    KB_PE = 0xF0;    //定义KB_P.7-4允许上拉或下拉
    KB_PS = 0x00;    //定义KB_P.7-4上拉电阻,并且下降沿产生中断
    KB_IE = 0x00;    //定义KB_P.7-4输入引脚禁止中断
    KB_IF = 0xFF;    //清除键盘中断标志位(写1清)
}

//KB_Scan1:扫描读取键值函数------------------------------------------------*
//功  能:扫描一次4*4键盘上的按键,读取键值->*p;若无按键,*p为0xff            *
//参  数:无                                                                *
//返  回:扫描到的键值                                                      *
//-------------------------------------------------------------------------*
INT8U KB_Scan1(void) 
{
    INT8U line,i,tmp;
    line=0xFE;            //使第一根行线为0(低电平)
    for (i = 1; i <= 4; i++)    //最多将扫描4根行线
    {
        //当前扫描的一行,输出低电平
        tmp  = KB_P;
        tmp |= 0X0F;
        KB_P = tmp & line;

        asm("NOP");
        asm("NOP");
        //读取键盘口数据寄存器
        tmp  = KB_P;
        //通过观察4根列线中是否出现低电平来判断当前行有无按键
        tmp &= 0XF0;    //仅保留列线的值
        if (tmp != 0xF0)      //当前行有键按下
	    {
            tmp=KB_P;         //读取扫描到的键值
            break;            //退出循环不再扫描
        }
        else                  //当前行无按键,准备扫描下一行
            line = (line << 1) | 0x01; 
    }
    if (i == 5)        //无按键,以后将返回0xff
        tmp = 0xFF;
    return (tmp);
}

//KB_ScanN:多次扫描键盘函数------------------------------------------------*
//功  能:多次扫描键盘,消除"抖动"                                          *
//参  数:KB_count=多次扫描键盘的的次数                                     *
//返  回:多次扫描键盘得到的键值:                                           *
//       正常按键--KB_value_now; 非正常按键(包括无按键)--0xFF              *
//内部调用函数:KB_Scan1                                                    *
//-------------------------------------------------------------------------*
INT8U KB_ScanN(INT8U KB_count)
{
    INT8U i,KB_value_last,KB_value_now;    
    if (0 == KB_count || 1 == KB_count)
        return KB_Scan1();
    //先扫描一次得到的键值,便于下面比较
    KB_value_now = KB_value_last = KB_Scan1();   
    //以下多次扫描消除误差
    for (i=0; i<KB_count-1; i++)
    {               
        KB_value_now = KB_Scan1();
        if (KB_value_now == KB_value_last)
            return KB_value_now;    //返回扫描的键值
        else
            KB_value_last = KB_value_now;
    }
    return 0xFF;    //返回出错标志
}

//KB_Def:键值转为定义值函数------------------------------------------------*
//功  能:键值转为定义值                                                    *
//参  数:KB_valve=键值                                                     *
//返  回:KeyPress=键定义值                                                 *
//-------------------------------------------------------------------------*
//键盘定义表
const INT8U KB_Table[]= 
{
    0xEE,'1',0xDE,'2',0xBE,'3',0x7E,'A',
    0xED,'4',0xDD,'5',0xBD,'6',0x7D,'B',
    0xEB,'7',0xDB,'8',0xBB,'9',0x7B,'C',
    0xE7,'*',0xD7,'0',0xB7,'#',0x77,'D',
    0x00
};
 
INT8U KB_Def(INT8U KB_valve)
{
    INT8U KeyPress;
    INT8U i;
    INT8U j;
    i = 0;
    while (1)
    {
        j = KB_Table[i];
        //与0(定义表结束标志)相比较
        if (j == 0)                          //=0,即表中无次定义值
        {
            KeyPress = 0xFF;                 //返回0xFF
            break;
        }
        else
        {
            //与键值相比较
            if(j == KB_valve)                //找到
            {
                KeyPress = KB_Table[i+1];    //取键定义值
                break;
            }
            else
            {
                i += 2;                      //指向下一个键值,继续判断
            }
        }
    }
    return KeyPress;                         //返回键定义值
}

⌨️ 快捷键说明

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