目录
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"//查找"当前工作目录",应用自己编辑好的程序文件
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38856.html