定时器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
文章评论(0条评论)
登录后参与讨论