【51单片机】(五)矩阵键盘

一.矩阵键盘原理

矩阵键盘是这个东西:
【51单片机】(五)矩阵键盘_第1张图片

电路原理图
【51单片机】(五)矩阵键盘_第2张图片
矩阵键盘的判断方式是:逐行逐列扫描。

P10、P11、P12、P13为一组(记为A组),属于“列”;
P14、P15、P16、P17为一组(记为B组),属于“行”。
通过扫描,确定是哪一行哪一列的按键被按下了。
起初,先给全体赋予高电平1(P1=0xFF),然后每次赋予A组的其中一个端口为低电平0,随后再遍历判断B组所有端口的电平情况,如果出现一个端口为低电平0,说明这条线路导通了,那么就可以判断是哪个按键按下了。

说起来有点复杂,还是用程序来说话吧!


二.矩阵键盘扫描(用LCD1602显示)

我们将矩阵键盘每个电键看成一个数字(S1就是1,S2就是2),当我们按下时,我们用LCD1602来显示这个按键的值。这样就能测试我们遍历程序正确与否。
【顺便封装一下MatrixKey呗】

MatrixKey.h:

#ifndef __MatrixKey_H__
#define __MatrixKey_H__

int MatrixKey();

#endif

MareixKey.c:【遍历的程序在这】

#include

void Delay(int x)
{
	while(x!=0)  {x--;}
}

int MatrixKey()
{
	int keynumber=0;
	
	P1=0xFF;   //initialize:1111 1111
	P1_3=0;   
	if(P1_7==0)  {Delay(100); while(P1_7==0); Delay(100); keynumber=1;}
	if(P1_6==0)  {Delay(100); while(P1_6==0); Delay(100); keynumber=5;}
	if(P1_5==0)  {Delay(100); while(P1_5==0); Delay(100); keynumber=9;}
	if(P1_4==0)  {Delay(100); while(P1_4==0); Delay(100); keynumber=13;}
	
	P1=0xFF;   //initialize:1111 1111
	P1_2=0;   
	if(P1_7==0)  {Delay(100); while(P1_7==0); Delay(100); keynumber=2;}
	if(P1_6==0)  {Delay(100); while(P1_6==0); Delay(100); keynumber=6;}
	if(P1_5==0)  {Delay(100); while(P1_5==0); Delay(100); keynumber=10;}
	if(P1_4==0)  {Delay(100); while(P1_4==0); Delay(100); keynumber=14;}
	
	P1=0xFF;   //initialize:1111 1111
	P1_1=0;   
	if(P1_7==0)  {Delay(100); while(P1_7==0); Delay(100); keynumber=3;}
	if(P1_6==0)  {Delay(100); while(P1_6==0); Delay(100); keynumber=7;}
	if(P1_5==0)  {Delay(100); while(P1_5==0); Delay(100); keynumber=11;}
	if(P1_4==0)  {Delay(100); while(P1_4==0); Delay(100); keynumber=15;}
	
	P1=0xFF;   //initialize:1111 1111
	P1_0=0;   
	if(P1_7==0)  {Delay(10000); while(P1_7==0); Delay(100); keynumber=4;}
	if(P1_6==0)  {Delay(10000); while(P1_6==0); Delay(100); keynumber=8;}
	if(P1_5==0)  {Delay(10000); while(P1_5==0); Delay(100); keynumber=12;}
	if(P1_4==0)  {Delay(10000); while(P1_4==0); Delay(100); keynumber=16;}
	
	return keynumber;	
}

main:

#include
#include"LCD1602.h"
#include"MatrixKey.h"

int number;

void main()
{
	LCD_Init();
	while(1)
	{
		number=MatrixKey();
		if (number!=0)    
		{
			LCD_ShowNum(1,1,number,3);
		}
	}
}

显示结果如下(当前按下S8):
【51单片机】(五)矩阵键盘_第3张图片


三.矩阵键盘小应用——密码锁

学了矩阵键盘的扫描方法,不如来用用看吧~

规定S1~S10分别表示1,2,3,4,5,6,7,8,9,0。
另外,S11为“确认键”,S12为“回退键”(删除上一个输入的数字)。

请看代码:

#include
#include"LCD1602.h"
#include"MatrixKey.h"

int keynumber;
int scanfpassword;
int staticpassword;    
int ws;

void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"Password:");
	ws=1;
	//staticpassword=xxx;   先规定正确的密码
	while(1)
	{
		keynumber=MatrixKey();
		if (keynumber!=0)
		{
			if(ws==16)  break;     //输入的密码超出了LCD1602能显示的范围,清空区域
			
			if (keynumber<=10)
			{
				 LCD_ShowNum(2,ws++,keynumber,1);
				 if (keynumber!=10)  scanfpassword=scanfpassword*10+keynumber;      //看作多位整数,计算输入的密码
					else  scanfpassword=scanfpassword*10;      //输入10,显示0,另作讨论
			}
			else if (keynumber==11)   //S11确认,比较两数
			{
				 if(scanfpassword==staticpassword)   LCD_ShowString(2,1,"Right!");
						else  LCD_ShowString(2,1,"Wrong!");
				 while(1);
			}
			else if (keynumber==12)  //S12回退
			{
			    if(ws>=1) { LCD_ShowString(2,--ws," ");  scanfpassword=scanfpassword/10; }
						else  ws=1;       //当回退到头,ws不能再自减了
			}
		}
	}
}

你可能感兴趣的:(51单片机笔记,c语言,单片机)