📄 key.c
字号:
//============================================================
// 文件名称:Key.c
// 实现功能:1*4按键扫描程序,适用于低电平有效的按键电路
// 使用定时器0中断(112.5Hz)
// 日期: 2008/7/28
//============================================================
//================================================
// 按键去抖动时间设定,单位为1/112.5秒
//================================================
#define Key_Debounce 1 // (4/112.5)秒=28.125ms
//================================================
// 持续按键时间间隔设定,单位1/128秒
//================================================
#define Key_TimeOut 16 // (64/112.5)秒=0.5688s
//================================================
// 按键使用端口设定
//================================================
#define Key_ALL 0x08
#define P_Key_Data PINA
#define P_Key_Dir DDRA
#define P_Key_Port PORTA
/*
#define P_Key_Data PINB
#define P_Key_Dir DDRB
#define P_Key_Port PORTB
#define P_Key_Data PINC
#define P_Key_Dir DDRC
#define P_Key_Port PORTC
#define P_Key_Data PIND
#define P_Key_Dir DDRD
#define P_Key_Port PORTD*/
#include "key.h"
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint8_t KeyCode; // 存储获得的键值
volatile uint8_t ScanCnt; // 该变量用来表示按键持续时间
volatile uint8_t KeyUp; // 按键是否处于抬起状态
//======================================================================
// 函 数: void Key_Init(void)
// 实现功能: 初始化按键扫描程序,该函数将开启定时器0溢出中断
// 入口参数: 无
// 返回 值: 无
//======================================================================
void Key_Init(void)
{
P_Key_Dir &= ~(/*_BV(0) | _BV(1) | _BV(2) | */_BV(3));
P_Key_Port |= /*_BV(0) | _BV(1) | _BV(2) | */_BV(3); // 设置按键为上拉电阻
ScanCnt = 0; // 初始化变量
KeyCode = 0;
KeyUp = 1;
TCNT0 = 0;
TCCR0 = _BV(CS02) | _BV(CS00); // 预分频256
TIMSK |= _BV(TOIE0);
sei(); // 使能中断
}
//======================================================================
// 函 数: void Key_Scan(void)
// 实现功能: 按键扫描,该函数被定时器0中断服务函数程序调用
// 入口参数: 无
// 返回 值: 无
//======================================================================
void Key_Scan(void)
{
uint8_t key_t;
// PORTB^=_BV(1); // 调试时用来指示
key_t = ~P_Key_Data; // 获取IO端口状态
key_t &= Key_ALL; // 判断当前是否有键按下
if(key_t != 0)
{
KeyUp = 0; // 按键没抬起
if(key_t == KeyCode)
{
ScanCnt++;
}
else
{
ScanCnt = 0;
KeyCode = key_t;
}
}
else
{
KeyUp = 1; // 按键抬起
}
}
//======================================================================
// 函 数: uint8_t Key_Get(void)
// 实现功能: 获取键值
// 入口参数: 无
// 返回 值: 获得的键值
//======================================================================
uint8_t Key_Get(void)
{
uint8_t key_G;
cli(); // 关中断
if((ScanCnt >= Key_Debounce) && (KeyUp == 1))
{
key_G = KeyCode;
KeyCode = 0;
ScanCnt = 0;
sei(); // 开中断
return key_G;
}
if((ScanCnt >= Key_TimeOut) && (KeyUp==0))
{
key_G = KeyCode;
KeyCode = 0;
ScanCnt = 0;
KeyUp = 1;
sei(); // 开中断
return key_G;
}
sei();
return 0; // 没有按键
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -