目录
1.硬件设计
2.软件设计
2.1.矩阵键盘扫描
2.2.矩阵键盘-密码锁
3.知识点
3.1.模块化编程的应用
3.2.#include详解
1.硬件设计
矩阵键盘按键数量较多,为了减少I/O口的占用,通常将按键排列成矩阵形式,采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态
扫描原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果
2.软件设计
2.1.矩阵键盘扫描
功能需求:矩阵键盘扫描,LCD1602显示键码
程序设计:首先,确定扫描方式,此处选用逐列扫描;其次,确定驱动方式,单片机的IO口的模式是一种弱上拉模式(输出0时,驱动能力较强);
MatrixKey.c文件
#include <REGX52.H>
#include"Delay.h"
//*逐列扫描
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
P1=0xFF;//P1口全部置高电平
P1_3=0;//P1_3低电平
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}//如果P1_7也置低电平,按键1导通
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}//如果P1_6也置低电平,按键5导通
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}//如果P1_5也置低电平,按键9导通
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}//如果P1_4也置低电平,按键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_0=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;
}
MatrixKey.h文件
#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__
unsigned char MatrixKey();
#endif
main.c文件
#include <REGX52.H>
#include"LCD1602.h"//引用LCD1602头文件
#include"MatrixKey.h"//引用MatrixKey头文件
unsigned char KeyNum;//定义一个字符KeyNum,其实就是我们想要的键码
void main()
{
LCD_Init();
LCD_ShowString(1,1,"MatrixKey:");//第1行,第1列,显示字符串"MatrixKey:"
while(1)
{
KeyNum=MatrixKey();//将KeyNum等于我们已经定义好的矩阵键盘程序
if(KeyNum)//如果有按键按下
{
LCD_ShowNum(2,1,KeyNum,2);//在第2行,第1列,显示对应的按键码
}
}
}
2.2.矩阵键盘-密码锁
功能需求:用矩阵键盘,做一个简易密码锁
程序设计:首先,确认所需按键,需要用到的按键1~10(密码区),11确认键,12清除键;那如何程序如何设计呢?
main.c文件
#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:");//定义字符创“Password:”
while(1)
{
KeyNum=MatrixKey();
if(KeyNum)//如果按键按下
{
if(KeyNum<=10)//密码区:如果S1-S10按键按下,输入密码
{
if(Count<4)//密码位:定义为4位密码(int整型的数值范围0-65535;如果定义6为密码会超出int范围)
{
Password*=10;//密码每输入一位,密码左移一位
Password+=KeyNum%10;//取与的目的,主要是要将S10按键定义为数字0
Count++;//没输入一次密码,计次+1
}
}
LCD_ShowNum(2,1,Password,4);//更新显示
if(KeyNum==11)//如果按下按键S11
{
if(Password==1229)//如果密码是1299
{
LCD_ShowString(1,10,"OK ");//那LCD的第1行,第10列显示OK
Password=0;//密码清零
Count=0;//计次清零
LCD_ShowNum(2,1,Password,4);//更新显示
}
else
{
LCD_ShowString(1,10,"ERR");//否则显示ERR
Password=0;
Count=0;
LCD_ShowNum(2,1,Password,4);
}
}
if(KeyNum==12)//如果按下按键S12
{
Password=0;//密码清零
Count=0;//计次清零
LCD_ShowNum(2,1,Password,4);更新显示
}
}
}
}
3.知识点
3.1.模块化编程的应用
- 在密码锁的代码中,主要用到的模块函数有<REGX52.H>,"LCD1602.h","MatrixKey.h";
- 模块化编程的主要优势是,模块管理,逻辑清晰,可移植等
#include <REGX52.H>
#include"LCD1602.h"
#include"MatrixKey.h"
3.2.#include详解
- 作用:叫做文件包含命令,用来引入对应的头文件(.h文件);#include 也是C语言预处理命令的一种。
- 处理过程:就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源文件,这与复制粘贴的效果相同。
- 用法:主要有两种,如下:
#include <REGX52.H>//查找<系统目录>,引用系统自带的程序文件
#include"LCD1602.h"//查找"当前工作目录",应用自己编辑好的程序文件
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)