使用方法:放入工程,调用GetKeyValue,没按键时返回KEY_NULL,有按键时为按键字符,字符见文章最下面
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/********** AVR 矩阵键盘扫描程序 *********
* 版本.........: 1.0
* 作者.........: 陈利栋
* 目标.........: AVR
* 文件名.......: Keyboard.h
* 编译器.......: AVR GCC 20100110
* 开发环境.....: AVR Studio V4.18
* 创建时间.....: 2010.09.12
* 最后修改.....: 2010.09.12
*****************************************/
#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 1000 //此值在不同环境下应适当调整(1 - 65535),值越小,灵敏度越高
extern unsigned char GetKeyValue(void);
#endif /* __KEYBOARD_H__ */
* 版本.........: 1.0
* 作者.........: 陈利栋
* 目标.........: AVR
* 文件名.......: Keyboard.h
* 编译器.......: AVR GCC 20100110
* 开发环境.....: AVR Studio V4.18
* 创建时间.....: 2010.09.12
* 最后修改.....: 2010.09.12
*****************************************/
#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 1000 //此值在不同环境下应适当调整(1 - 65535),值越小,灵敏度越高
extern unsigned char GetKeyValue(void);
#endif /* __KEYBOARD_H__ */
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/********** AVR 矩阵键盘扫描程序 *********
* 版本.........: 1.0
* 作者.........: 陈利栋
* 目标.........: AVR
* 文件名.......: Keyboard.c
* 编译器.......: AVR GCC 20100110
* 开发环境.....: AVR Studio V4.18
* 创建时间.....: 2010.09.12
* 最后修改.....: 2010.09.12
*****************************************/
#include "Keyboard.h"
unsigned char _key_last = KEY_NULL;
unsigned int _key_count = 0;
unsigned char KeyScan(void)
{
unsigned char temp = 0;
KEYBOARD_DDR = 0x0f;
KEYBOARD_PORT = 0xf0;
_delay_us(1);
temp = KEYBOARD_PIN;
KEYBOARD_DDR = 0xf0;
KEYBOARD_PORT = 0x0f;
_delay_us(1);
temp |= KEYBOARD_PIN;
if (temp != _key_last)
{
_key_count++;
if (_key_count >= KEY_READY_COUNT)
{
_key_last = temp;
_key_count = 0;
return _key_last;
}
}
else
{
_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;
}
}
* 版本.........: 1.0
* 作者.........: 陈利栋
* 目标.........: AVR
* 文件名.......: Keyboard.c
* 编译器.......: AVR GCC 20100110
* 开发环境.....: AVR Studio V4.18
* 创建时间.....: 2010.09.12
* 最后修改.....: 2010.09.12
*****************************************/
#include "Keyboard.h"
unsigned char _key_last = KEY_NULL;
unsigned int _key_count = 0;
unsigned char KeyScan(void)
{
unsigned char temp = 0;
KEYBOARD_DDR = 0x0f;
KEYBOARD_PORT = 0xf0;
_delay_us(1);
temp = KEYBOARD_PIN;
KEYBOARD_DDR = 0xf0;
KEYBOARD_PORT = 0x0f;
_delay_us(1);
temp |= KEYBOARD_PIN;
if (temp != _key_last)
{
_key_count++;
if (_key_count >= KEY_READY_COUNT)
{
_key_last = temp;
_key_count = 0;
return _key_last;
}
}
else
{
_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;
}
}