Keyboard.h
/********** AVR 矩阵键盘扫描程序 *********
* 版本.........: 2.0
* 作者.........: 陈利栋
* 目标.........: AVR
* 文件名.......: Keyboard.h
* 编译器.......: AVR GCC 20100110
* 开发环境.....: AVR Studio V4.18
* 创建时间.....: 2010.09.12
* 最后修改.....: 2010.09.29
*****************************************/
#ifndef __KEYBOARD_H__
#define __KEYBOARD_H__
#include <avr/io.h>
#include <util/delay.h>
#define KEYBOARD_PORT PORTA
#define KEYBOARD_DDR DDRA
#define KEYBOARD_PIN PINA
#define KEY_NULL 0xff
#define KEY_READY_COUNT 100 // 此值在不同环境下应适当调整(1 - 65535),值越小,灵敏度越高
#define KEY_CONTINUE_START_COUNT 20000 // 检测连续按键开始需要的次数,需要适当调整
#define KEY_CONTINUE_RUNNING_COUNT 1000 // 连续按键间隔需要的次数,需要适当调整
extern unsigned char key_continue_flag; // 连续按键标记
extern unsigned char GetKeyValue(void);
#endif /* __KEYBOARD_H__ */
* 版本.........: 2.0
* 作者.........: 陈利栋
* 目标.........: AVR
* 文件名.......: Keyboard.h
* 编译器.......: AVR GCC 20100110
* 开发环境.....: AVR Studio V4.18
* 创建时间.....: 2010.09.12
* 最后修改.....: 2010.09.29
*****************************************/
#ifndef __KEYBOARD_H__
#define __KEYBOARD_H__
#include <avr/io.h>
#include <util/delay.h>
#define KEYBOARD_PORT PORTA
#define KEYBOARD_DDR DDRA
#define KEYBOARD_PIN PINA
#define KEY_NULL 0xff
#define KEY_READY_COUNT 100 // 此值在不同环境下应适当调整(1 - 65535),值越小,灵敏度越高
#define KEY_CONTINUE_START_COUNT 20000 // 检测连续按键开始需要的次数,需要适当调整
#define KEY_CONTINUE_RUNNING_COUNT 1000 // 连续按键间隔需要的次数,需要适当调整
extern unsigned char key_continue_flag; // 连续按键标记
extern unsigned char GetKeyValue(void);
#endif /* __KEYBOARD_H__ */
Keyboard.c
/********** AVR 矩阵键盘扫描程序 *********
* 版本.........: 2.0
* 作者.........: 陈利栋
* 目标.........: AVR
* 文件名.......: Keyboard.c
* 编译器.......: AVR GCC 20100110
* 开发环境.....: AVR Studio V4.18
* 创建时间.....: 2010.09.12
* 最后修改.....: 2010.09.29
*****************************************/
#include "Keyboard.h"
unsigned char _key_last = KEY_NULL;
unsigned int _key_count = 0;
unsigned int _key_continue_count = 0;
unsigned char key_continue_flag = 0;
unsigned char KeyScan(void)
{
unsigned char temp = 0;
KEYBOARD_DDR = 0x0f;
KEYBOARD_PORT = 0xf0;
_delay_us(10);
temp = KEYBOARD_PIN;
KEYBOARD_DDR = 0xf0;
KEYBOARD_PORT = 0x0f;
_delay_us(10);
temp |= KEYBOARD_PIN;
if (temp != _key_last)
{
_key_count++;
if (_key_count >= KEY_READY_COUNT)
{
_key_last = temp;
_key_count = 0;
return _key_last;
}
key_continue_flag = 0;
}
else
{
if (temp != 0xff)
{
_key_continue_count++;
if (key_continue_flag == 0)
{
if (_key_continue_count >= KEY_CONTINUE_START_COUNT)
{
key_continue_flag = 1;
_key_continue_count = 0;
return temp;
}
}
else
{
if (_key_continue_count >= KEY_CONTINUE_RUNNING_COUNT)
{
_key_continue_count = 0;
return temp;
}
}
}
_key_count = 0;
}
return KEY_NULL;
}
unsigned char GetKeyValue(void)
{
switch (KeyScan())
{
case KEY_NULL: return KEY_NULL;
case 0x77: return '1';
case 0x7B: return '2';
case 0x7D: return '3';
case 0x7E: return 'A';
case 0xB7: return '4';
case 0xBB: return '5';
case 0xBD: return '6';
case 0xBE: return 'B';
case 0xD7: return '7';
case 0xDB: return '8';
case 0xDD: return '9';
case 0xDE: return 'C';
case 0xE7: return '*';
case 0xEB: return '0';
case 0xED: return '#';
case 0xEE: return 'D';
default : return KEY_NULL;
}
}
* 版本.........: 2.0
* 作者.........: 陈利栋
* 目标.........: AVR
* 文件名.......: Keyboard.c
* 编译器.......: AVR GCC 20100110
* 开发环境.....: AVR Studio V4.18
* 创建时间.....: 2010.09.12
* 最后修改.....: 2010.09.29
*****************************************/
#include "Keyboard.h"
unsigned char _key_last = KEY_NULL;
unsigned int _key_count = 0;
unsigned int _key_continue_count = 0;
unsigned char key_continue_flag = 0;
unsigned char KeyScan(void)
{
unsigned char temp = 0;
KEYBOARD_DDR = 0x0f;
KEYBOARD_PORT = 0xf0;
_delay_us(10);
temp = KEYBOARD_PIN;
KEYBOARD_DDR = 0xf0;
KEYBOARD_PORT = 0x0f;
_delay_us(10);
temp |= KEYBOARD_PIN;
if (temp != _key_last)
{
_key_count++;
if (_key_count >= KEY_READY_COUNT)
{
_key_last = temp;
_key_count = 0;
return _key_last;
}
key_continue_flag = 0;
}
else
{
if (temp != 0xff)
{
_key_continue_count++;
if (key_continue_flag == 0)
{
if (_key_continue_count >= KEY_CONTINUE_START_COUNT)
{
key_continue_flag = 1;
_key_continue_count = 0;
return temp;
}
}
else
{
if (_key_continue_count >= KEY_CONTINUE_RUNNING_COUNT)
{
_key_continue_count = 0;
return temp;
}
}
}
_key_count = 0;
}
return KEY_NULL;
}
unsigned char GetKeyValue(void)
{
switch (KeyScan())
{
case KEY_NULL: return KEY_NULL;
case 0x77: return '1';
case 0x7B: return '2';
case 0x7D: return '3';
case 0x7E: return 'A';
case 0xB7: return '4';
case 0xBB: return '5';
case 0xBD: return '6';
case 0xBE: return 'B';
case 0xD7: return '7';
case 0xDB: return '8';
case 0xDD: return '9';
case 0xDE: return 'C';
case 0xE7: return '*';
case 0xEB: return '0';
case 0xED: return '#';
case 0xEE: return 'D';
default : return KEY_NULL;
}
}