Autorleaders控制组--矩阵键盘

一、矩阵键盘简介

矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。

每一行或列检测时对应0,其余3行或列为1,则按键按下后0就可以传输,,不按下0就不会传输。

注意:

逐行扫描时由于P15连接到BZ(位于步进电机,相当于驱动器)进而连接到无源蜂鸣器,此时频率一会高一会低,所以蜂鸣器回响。所以采取逐列扫描的方式

扫描:

 注意:

单片机的1驱动能力弱,0驱动能力强,但有上限,不会造成短路。

二、初步运用

创建一个有返回值的函数,返回值是按键的键码,以此来判断按下的是哪个按键。

#include <REGX52.H>
#include "Delay.h"

unsigned char MatrixKey() 
{
	unsigned char KeyNumber=0;  
	
	P1=0xFF;
	P1_3=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}

	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}

	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}

	P1=0xFF;
	P1_4=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}

	
	return KeyNumber;  
}

用一个变量接受返回值,并输出。 

unsigned char KeyNum; 

void main()
{
	LCD_Init(); 
	LCD_ShowString(1,1,"MatrixKey:");
	while(1){
		KeyNum=MatrixKey();        
		if(KeyNum!=0)
		{
			LCD_ShowNum(2,1,KeyNum,2); 
		}
	}
}

二、矩阵键盘密码锁

对应按键按下输入密码,每次输入时,上一次输入的要向左进一位,然后按下S11时为确定键,判读是否与设定的密码相等,相等则显示OK同时密码清零重新输入,错误则显示ERR并重新输入,如若按下S12,则所有清零,重新输入。在这里面设定密码为4位(因为unsigned int类型的变量只从0到65535)所以要设立一个变量count若count==4,则继续输入就没用了。

unsigned char KeyNum; 
unsigned int Passwordd,Count;

void main()
{
	LCD_Init();  
	LCD_ShowString(1,1,"Password:");
	while(1){
		KeyNum=MatrixKey();         
		
		if(KeyNum)
		{
			if(KeyNum<=10)  
			{
				if(Count<4)      
				{
				  Password*=10;            
				  Password+=KetNum%10;     
				  Count++;
				}
			}
			LCD_ShowNum(2,1,Password,4); 
		}
		if(KeyNum==11)
		{
			if(Password==2345)
			{
				LCD_ShowString(1,14,"OK ");
				Password=0;               
				Count=0;                  
				LCD_ShowNum(2,1,Password,4); 
			} 
			else 
			{
				LCD_ShowString(1,14,"ERR");
				Password=0;
				Count=0;
				LCD_ShowNum(2,1,Password,4);  
			}
		}
		if(KeyNum==12)
		{
			Password=0;
			Count=0;
			LCD_ShowNum(2,1,Password,4);  
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值