单片机的学习(7) 您所在的位置:网站首页 矩阵按键密码锁 单片机的学习(7)

单片机的学习(7)

2024-07-08 15:54| 来源: 网络整理| 查看: 265

矩阵键盘 6.1矩阵键盘1.矩阵键盘2.扫描的概念3.程序 6.2矩阵键盘密码锁1.程序

6.1矩阵键盘 1.矩阵键盘

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 。采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态 在这里插入图片描述

2.扫描的概念

数码管扫描(输出扫描) 原理:显示第一位->显示第二位->显示第三位… ,然后快速循环这个过程,最终实现所有数码管同时显示的效果。 矩阵键盘扫描(输入扫描) 原理:读取第一行(列)->读取第二行(列)->读取第三行(列)…,然后快速循环这个过程,最终实现所有按键同时检测的效果 以上两种扫描方式的共性:节省I/O口

3.程序

(1)MatrixKey.c设置矩阵键盘对应1~16数字

#include #include "Delay.h" /** * @brief 矩阵键盘读取按键键码 * @param 无 * @retval KeyNumber 按下按键的键码值 如果按键按下不放,程序会停留在此函数,松手的那一瞬间,返回按键键码,没有 按键按下时,返回0 */ 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_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; }

(2)在main函数中调用MatrixKey()函数

#include #include "Delay.h" #include "LCD1602.h" #include "MatriKey.h" unsigned char KeyNum; void main() { LCD_Init(); LCD_ShowString(1,1,"MatrixKey"); while(1) { KeyNum=MatrixKey(); if(KeyNum) { LCD_ShowNum(2,1,KeyNum,2); } } }

(3)工程目录 在这里插入图片描述

6.2矩阵键盘密码锁 1.程序

在6.1的基础上,修改main函数,实现密码锁的功能

#include #include "Delay.h" #include "LCD1602.h" #include "MatriKey.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 Password*=10;//密码左移一位 Password+=KeyNum%10;//获取密码 Count++;//计次加一 } LCD_ShowNum(2,1,Password,4);//更新显示 } if(KeyNum==11)//如果S11按键按下,确认 { if(Password==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)//如果S12按键按下,取消 { Password=0;//密码清零 Count=0;//计次清零 LCD_ShowNum(2,1,Password,4);//更新显示 } } } }

虽然听老师讲课的时候觉得思路清晰,但是自己写代码的时候总是错漏百出,还是得多练。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有