MSP430 键盘程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*
MSP430F42X系列单片机16位ADC通用程序库
说明:该驱动程序库包含了常用的16位ADC操作与控制功能函数,如选择通道、设置信号放大/*
带有缓冲区及长短键的键盘通用程序库
说明:该程序库包含了读取键盘的相关函数,并且包含了一个键盘缓冲区,当主程序执行较慢,而遇到连续快速的键盘输入来不及及时读取的情况下,
新的按键信息将会自动存入键盘缓冲队列内,每次调用读键盘函数时会
依顺序读取,保证键盘操作不会丢失。并且带有长短按键识别功能,当按
键时间小于2秒时,返回短键,按键超过2秒后,每隔0.25秒返回一次长
按键。
该键盘程序可以作为各种程序的底层驱动使用。
要使用该库函数,需要将本文件(Key.c)添加进工程,并在需要调用键盘函数的文件开头处包含"Key.h";还需要开启一个定时器,在定时中断
内调用Key_ScanIO()函数。设置定时中断的频率在16~128次/秒之间。
*/
// +-------------+
// | 定时中断| 软件结构
// +-------------+
// |
// +-------------+ +-------------+ +-------------+
// 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
#define KEYBUFF_SIZE 8 /*键盘缓冲区大小,根据程序需要自行调整*/
char KeyBuff[KEYBUFF_SIZE]; //定义键盘缓冲队列数组(FIFO)
char Key_IndexW=0; //键盘缓冲队列写入指针(头指针)
char Key_IndexR=0; //键盘缓冲队列读取指针(尾指针
char Key_Count=0; //键盘缓冲队列内记录的按键次数
char KEY1_State=0;
char KEY2_State=0;
char KEY3_State=0; /*3个按键的状态变量*/
#define NOKEY0
#define PUSH_KEY 1
#define LONG_PUSH 2
#define KEY1_IN (P5IN&BIT5) //KEY1输入IO的定义(P6.4)
#define KEY2_IN (P5IN&BIT6) //KEY2输入IO的定义(P6.5)
#define KEY3_IN (P5IN&BIT7) //KEY3输入IO的定义(P6.6)
#define KEY1 0x01 //SET按键
#define KEY2 0x02 //增加按键
#define KEY3 0x04 //减小按键
#define LONG 0x80 /*连续长键标志位宏定义*/
#define FIRSTLONG 0xC0 /*首次长键标志位宏定义*/
/**************************************************************************** * 名称:Key_InBuff()
* 功能:将一次键值压入键盘缓冲队列
* 入口参数:Key:被压入缓冲队列的键值
* 出口参数:无
****************************************************************************/ void Key_InBuff(char Key)
{
if(Key_Count>=KEYBUFF_SIZE) return;//若缓冲区已满,放弃本次按键
_DINT();
Key_Count++; //按键次数计数增加
KeyBuff[Key_IndexW] = Key; //从队列头部追加新的数据
if (++Key_IndexW >= KEYBUFF_SIZE) //循环队列,如果队列头指针越界
{
Key_IndexW = 0; //队列头指针回到数组起始位置
}
_EINT();
}
/**************************************************************************** * 名称:Key_GetKey()
* 功能:从键盘缓冲队列内读取一次键值
* 入口参数:无
* 出口参数:若无按键,返回0,否则返回一次按键键值。
* 说明: 调用一次该函数,会自动删除缓冲队列里一次按键键值。
****************************************************************************/ char Key_GetKey()
{ char Key;
if(Key_Count==0) return(0); //若无按键,返回0
_DINT();
//队列操作过程中不允许被定时中断执行ScanIO函数,保护全局变量正确
Key_Count--; //按键次数计数减1
Key=KeyBuff[Key_IndexR]; //从缓冲区尾部读取一个按键值
if (++Key_IndexR >= KEYBUFF_SIZE)//循环队列,如果队列尾指针越界{
Key_IndexR = 0; //队列尾指针回到数组起始位置
}
_EINT(); //恢复中断允许
return(Key);
}
/**************************************************************************** * 名称:Key_ScanIO()
* 功能:扫描键盘IO口并判断按键事件
* 入口参数:Ticks:该函数每秒被调用的次数
* 出口参数:无,键值压入缓冲队列
* 说明: 该函数需要每隔1/16秒至1/128秒调用一次。最好放在定时中断内执行。
如果中断间隔太长,可能丢键;间隔太短不能消除抖动。
* 范例:在1/32秒中断内调用:Key_ScanIO(32);
在5ms定时中断内调用:Key_ScanIO(200);
****************************************************************************/ void Key_ScanIO(int Ticks)
{
//static unsigned int Key1TimerS,Key1TimerL;
static unsigned int Key2TimerS,Key2TimerL;
static unsigned int Key3TimerS,Key3TimerL;