?? 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;
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 + -