📄 2x8_key.c
字号:
/*---------------------------------------
2X8键盘扫描程序
M16的PA5~PA7接74HC138的A.B.C输入端,74HC138的输出端接键盘的8列
M16的PC6.PC7接键盘的2行
用定时器0定时中断来进行键盘扫描,返回键值,不能多键同时按,不能长按
-----------------------------------------*/
//定义MCU与按键的接口
#include <avr/io.h>
#include "2X8_key.h"
#include "type.h"
#define key_SEL_PORT PORTA
#define key_SEL_DDR DDRA
#define key_PORT PORTC
#define key_DDR DDRC
#define key_PIN PINC
#define key_SELA PA5 //portA5
#define key_SELB PA6 //portA6
#define key_SELC PA7 //portA7
#define key_KIN0 PC6 //portC6
#define key_KIN1 PC7 //portC7
/*----------------------------------------------------------
key_init :按键相关端口初始化函数
输入参数 :无
输出参数 :无
作者 :ken
日期 :2007-08-15
--------------------------------------------------------------*/
void key_init(void)
{
key_SEL_DDR|=((1<<key_SELA)|(1<<key_SELB)|(1<<key_SELC)); //设置为输出
key_SEL_PORT&=~(1<<key_SELA);
key_SEL_PORT&=~(1<<key_SELB);
key_SEL_PORT&=~(1<<key_SELC);
key_PORT|=((1<<key_KIN0)|(1<<key_KIN1)); //设置内部上拉电阻
key_DDR&=~(1<<key_KIN0); //设置为输入
key_DDR&=~(1<<key_KIN1);
}
/*-------------------------------------------------------------------
key :按键扫描函数
输入参数 :无
输出参数 :键码
作者 :ken
日期 :2007-08-15
---------------------------------------------------------------*/
unsigned char key(void)
{
unsigned char row; //col表示行,row表示列
for(row=0;row<8;row++)
{
key_SEL_PORT&=0x1f;
key_SEL_PORT|=(row<<5); //把row值送到高3位
if((key_PIN&(1<<key_KIN1))==0) //第二行有按键按下
{
return(10+row); //返回第二行键值10-17
}
if((key_PIN&(1<<key_KIN0))==0) //第一行有按键按下
{
return(row); //返回第一行键值00-07
}
}
return(9);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -