51单片机———矩阵键盘

/*矩阵键盘,程序的思路是先进行扫描,记录下行值,后列扫描,记录下列值,
	然后根据行列的值确定按键

硬件:	P2口接八段数码管的段位,P2[0:7] = SEG[A-G,DP]
	P0口接键盘,即P0[0:7] = JP4[1-8]; 见原理图
	
	*/


#include<reg51.h>
#define u8 unsigned char
#define u16 unsigned int


u8 code Digit[17] = {0x3f,0x06,0x5b,0x4f,0x66,
					  0x6d,0x7D,0x07,0x7f,0x6f};	//只写了10,有点懒,就只说下面按键会有几个按下不显示

void DelayMs(u16 time)
{
	u8 i=0;
	for(;time>0;time--)
		for(i=110;i>0;i--)
			;
}

u8 KeyScan()
{
	u8 Row=0xf0,Col=0x0f,Key=0;
	P0 = 0xf0; 						//先扫描行
	if ( P0 != 0xf0)
	{
		 DelayMs(10);
		 if (P0 != 0xf0)
		 {
		 	Row = P0 & 0xf0;
			P0 = 0x0f;
			Col = P0 & 0x0f;		//扫描列
			while((P0&0x0f)!=0x0f);	//等待按键释放	
		 }
	}
	if ((Row+Col)!=0xff)			//表示有按键按下,也可以不判断
	{
		switch(Row+Col)				//根据行列的值确定按键
		{
			case 0x77:Key = 1;break;
			case 0x7B:Key = 2;break;
			case 0x7D:Key = 3;break;
			case 0x7E:Key = 4;break;

			case 0xB7:Key = 5;break;
			case 0xBB:Key = 6;break;
			case 0xBD:Key = 7;break;
			case 0xBE:Key = 8;break;

			case 0xD7:Key = 9;break;
			case 0xDB:Key = 10;break;
			case 0xDD:Key = 11;break;
			case 0xDE:Key = 12;

			case 0xE7:Key = 13;break;
			case 0xEB:Key = 14;break;
			case 0xED:Key = 15;break;
			case 0xEE:Key = 16;break;
		}		
	}
	return Key;			
}

void main()
{
	u8 key;
	P2 = 0x00;
	while(1)
	{
		key = KeyScan();
		if (key)
		{
			P2 = Digit[key];		
		}	
	}	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值