4*4的键盘矩阵
来源:互联网 发布:有道云协作下载 mac 编辑:程序博客网 时间:2024/05/21 10:58
一个4*4的键盘矩阵,可以采用逐行扫描或全扫描的方式实现按键的读取。
行列扫描
若行线和列线加驱动后空载时为高电平,逐行扫描的方法为逐行使行线的每位为低,再判断列线的返回信号,如果没有键按下,返回的信号全为高;如果返回的信号中有列线为低,那么肯定是有按键按下,根据列线和行线的交点可以判断按键的具体位置。
可以设置一个数组,存放从1到F对应的16个代码,比如将P2_0与P2_7的交点处定为0,那么数组第0个元素则为0X7E(二进制0111 1110),当正确求出P2对应的数值时与数组对照便可求得按键的值。
uchar keyboard[16]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,0xde,
0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7},这个数组就是对应键盘扫描值的0~F。
注意:这个数组依照确定键值的位置不同而不同。
全扫描
全扫描的方法为先列线全为低,判断行线,如果行线有为低的,则可以判断有键按下,此时还不能判断某列的具体的键和列,还需反过来将列线全为高,再判断具体的列,根据行列号即确定具体的按键。
#include <at89x52.h>
#include "key.h"
//键盘扫描码
//键值 0 1 2 3 4 5 6 7
const unsigned char keyboard[16]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,
//键值 8 9 a b c d e f
0xde,0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7 };
const unsigned char Select_bit[4] = {0x01,0x02,0x04,0x08}; //行列扫描所需变量
unsigned char KeyValue = 0xFF; //键盘扫描值
/******************************************************
名称:delay_10ms
功能:防抖动延时10ms
参数:unsigned int i
*******************************************************/
void delay_10ms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=2250;j>0;j--);
}
/******************************************************
名称:key_value
功能:获得键盘扫描值
参数:unsigned char scancode(行列锁确定的扫描值)
*******************************************************/
void key_value(unsigned char scancode)
{
unsigned char point;
for( point = 0x00; point < 0x10; point++)
{
if(scancode == keyboard[point])
{
KeyValue = point;
}
}
}
/******************************************************
名称:Key_AllScan
功能:键盘全扫描
参数:无
*******************************************************/
unsigned char Key_AllScan(void)
{
unsigned char Temp_key, Temp_10ms;
P2 = 0x0F; //全扫描线全为低,判断行线
Temp_key = P2;
if ( Temp_key < 0x0F ) //判断按键按下
{
delay_10ms(1); //延时防抖动
Temp_10ms = P2;
if(Temp_10ms == Temp_key)
{
Temp_key ^= 0xF0; //列线全为高在判断具体的列
P2 = Temp_key;
Temp_key = P2;
key_value(Temp_key); //获得键盘扫描值
}
}
return KeyValue;
}
/******************************************************
名称:Key_RankScan
功能:键盘行列扫描
参数:无
*******************************************************/
unsigned char Key_RankScan(void)
{
unsigned char Temp_key, Temp , Temp_10ms, point;
for(point = 0x00; point < 0x04; point++) //逐行设置低电平
{
Temp = 0xFF;
Temp ^= Select_bit[point]; //判断是否有按键按下
P2 = Temp;
Temp_key = P2;
if(Temp != Temp_key)
{
delay_10ms(1); //延时放抖动
Temp_10ms = P2;
if(Temp_10ms == Temp_key)
{
key_value(Temp_key);
break;
}
}
}
return KeyValue;
}
- 4*4的键盘矩阵
- 4x4的矩阵键盘
- 4*4矩阵键盘
- 4*4矩阵键盘
- 4x4 矩阵键盘
- 4*4矩阵键盘的设计
- 4*4矩阵键盘的实现方式
- 4*4矩阵键盘的扫描原理
- stm32 4*4矩阵键盘
- 4X4矩阵键盘程序
- 4X4矩阵键盘1
- 单片机4×4矩阵键盘的工作原理与编程
- C调用汇编语言的4*4矩阵键盘汇编源程序。
- 4×4矩阵键盘的工作原理与编程
- 利用中断实现的4*4矩阵键盘扫描
- 基于51单片机的4×4矩阵键盘电子琴
- 4×4 矩阵式键盘电路的改进
- 4*4矩阵键盘终端模式的软件实现
- 抽象类和接口的比较
- Fzu 1683
- MFC中易混淆的字符串指针
- 表单上传文件时,不能获取表单中字段解决方法
- [转]: 读者写者问题(读写锁问题)
- 4*4的键盘矩阵
- 无线模块24l01使用心得(转)
- C8051F930 在线切换频率
- windows自定义事件源制作
- Ajax快速入门之http协议基础
- 用DEF文件从DLL中导出C++类
- 用VC++定制和调用动态链接库
- 一个HR给应届毕业生的面试建议
- 鄢陵项目