📄 key.c
字号:
/*
带有缓冲区的键盘通用程序库
说明:该程序库包含了读取键盘的相关函数,并且包含了一个键盘缓冲区,当
主程序执行较慢,而遇到连续快速的键盘输入来不及及时读取的情况下,
新的按键信息将会自动存入键盘缓冲队列内,每次调用读键盘函数时会
依顺序读取,保证键盘操作不会丢失。该键盘程序可以作为各种程序的底
层驱动使用。
要使用该库函数,需要将本文件(Key.c)添加进工程,并在需要调用
键盘函数的文件开头处包含"Key.h";还需要开启一个定时器,在定时中断
内调用Key_ScanIO()函数。设置定时中断的频率在16~128次/秒之间。
(C)西安电子科技大学 测控技术与仪器教研中心 编写:谢楷 2008/02/03
*/
// +-------------+
// | 定时中断 | 软件结构
// +-------------+
// |
// +-------------+ +-------------+ +-------------+
// KEY1_IN -->| Key_ScanIO | | KeyBuff[] | |Key_GetKey() |
// KEY2_IN -->| 键盘扫描 |-->| 键盘缓冲 |-->|Key_WaitKey()|-->应用程序
// KEY3_IN -->| 函 数 | | 队列(FIFO) | |键盘读取函数 |
// +-------------+ +-------------+ +-------------+
//
//
// MSP430F4XX
// +---------------+
// +---KEY1--|P1.5 |
// | | XOUT|-----
// +---KEY2--|P1.6 | 32.768KHz Watch Crystal
// | | XIN|-----
// +---KEY3--|P1.7 |
// | +---------------+
// GND
//
#include "MSP430x42x.h"
#define KEYBUFF_SIZE 8 /*键盘缓冲区大小,根据程序需要自行调整*/
char KeyBuff[KEYBUFF_SIZE]; //定义键盘缓冲队列数组(FIFO)
char Key_IndexW=0; //键盘缓冲队列写入指针(头指针)
char Key_IndexR=0; //键盘缓冲队列读取指针(尾指针
char Key_Count=0; //键盘缓冲队列内记录的按键次数
char P_KEY1=255; //存放KEY1前一次状态的变量
char N_KEY1=255; //存放KEY1当前状态的变量
char P_KEY2=255; //存放KEY2前一次状态的变量
char N_KEY2=255; //存放KEY2当前状态的变量
char P_KEY3=255; //存放KEY3前一次状态的变量
char N_KEY3=255; //存放KEY3当前状态的变量
#define KEY1_IN (P1IN&BIT5) //KEY1输入IO的定义(P1.5)
#define KEY2_IN (P1IN&BIT6) //KEY2输入IO的定义(P1.6)
#define KEY3_IN (P1IN&BIT7) //KEY3输入IO的定义(P1.7)
#define PUSH_KEY1 0x01
#define PUSH_KEY2 0x02 /*键值宏定义*/
#define PUSH_KEY3 0x04
unsigned char KEY_SR;
#define DISABLE_INT; KEY_SR=__get_SR_register();_DINT();
#define RESTORE_INT; if(KEY_SR & GIE) _EINT();
/****************************************************************************
* 名 称:Key_Init()
* 功 能:初始化键盘所在的IO口
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Key_Init()
{
P1DIR&=~BIT5+BIT6+BIT7; //P1.5/6/7作为输入
}
/****************************************************************************
* 名 称:Key_InBuff()
* 功 能:将一次键值压入键盘缓冲队列
* 入口参数:Key:被压入缓冲队列的键值
* 出口参数:无
****************************************************************************/
void Key_InBuff(char Key)
{
if(Key_Count>=KEYBUFF_SIZE) return;//若缓冲区已满,放弃本次按键
DISABLE_INT;
Key_Count++; //按键次数计数增加
KeyBuff[Key_IndexW] = Key; //从队列头部追加新的数据
if (++Key_IndexW >= KEYBUFF_SIZE) //循环队列,如果队列头指针越界
{
Key_IndexW = 0; //队列头指针回到数组起始位置
}
RESTORE_INT;
}
/****************************************************************************
* 名 称:Key_GetKey()
* 功 能:从键盘缓冲队列内读取一次键值
* 入口参数:无
* 出口参数:若无按键,返回0,否则返回一次按键键值。
* 说 明: 调用一次该函数,会自动删除缓冲队列里一次按键键值。
****************************************************************************/
char Key_GetKey()
{ char Key;
if(Key_Count==0) return(0); //若无按键,返回0
DISABLE_INT;//队列操作过程中不允许被定时中断执行ScanIO函数,保护全局变量正确
Key_Count--; //按键次数计数减1
Key=KeyBuff[Key_IndexR]; //从缓冲区尾部读取一个按键值
if (++Key_IndexR >= KEYBUFF_SIZE)//循环队列,如果队列尾指针越界
{
Key_IndexR = 0; //队列尾指针回到数组起始位置
}
RESTORE_INT; //恢复中断允许
return(Key);
}
/****************************************************************************
* 名 称:Key_WaitKey()
* 功 能:从键盘缓冲队列内读取一次键值
* 入口参数:无
* 出口参数:若有按键,返回键值,否则等待按键。
* 说 明: 该函数会阻塞CPU继续执行后面的程序,应用时需注意。
****************************************************************************/
char Key_WaitKey()
{ char Key;
while(1)
{
Key=Key_GetKey(); //从键盘缓冲队列读取一次键值
if(Key==0) LPM3; //如果没按键,则停止CPU,等待被唤醒继续读按键
else return(Key); //如果有按键,则返回键值
}
}
/****************************************************************************
* 名 称:Key_ScanIO()
* 功 能:扫描键盘IO口并判断按键事件
* 入口参数:无
* 出口参数:无,键值压入缓冲队列
* 说 明: 该函数需要每隔1/16秒至1/128秒调用一次。最好放在定时中断内执行。
如果中断间隔太长,可能丢键;间隔太短不能消除抖动。
****************************************************************************/
void Key_ScanIO()
{
P_KEY1=N_KEY1; //保存KEY1前一次的状态
N_KEY1=KEY1_IN; //读取KEY1当前的状态
P_KEY2=N_KEY2; //保存KEY2前一次的状态
N_KEY2=KEY2_IN; //读取KEY2当前的状态
P_KEY3=N_KEY3; //保存KEY3前一次的状态
N_KEY3=KEY3_IN; //读取KEY3当前的状态
if((P_KEY1!=0)&&(N_KEY1==0)) Key_InBuff(PUSH_KEY1);
if((P_KEY2!=0)&&(N_KEY2==0)) Key_InBuff(PUSH_KEY2);
if((P_KEY3!=0)&&(N_KEY3==0)) Key_InBuff(PUSH_KEY3);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -