独立按键
独立按键的一端接地,另一端与单片机的某个 I/O 口相连, 开始时先给该 IO 口赋一高电平,然后让单片机不断地检测该 I/O 口是否变为 低电平,当按键闭合时,即相当于该 I/O 口通过按键与地相连,变成低电平, 程序一旦检测到 I/O 口变为低电平则说明按键被按下。
矩阵按键
行列描述法:
先送一列为低电平,其余几列全为高电平(此时我们确 定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电 平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列 的,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平,这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。当然我们也可以将行线置低电平,扫描列是否有低电平。从而达到整个键盘的检测。
线翻转法:
使所有行线为低电平时,检测所有列线是否有低电平,如果 有,就记录列线值;然后再翻转,使所有列线都为低电平,检测所有行线的值, 由于有按键按下,行线的值也会有变化,记录行线的值。从而就可以检测到全部 按键。
行列描述法的列子
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define GPIO_DIG P0
#define GPIO_KEY P1
u8 Key_value; //用来存放读取到的键值
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : KeyDown
* 函数功能 : 检测有按键按下并读取键值
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
int Key_down(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
delay(1000);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY = 0xF0;
switch(GPIO_KEY)
{
case(0xe0): Key_value = 0;break;
case(0xd0): Key_value = 1;break;
case(0xb0): Key_value = 2;break;
case(0x70): Key_value = 3;break;
}
//测试行
GPIO_KEY = 0x0F;
switch(GPIO_KEY)
{
case(0X0e): Key_value = Key_value;break;
case(0X0d): Key_value = Key_value+4;break;
case(0X0b): Key_value = Key_value+8;break;
case(0X07): Key_value = Key_value+12;break;
}
}
}
while((a<50)&&(GPIO_KEY!=0x0f)) //检测按键松手检测
{
delay(100);
a++;
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
while(1)
{
Key_value = Key_down(); //按键判断函数
GPIO_DIG=~smgduan[Key_value]; //
}
}
按键消抖
使用延时函数来消抖,延时10ms来进行消抖。delay(1000);相当于10ms。