51单片机驱动 矩阵键盘原理及简单实现
原理:将P1赋值为0x0f, 如果某行被按下,P1.0 ~ P1.3 的某一个电平会被拉低,单片机就可以检查到电平变化,此时P1赋值为0xf0,再检测P1.4 ~ P1.7的电平,最后将前后值相或,得到的值就是等同于键盘某个键的“坐标”,例如以键盘左上角第一个键为坐标原点,键盘(0,0)的值为0000 1110 | 1110 0000 = 1110 1110,即0xee
贴代码:
/*
4x4矩阵键盘驱动
单片机:STC12C5A08S2 机械周期1T
晶振:13.37Mhz左右
功能:驱动4x4矩阵键盘
原理:
将P1赋值为0x0f, 如果某行被按下,P1.0 ~ P1.3 的某一个
电平会被拉低,单片机就可以检查到电平变化,此时P1赋值
为0xf0,再检测P1.4 ~ P1.7的电平,最后将前后值相或,得
到的值就是等同于键盘某个键的“坐标”,例如以键盘左上角
第一个键为坐标原点,键盘(0,0)的值为0000 1110 | 1110 0000 = 1110 1110,即0xee
抖动处理:4x4矩阵键盘无法接外设去抖动,所以设计100ms延时进行抖动处理
按键对应值:
(0,0) -> 0xee (2,0) -> 0xeb
(0,1) -> 0xde (2,1) -> 0xdb
(0,2) -> 0xbe (2,2) -> 0xbb
(0,3) -> 0x7e (2,3) -> 0x7b
(1,0) -> 0xed (3,0) -> 0xe7
(1,1) -> 0xdd (3,1) -> 0xd7
(1,2) -> 0xbd (3,2) -> 0xb7
(1,3) -> 0x7d (3,3) -> 0x77
*/
#include " stc12c5a.h " // stc12c5a系列单片机头文件,stc-isp有提供
#include < intrins.h >
unsigned char Data;
sbit po20 = P2^0;
void delay100ms(){
//延时100ms
unsigned int i;
unsigned char k;
for ( i = 0; i < 14285; i++ ){
for ( k = 0; k < 10; k++ ){
_nop_();
}
}
}
void FxFInit(){
//4x4键盘初始化
P1 = 0x0f; //0000 1111
P2 = 0x01; //0000 0001 我习惯将P2口做测试口
}
void judge(){
//判断按键
switch( Data ){
/*可按照上面的对照表添加case*/
case 0xee:
po20 = ~po20;
break;
default:
break;
}
}
void main(){
FxFInit();
while(1){
if(P1 != 0x0f){
//0x0f是初始化的值,如果不等于这个值,代表用户按下4行按键的某一行
delay100ms(); //延时100ms
if(P1 != 0x0f){
//延时检测,去抖动
Data = P1; //检测是哪行被按下,并存入信息
P1 = 0xf0; //0000 1111 -> 1111 0000
Data |= P1; //Data 与P1值相或 存入Data 最终Data会有4 x 4 = 16种结果,对应4x4键盘的每一位
judge();
P1 = 0x0f; //重新赋值
}
}
}
}