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

📄 key_board.h

📁 键盘操作 键盘扫描 用的是单片机mega16
💻 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 + -