【Keil5 C51】AT89C52 矩阵键盘的检测原理及实现

矩阵键盘检测原理

P0 = 1111 1110;
temp = p0;
当按键0按下去时
temp口此时的值为 1110 1110;
我们检测如果此时temp的值不等于 1111 1110,说明有按键按下去了
咋检测此时temp的值,
若temp 为 1110 1110,说明按键0按下去了
若temp 为 1101 1110,说明按键0按下去了

矩阵键盘连接电路

举例

当按下0时,数码管全部显示0,
当按下1时,数码管全部显示1;

当按下F时,数码管全部显示F;

#include <reg52.h>

#define uint unsigned int
#define uchar unsigned char
#define ulint unsigned long int

sbit LE_D = P2^6;
sbit LE_W = P2^7;
uchar code table_D[] = {0xC0,0xF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x98,//[0-9]
	0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};	//[a-f 全灭]
uchar code table_W[] = {0x01,0x02,0x04,0x08,0x10,0x20};	//[1-6]

uchar num = 16;			//默认啥都没显示
uint temp;

//单排按键扫描函数,返回案件位置数
uchar keyScan(uchar n,uchar a,uchar b,uchar c,uchar d);
//全键盘扫描函数,返回按键位置数
uchar keyS();	
//延时函数
void delay(uint timeY);

void main(){
	//打开所有的位
	LE_W = 1;
	P0 = 0xFF;
	LE_W = 0;
	
	while(1){		
		LE_D = 1;
		P0 = table_D[keyS()];//把扫描到的按键位数显示出
		LE_D = 0;
	}
}
uchar keyS(){
	num =keyScan(0xFE,0,1,2,3);			//扫描第一排按键
	num =keyScan(0xFD,4,5,6,7);			//扫描第二排按键
	num =keyScan(0xFB,8,9,10,11);		//扫描第三排按键
	num =keyScan(0xF7,12,13,14,15);	//扫描第四排按键
	return num;
}

uchar keyScan(uchar n,uchar a,uchar b,uchar c,uchar d){
	P3 = n;								//先给P3赋值,决定扫描第几排按键
	temp = P3;						//若P3 = 1111 1110,就是扫描第一排
	temp = temp & 0xF0;		//此时temp = 11110000
	//检查是否有按键按下去了
	if(temp != 0xF0){			//若第一个按键按下去,则P3 = 11101110 此时temp = 1110000 != 0xf0;
		delay(5);						//延时是防止按下时按键抖动
		temp = P3;					//延时后重新赋值
		temp = temp & 0xF0;
		if(temp != 0xF0){		//5ms后还相等说明确实按下去了
			switch(temp){
				case 0xE0: num = a; break;			//1110 1110
				case 0xD0: num = b; break;			//1101 1110
				case 0xB0: num = c; break;			//1011 1110
				case 0x70: num = d; break;			//0111 1110			
			}
		}
		//当有按键按下去了,我们让程序停,松开按键后才能变化数字
		/*	while(temp != 0xF0){
			temp = P3;
			temp = temp & 0xF0;
		}*/
		return num;		
	} else {
		return num;
	}
}

void delay(uint timeY){			//每次延时1ms
	uint y;
	uint z;
	for(z = timeY; z > 0; z--){
			for(y = 115; y > 0; y--){}
	}
}

Proteus仿真

此时按下了按键E

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值