当前位置: 首页 > article >正文

51单片机 05 矩阵键盘

嘻嘻,LCD在RC板子上可以勉强装上,会有一点歪。

一、矩阵键盘

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式;采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。(IO口默认高电平1)

代码在文件夹中。我改了LCD代码的延时问题。

MatrixKey.c代码

#include <STC89C5xRC.H>
#include "Delay.h"

unsigned char MatrixKey()
{
	// 按列扫描
	unsigned char KeyNumber=0;
	P1=0xFF;
	P13=0x00;
	if(P17==0) {Delay(20);while(P17==0);Delay(20);KeyNumber=1;}
	if(P16==0) {Delay(20);while(P16==0);Delay(20);KeyNumber=5;}
	if(P15==0) {Delay(20);while(P15==0);Delay(20);KeyNumber=9;}
	if(P14==0) {Delay(20);while(P14==0);Delay(20);KeyNumber=13;}
	
	P1=0xFF;
	P12=0x00;
	if(P17==0) {Delay(20);while(P17==0);Delay(20);KeyNumber=2;}
	if(P16==0) {Delay(20);while(P16==0);Delay(20);KeyNumber=6;}
	if(P15==0) {Delay(20);while(P15==0);Delay(20);KeyNumber=10;}
	if(P14==0) {Delay(20);while(P14==0);Delay(20);KeyNumber=14;}
	
	P1=0xFF;
	P11=0x00;
	if(P17==0) {Delay(20);while(P17==0);Delay(20);KeyNumber=3;}
	if(P16==0) {Delay(20);while(P16==0);Delay(20);KeyNumber=7;}
	if(P15==0) {Delay(20);while(P15==0);Delay(20);KeyNumber=11;}
	if(P14==0) {Delay(20);while(P14==0);Delay(20);KeyNumber=15;}
	
	P1=0xFF;
	P10=0x00;
	if(P17==0) {Delay(20);while(P17==0);Delay(20);KeyNumber=4;}
	if(P16==0) {Delay(20);while(P16==0);Delay(20);KeyNumber=8;}
	if(P15==0) {Delay(20);while(P15==0);Delay(20);KeyNumber=12;}
	if(P14==0) {Delay(20);while(P14==0);Delay(20);KeyNumber=16;}
	
	return KeyNumber;
}

main.c代码

#include <STC89C5xRC.H>
#include "Delay.h"
#include "LCD1602.h"

unsigned char KeyNum;

void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"HelloRain");
    while(1)
	{
		KeyNum=MatrixKey();
		if(KeyNum) LCD_ShowNum(2,1,KeyNum,2);
	}
}

二、矩阵键盘密码锁

main.c

#include <STC89C5xRC.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) //s1-s10按下,输入密码 
			{
				if(count<4)
				{
					password*=10; //密码左移
					password+=KeyNum%10; 
					count++;
					LCD_ShowNum(2,1,password,4);
				}
				
			}
			else if(KeyNum==11) 
			{
				if(password==2345)
				{
					LCD_ShowString(1,14,"OK ");
					password=0;
					count=0;
					LCD_ShowNum(2,1,password,4);
				}
				else 
				{
					LCD_ShowString(1,14,"ERR");
					password=0;
					count=0;
					LCD_ShowNum(2,1,password,4);
				}
			}
			else if(KeyNum==12)
			{
				password=0;
				count=0;
				LCD_ShowNum(2,1,password,4);
			}
		}
	
	}
}


http://www.kler.cn/a/530892.html

相关文章:

  • Docker 系列之 docker-compose 容器编排详解
  • C语言教学第四课:控制结构
  • LabVIEW在电机自动化生产线中的实时数据采集与生产过程监控
  • Android --- handler详解
  • 在ubuntu下一键安装 Open WebUI
  • Python 中最大堆和最小堆的构建与应用:以寻找第 k 大元素为例
  • 阿里云盘PC端打不开解决办法
  • [paddle] 矩阵相关的指标
  • Day 27 卡玛笔记
  • 如何在Arduino上使用NodeMCU
  • 基于Kamailio的VoIP管理系统方案(技术栈:MySQL + Redis + Gin + Vue.js
  • 计算机网络网络层进阶:NAT、ARP 与 IP 系列技术全析!!!
  • 业务系统文件上传和互传如何做到高效又安全?
  • 【蓝桥杯】43698.最大比例
  • PageForge v2025.1.2 正式发布:打造现代化的静态站点生成工具
  • HENU~国商计科概率论复习
  • 在Linux环境下修改Anaconda的默认虚拟环境安装位置
  • Deepseek:网页版OR本地部署版本?
  • 【Linux】进程间通信(管道:匿名管道、命名管道、实战练习)
  • IDA Pro的基础指南
  • MiniQMT与xtquant:量化交易的利器
  • Leetcode—81. 搜索旋转排序数组 II【中等】
  • web前端14--flex
  • 线程互斥同步
  • Axure PR 9 动效 设计交互
  • 软考论文万能模板