📄 key_board.h
字号:
/************************************************
文件:keyboard.h (线翻转法)
用途:矩阵键盘程序 头文件
注意:修改宏定义,扩展请修改宏定义和key_board_get_key函数
创建:2008.2.20
修改:2008.2.20
Copy Right (c) www.avrvi.com AVR与虚拟仪器
************************************************/
/**************************************
** ----------------------
** | PA0 PA1 PA2 PA3
** | | | | |
** |PA4 1 2 3 A
** |PA5 4 5 6 B
** |PA6 7 8 9 C
** |PA7 * 0 # D
** ----------------------
**************************************/
#ifndef _KEYBOARD_
#define _KEYBOARD_ 1
#define KEY_DDR_COL DDRA
#define KEY_PORT_COL PORTA
#define KEY_PIN_COL PINA
#define KEY_DDR_ROW DDRA
#define KEY_PORT_ROW PORTA
#define KEY_PIN_ROW PINA
#define WAIT_KEY_UP 1
//每行每列的按键数
#define PER_POW 4
#define PER_COL 4
//按键声
#define BEEP_EN 1 //使用蜂鸣器
#define BEEP_BIT 0 //PD0接蜂鸣器
#define BEEP_DDR DDRD
#define BEEP_PORT PORTD
#define KEY_USE_INT 1
//PD2为INT0 作为中断口
#define IV_number iv_INT0 // iv_INT1 iv_INT2
#define INT_BIT INT0
//在中断初始化中使用 GICR |= (1<<INT_BIT); //中断允许位,如INT0
#define KEY_INT 2
#define KEY_INT_DDR DDRD
#define KEY_INT_RORT PORTD
#if KEY_USE_INT==1
extern volatile uint8 KEY_FLAG,key;
#endif
//行连接所对应的IO口
#define KEY_ROW_0 4
#define KEY_ROW_1 5
#define KEY_ROW_2 6
#define KEY_ROW_3 7
#define KEY_ROW_ALL ((1<<KEY_ROW_0)|(1<<KEY_ROW_1)|(1<<KEY_ROW_2)|(1<<KEY_ROW_3))
//可以扩展成更多,当然,这样就不能只有一个端口来实现了,需要行列所在的端口不同。
//最多可以到8*8,也可以缩减到2*2,甚至1*X,但是那样没有意义,超过16个键是修改key_board_table数组。
//#define KEY_ROW_5 0
//#define KEY_ROW_6 1
//#define KEY_ROW_7 2
//#define KEY_ROW_8 3
//列连接所对应的IO口
#define KEY_COL_0 0
#define KEY_COL_1 1
#define KEY_COL_2 2
#define KEY_COL_3 3
#define KEY_COL_ALL ((1<<KEY_COL_0)|(1<<KEY_COL_1)|(1<<KEY_COL_2)|(1<<KEY_COL_3))
//同理可以和上面注释部分一样扩展,注意 KEY_COL_ALL 要跟着修改
//#define KEY_COL_4 4
//#define KEY_COL_5 5
//#define KEY_COL_6 6
//#define KEY_COL_7 7
#define HAVE_KEY_DOWN ( (KEY_PIN_COL & KEY_COL_ALL) != KEY_COL_ALL )
//有键按下判断,默认初始化为行输出低,列输入,并使能内部上拉
//判断是否有按键即是判断列的输入是否是全为高,这样也有利于设计低电平触发的中断按键。
/***********************************************************
** 函数名称: void key_board_int(void)
** 功能描述: 中断脚初始化
** 输 入: 无
** 输出 : 无
** 全局变量: 无
** 调用模块:
** 说明:输入,并使能内部上拉
** 注意:
**********************************************************/
void key_int_init(void);
/***********************************************************
** 函数名称: void key_board_int(void)
** 功能描述: 矩阵键盘扫描初始化
** 输 入: 无
** 输出 : 无
** 全局变量: 无
** 调用模块:
** 说明:默认初始化为行输出低,列输入,并使能内部上拉
** 注意:
**********************************************************/
void key_board_int(void);
/***********************************************************
** 函数名称: uint8 key_board_get_key(void)
** 功能描述: 矩阵键盘扫描并读取键值
** 输 入: 无
** 输出 : 按键的键值,在key_board_table[]定义,无按键返回0xFF
** 全局变量: 无
** 调用模块: void key_board_int(void)
** 说明:通过预定义#define WAIT_KEY_UP设置等待按键抬起(1),不等待按键抬起(0)
** 注意:如果不等待按键抬起,很容易产生粘贴键,注意在程序中处理。
**********************************************************/
uint8 key_board_get_key(void);
#endif
/* 使用举例
key_board_int(); //矩阵按键初始化
if(HAVE_KEY_DOWN) //如果有键按下
{
key = key_board_get_key(); //读取键值
****
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -