矩阵键盘—线翻转法

线翻翻转

在这里插入图片描述每一行的按键接在同一个引脚上(P3.0—P3.3),每一列的按键接在同一个引脚上(P3.4~P3.7).
一 首先每一行置高电平,列置低电平(P3=0X0F)。
二 当有按键按下时,他所对应的行列的电平都将为低电平。即P3的值发生变 化,读取P3的值赋值给 H 可确定按键的行坐标。
三 将P3电平翻转(P3=0xF0),行为低电平,列为高电平。由于单片机运行速度很快所以此时按键还是按下状态,他的行列都为低低电平。
四 读取P3的值赋值给 L 可确定按键的列坐标.

C51配置

int keyscan()			//N为第几个按键
{
		P0=0x0f; //行高 列低
		if(P0!=0x0f) //是否有按键按下
		{
			delay(10);//消抖
			if(P0!=0x0f) //有按键按下
			{
				switch(PO)//读取PO的值,判断行
				{
					case 0X0E; H=1;break; //00001110 第一行有按键按下
					case 0X0D; H=2;break; 
					case 0X0B; H=3;break; 
					case 0X07; H=4;break; 
					default;break;
				}
				P0=0xF0;//翻转行低,列高,判断列。 注;此时按键还是按下状态所以在给P0赋0xf0之后的瞬间按键的那一行列还为低电平。
				switch(PO)//读取PO的值,判断行
				{
					case 0XE0; L=1;break; //1110 0000 第一列有按键按下
					case 0XD0; L=2;break; 
					case 0XB0; L=3;break; 
					case 0X70; L=4;break; 
					default;break;
				}	
				N=(H-1)*4+L;
			}
		}
		return N;
	}	
				

STM32配置
引脚

void Key_Init1(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2| GPIO_Pin_3  ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2| GPIO_Pin_3 );

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//下拉输入
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_7 ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void Key_Init2(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上下拉输入
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOA,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_7 );
}

按键设置

uint8_t Key_GetNum(void)
{
	int v_h=0,v_l=0,v,v1,v2;
	Key_Init1();//pb0~3 高pb4·7 低
	v1=GPIO_ReadInputData(GPIOA);
	v1=v1&0x00F0;

	if(v1!=0x00F0)
	{
		Delay_ms(10);
		v1=GPIO_ReadInputData(GPIOA);//消抖
		v1=v1&0x00F0;
		if(v1!=0x00F0)
	{

		v1=GPIO_ReadInputData(GPIOA);
		v1=v1&0x00F0;
		switch(v1)
		{
			case 0x00E0: v_l=1;break;
			case 0x00D0: v_l=2;break;
			case 0x00B0: v_l=3;break;
			case 0x0070: v_l=4;break;
			default:break;		
		}
		Key_Init2();
		v2=GPIO_ReadInputData(GPIOA);
		v2=v2&0x000F;
		switch(v2)
		{
			case 0x000E: v_h=1;break;
			case 0x000D: v_h=2;break;
			case 0x000B: v_h=3;break;
			case 0x0007: v_h=4;break;
			default:break;		
		}
		v=(v_h-1)*3+v_l;
	}
	}
	
	return v;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值