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

📄 key.c

📁 基于AT Mega16的多功能小车
💻 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 + -