矩阵键盘(4)

目录

工作原理

案例一

案例二



                 这就是很简单的矩阵键盘,由16个独立按键构成,其原理图与独立按键类似。

工作原理

和数码管的工作原理类似,都是通过扫描进行输出的。

矩阵键盘是通过输入扫描来进行的,有两种方式。

                        ①按列扫描:P17到P14位扫描的I/O口,我们人为地控制其高低点位来选择是哪一列,例如我们给P17地电平0其他的给1,这样我们就选择了第一列,具体应用下面再介绍。

                        ②按行扫面:P13到P10控制第一行到第四行。同样是通过给高低电平来选中是哪一行。例如我们现在给P13低电平0,其他给1,这样我们就选中了第一行。

        按列扫描相较与按行扫描是比较好的,原因在于按行扫描的P15 I/O口与其他的I/O口重合了,有一个驱动电机的 I/O口也是P15,这样就导致在选中P15的同时,我们的驱动电机也运动了。而按列扫描并不会出现这种问题,所以接下来我们的矩阵键盘的扫描方式就是按列扫描,代码也这样写。

案例一

下面来介绍一个案例(现在我们的调试都是在LCD1602显示屏上来调试的)通过按按键,在LCD上显示其对应的按键编号。

上代码

        首先我们来模块化矩阵键盘的驱动程序,模块化的作用是简化主函数。

#include<REGX52.H>
#include "Delay.h"//和之前的独立按键一样,需要消抖所以要调用延时函数。
unsigned char MatrixKey()//定义一个后面main.可以调用的函数,返回值是按键编号数。
{
    unsigned char Keynum=0//定义一个返回值,令其初始值位0.
    
    P1=0xFF;//首先令所有的按键都是高电平
    P1_3=0;//扫描第一列
    if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynum=1;}//如果按下第一个按键,返回值就是1
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynum=5;}//如果按下第一个按键,返回值就是5
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynum=9;}//如果按下第一个按键,返回值就是9
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynum=13;}//如果按下第一个按键,返回值就是13,下面的依次类推

	P1=0xFF;
	P1_2=0;//扫描第二列
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynum=2;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynum=6;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynum=10;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynum=14;}

	P1=0xFF;
	P1_1=0;//扫描第三列
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynum=3;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynum=7;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynum=11;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynum=15;}

	P1=0xFF;
	P1_0=0;//扫描第四列
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynum=4;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynum=8;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynum=12;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynum=16;}

	return Keynum;

}

这就是我们的驱动函数,但是不要忘记声明。

#ifndef __MatrixKey_h__
#define __MatrixKey_h__

unsigned char MatrixKey();

#endif

 下面编写主函数

#include<REGX52.h>
#include"Delay.h"
#include"LCD1602.h"
#include"MatrixKey.h"

unsigned char Keynum;
void main()
{
    LCD_Init();//这是使用必须要写的,否则LCD不可以使用
    LCD_ShowString(1,1,"MatrixKey:");
    while(1)//一直执行这个操作
    {
        Keynum=MatrixKey();//将MatrixKey的返回值给Keynum
        if(Keynum)//翻译就是如果Keynum成立,那么就执行下面的代码。反过来说,只要按键没坏按下,就输出按键号
        {
           LCD_ShowString(1,1,Keynum,2);//打印按键号
        }
    }
}

 这样我们就写好好主函数了。按下按键就可以在LCD屏幕上显示按键编号了。

案例二

        做一个密码锁

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

unsigned char Keynum;
unsigned int Password,count;
void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"Password:");
	while(1)
	{
		Keynum=MatrixKey();
		if(Keynum)
		{
			if(Keynum<=10)
			{
				if(count<4)//如果输入次数小于4
				{
					Password*=10;//密码左移
					Password+=Keynum%10;//获得一位密码
				}
				count++;//计次加一
			}
			LCD_ShowNum(2,1,Password,4);
		}	
		if(Keynum==11)//按下11确定
		{
			if(Password==2345)//如果密码等于2345
			{
				LCD_ShowString(1,14,"OK");//正确显示OK
				Password=0;
				count=0;
				LCD_ShowNum(2,1,Password,4);
			}
			else
			{
				LCD_ShowString(1,14,"ERR");//错误显示ERR
				Password=0;
				count=0;
				LCD_ShowNum(2,1,Password,4);
			}
		}
		if(Keynum==12)//退格
		{
			Password=Password/10;
			count-=count;//避免计数小于0
			LCD_ShowNum(2,1,Password,4);
		}
		if(Keynum==13)//全部清零
		{
			Password=0;
			count=0;
			LCD_ShowNum(2,1,Password,4);
		}
	}
}

感觉小编文章对自己的学习有帮助的就点个赞转发一d下吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值