51矩阵键盘

矩阵键盘,我敢肯定大家都知道原理啦!

代码直接奉上!!!!!

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = {       
0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,
0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c ,
0x39 , 0x5e , 0x79 , 0x71}; 
sbit wela = P2^7;
sbit dula = P2^6;
uchar num,temp;
void delay(uint z)  //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
{					//delay(500);大约延时500ms.
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);	
}
void main()
{
	dula = 1;
	P0 = 0;
	dula = 0;
	wela = 1;
	P0 = 0xfe;
	wela = 0;
	while(1) //始终检测键盘
	{
		P3 = 0xfe; //检测第一行
		temp = P3; //读回来,如果有键按下肯定不一样
		temp = temp&0xf0;//比较
		while(temp != 0xf0)//第一行有按键按下
		{
			delay(5); //去抖
			temp = P3;
			temp = temp&0xf0;
			while(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;
					}
					while(temp!=0xf0)
					{
						temp = P3;
						temp = temp&0xf0;//松手检测,退出while
					}
				dula = 1;
				P0 =table[num - 1];
				dula = 0;
			}
		}
 
		P3 = 0xfd; //检测第二行
		temp = P3;
		temp = temp&0xf0;
		while(temp != 0xf0)
		{
			delay(5);
			temp = P3;
			temp = temp&0xf0;
			while(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;
					}
					while(temp!=0xf0)
					{
						temp = P3;
						temp = temp&0xf0;//松手检测,退出while
					}
				dula = 1;
				P0 =table[num - 1];
				dula = 0;
			}
		}
 
		P3 = 0xfb; //第三行
		temp = P3;
		temp = temp&0xf0;
		while(temp != 0xf0)
		{
			delay(5);
			temp = P3;
			temp = temp&0xf0;
			while(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;
					}
					while(temp!=0xf0)
					{
						temp = P3;
						temp = temp&0xf0;//松手检测,退出while
					}
				dula = 1;
				P0 =table[num - 1];
				dula = 0;
			}
		}
 
		P3 = 0xf7; //第四行
		temp = P3;
		temp = temp&0xf0;
		while(temp != 0xf0)
		{
			delay(5);
			temp = P3;
			temp = temp&0xf0;
			while(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;
					}
					while(temp!=0xf0)
					{
						temp = P3;
						temp = temp&0xf0;//松手检测,退出while
					}
				dula = 1;
				P0 =table[num - 1];
				dula = 0;
			}
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值