原创 独立按键扫描

2010-9-5 10:32 5191 6 6 分类: MCU/ 嵌入式

定时器1每20ms扫描一次按键,可处理短按、长按


 


key.c


/*


 * 文 件 名:key.c


 * 芯    片:STC12C5A60S2


 * 晶    振:12MHz


 * 创 建 者:冷月


 * 创建日期:2010.9.2


 * 修 改 者:


 * 修改日期:


 * 功能描述:按键扫描


 */


 


#include <STC12C5A.H>


#include "key.h"


 


#define    uchar      unsigned char


#define    uint  unsigned int


 


 


//按键扫描相关变量


uchar trig = 0;                      //按键触发,即有键按下


uchar hold = 0;                    //按键长按


uchar release = 0;                //按键释放


 


//独立按键长按计数


uchar keyCounter = 0;


 


//定时器中断次数统计


uchar timerCounter = 0;


 


 


//函数原型申明


static void KeyScan(void);


static void KeyProc(void);


 


 


/*


 * 函 数 名:InitTimer1


 * 功能描述:定时器1方式2,定时50us,启用中断


 * 输入参数:无


 * 返 回 值:无


 */


void InitTimer1(void)


{


    TMOD |= 0x20;


 


    TH1 = (256 - 200) % 256;           //200us


    TL1 = (256 - 200) % 256;


 


    EA = 1;


    ET1 = 1;


 


    TR1 = 1;


}


 


 


/*


 * 函 数 名:KeyScan


 * 功能描述:扫描独立按键,并保存按键相关状态相关


 * 输入参数:无


 * 返 回 值:无


 */


static void KeyScan(void)


{


       uchar keyData;


 


       keyData = keyPort ^ 0xFF;                          //读键值


       trig = keyData & (keyData ^ hold);           //得到按下触发值


       release =  keyData ^ trig ^ hold;         //得到释放触发值


       hold = keyData;                           //得到所有未释放的键值


}


 


 


/*


 * 函 数 名:KeyProc


 * 功能描述:独立按键按下处理


 * 输入参数:无


 * 返 回 值:无


 */


static void KeyProc(void)


{


       if (trig & KEY1)                  //短按


       {


              //Add The Other Code Here


       }


 


       if (hold & KEY1)                //长按


       {


              keyCounter++;


              if (keyCounter > 10)      //200ms


              {


                     keyCounter = 0;


 


                     //Add The Other Code Here


              }


       }


}


 


 


/*


 * 函 数 名:Timer1Int


 * 功能描述:定时器1中断服务程序,用于扫描按键


 * 输入参数:无


 * 返 回 值:无


 */


void Timer1Int(void) interrupt 3


{


    timerCounter++;


       if (timerCounter < 100)               //20ms扫描键盘一次


       {


              KeyScan();


              KeyProc();


       }


}


 


 


key.h


/*


 * 模 块 名:key.h


 * 芯    片:STC12C5A60S2


 * 晶    振:12MHz


 * 创 建 者:冷月


 * 创建日期:2010.9.2


 * 修 改 者:


 * 修改日期:


 * 功能描述:按键扫描


 */


 


#ifndef    _KEY_H_


#define    _KEY_H_


 


#include <STC12C5A.H>


 


#define    uchar      unsigned char


#define    uint  unsigned int


 


//按键扫描相关变量


extern uchar trig;                         //按键触发,即有键按下


extern uchar hold;                       //按键长按


extern uchar release;                   //按键释放


 


 


//接按键IO口


#define    keyPort   P2


 


//独立按键 P23


#define KEY1       0x04


 


 


/*


 * 函 数 名:InitTimer1


 * 调    用:InitTimer1();


 * 功能描述:定时器1每20ms中断扫描按键一次


 */


void InitTimer1(void);


 


 


#endif

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条