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

📄 key.c

📁 MSP430FE425的1位低功耗单片机的IO口键盘的通用显示程序。调用该程序时候只需根据实际情况修改部分参数即可。
💻 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 + -