C51键盘

消抖

if(key1==0){
			delay(10);//按下消抖
			if(key1==0){
				d1=0;
				num++;
				if(num==10)
				num=0;	
			}
			while(!key1);//判断是否松开按键
			delay(10);//松开消抖
			while(!key1);
		}

矩阵键盘的检测

比如4*4的矩阵键盘
检测时要一行一行的检测。4+4需要用到8个二进制位,正好2个16进制位,列在前行在后。
检测要用到一个循环,由于51单片机上电后所有接口默认高电平,而键盘按下后为低电平,循环中按顺序1、2、3、4检测行。
例如检测第一行时,先将P3赋值为0xFE即第一行为0。然后读取此时键盘状态(即P3的值)并将值与0xF0相与,若结果仍为0xF0,则表示该行无键盘按下,继续下一行的检测。

检测第一行例程

while(1){
		P3=0xfe;
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0){
			delay(5);
			temp=P3;
			temp=temp&0xf0;
			if(temp!=0xf0){
				switch(temp){
					case 0xe0:num=1;
						break;
					case 0xd0:num=2;
						break;
					case 0xb0:num=3;
						break;
					case 0x70:num=4;
						break;				
				}
				dula=1;
				P0=table[num-1];
				dula=0;
			}
		
		}
	}

检测4*4矩阵键盘例程

某键按下后显示对应数字。

#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int 
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit dula=P2^6;
sbit wela=P2^7;
uchar num=0,temp;
uint num1;
void delay(uint z);
uint keyscan();
void main(){
	dula=1;
	P0=0;
	dula=0;
	wela=1;
	P0=0xc0;
	wela=0;

	while(1){
		num1=keyscan();
		dula=1;
		P0=table[num1-1];
		dula=0;
	}
}
void delay(uint z){
	uint x,y;
	for(x=z;x>0;x--){
		for(y=110;y>0;y--);
	}
}
uint keyscan(){
	//第一行
		P3=0xfe;
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0){
			delay(5);
			temp=P3;
			temp=temp&0xf0;
			if(temp!=0xf0){
				temp=P3;
				switch(temp){
					case 0xee:num=1;
						break;
					case 0xde:num=2;
						break;
					case 0xbe:num=3;
						break;
					case 0x7e:num=4;
						break;				
				}
			}
		
		}
		
		//第二行
		P3=0xfd;
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0){
			delay(5);
			temp=P3;
			temp=temp&0xf0;
			if(temp!=0xf0){
				temp=P3;
				switch(temp){
					case 0xed:num=5;
						break;
					case 0xdd:num=6;
						break;
					case 0xbd:num=7;
						break;
					case 0x7d:num=8;
						break;				
				}
			}
		
		}
		
		//第三行
		P3=0xfb;
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0){
			delay(5);
			temp=P3;
			temp=temp&0xf0;
			if(temp!=0xf0){
				temp=P3;
				switch(temp){
					case 0xeb:num=9;
						break;
					case 0xdb:num=10;
						break;
					case 0xbb:num=11;
						break;
					case 0x7b:num=12;
						break;				
				}
			}
		
		}
	
		//第四行
		P3=0xf7;
		temp=P3;
		temp=temp&0xf0;
		if(temp!=0xf0){
			delay(5);
			temp=P3;
			temp=temp&0xf0;
			if(temp!=0xf0){
				temp=P3;
				switch(temp){
					case 0xe7:num=13;
						break;
					case 0xd7:num=14;
						break;
					case 0xb7:num=15;
						break;
					case 0x77:num=16;
						break;				
				}
			}
		
		}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值