C51 矩阵按键 个人笔记

矩阵按键

电路

每个按键一端和同行一端相连(JP4的高4位),另一端和同列一端相连(JP4的低4位)

判断按键是否按下:

法一:逐行扫描

for(int i = 8 ; i>3 ; i-- )
	{
		JP4^i = 0;
		If ( 低四位不全为1)
			低四位为0的那一列,第i行 的按键被按下
}

法二:行列扫描

完整代码:

#include <reg51.h>
typedef unsigned int u16;		 
typedef unsigned char u8;
#define delaytime 50000000
#define GPIO_DIG P0
#define GPIO_KEY P1
 							  
//这里用的静态数码管是共阳的

 //RAM 占用少,存在flash 里面:code
 //共阴的表
u8 code ledSegment  [16] = {0x3f,	0x06,	0x5b,	0x4f,	0x66,	0x6d,
						0x7d,	0x07,	0x7f,	0x6f,	0x77,
						0x7c,	0x39,	0x5e,	0x79,	0x71};
u8 KeyValue=0;
void delay(u16 i)
{
	while(i--);
}
void KeyDown()
{
	char a = 0;
	GPIO_KEY = 0x0f;  //高四位低电平,第四位高电平
	if(GPIO_KEY!= 0x0f)
	{
		delay(1000);
		if(GPIO_KEY!= 0x0f)
		{
			//--------------------------求列数----------------------------------//
			switch(GPIO_KEY)
			{
				case(0x07):	 KeyValue = 0; break;		//0000 0111  : 第一列
				case(0x0b):	 KeyValue = 1; break;		//0000 1011  : 第二列
				case(0x0d):	 KeyValue = 2; break;		//0000 1101  : 第三列
				case(0x0e):	 KeyValue = 3; break;		//0000 1110  : 第四列
			}
			//--------------------------求行数----------------------------------//
			GPIO_KEY = 0xf0;  //高四位高电平,第四位低电平	
			switch(GPIO_KEY)
			{
				case(0x70):	 KeyValue += 0; break;	  //第一行	
				case(0xb0):	 KeyValue += 4; break;		
				case(0xd0): KeyValue += 8; break;		
				case(0xe0):	 KeyValue += 12; break;		//第四行
			}
			//退出条件:按键松开或超过
			while((a<50)&&(GPIO_KEY!= 0xf0)) 		 //	  GPIO_KEY!= 0xf0 说明按键还没松
			{
				delay(1000);
				a++; 
			}
		}
	}
}

void main(void)
{
	
	while(1)
	{
	 	 KeyDown();
		 //KeyValue = 1;
		 GPIO_DIG = ~ledSegment[KeyValue];
	}
}

接线

在普中科技的开发试验仪上,注意矩阵按键和P1端口的排线要反接,同事可能要拔掉74HC165上的短接片

原文地址:https://www.cnblogs.com/YuQiao0303/p/9907458.html