51单片机驱动 矩阵键盘原理及简单实现

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;	   //重新赋值
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_26106317/article/details/98957831