MSP430 键盘程序

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档