day04 51单片机-矩阵按键

1 矩阵按键

1.1 需求描述

本案例实现以下功能:按下矩阵按键SW5到SW20,数码管会显示对应的按键编号。

1.2 硬件设计

1.2.1 硬件原理图

在这里插入图片描述

1.2.2 矩阵按键原理

在这里插入图片描述

1.3软件设计

1)Int_MatrixKeyboard.h

在项目的Int目录下创建Int_MatrixKeyboard.h,写入以下内容。

#ifndef __INT_MATRIXKEYBOARD_H__
#define __INT_MATRIXKEYBOARD_H__
#include "Util.h"/**
?* @brief 查看是否有矩阵按键被按下
?*
?* @return u8 返回被按下的按键编号,没有按键被按下返回0
?*/
u8 Int_MatrixKeyboard_CheckKey();#endif

2)Int_MatrixKeyboard.c

在项目的Int目录下创建Int_MatrixKeyboard.c,写入以下内容。

#include "Int_MatrixKeyboard.h"
#include <STC89C5xRC.H>#define KEYIN P2u8 Int_MatrixKeyboard_CheckKey()
{// 将P20 置为 0 ;则P27 - P20分别为1111 1110  0xFEKEYIN = 0xFE;// SW5 按下 ;则P27 - P20分别为1110 1110  0xEEif (KEYIN == 0xEE) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0xEE) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xFE) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xFE) {return 5;}}}}}// SW6 按下 ;则P27 - P20分别为1101 1110  0xDEif (KEYIN == 0xDE) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0xDE) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xFE) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xFE) {return 6;}}}}}// SW7 按下 ;则P27 - P20分别为1011 1110  0xBEif (KEYIN == 0xBE) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0xBE) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xFE) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xFE) {return 7;}}}}}// SW8 按下 ;则P27 - P20分别为0111 1110  0x7Eif (KEYIN == 0x7E) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0x7E) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xFE) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xFE) {return 8;}}}}}// 将P21 置为 0 ;则P27 - P20分别为1111 1101  0xFDKEYIN = 0xFD;// SW9 按下 ;则P27 - P20分别为1110 1101   0xEDif (KEYIN == 0xED) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0xED) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xFD) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xFD) {return 9;}}}}}// SW10 按下 ;则P27 - P20分别为1101 1101  0xDDif (KEYIN == 0xDD) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0xDD) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xFD) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xFD) {return 10;}}}}}// SW11 按下 ;则P27 - P20分别为1011 1101  0xBDif (KEYIN == 0xBD) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0xBD) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xFD) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xFD) {return 11;}}}}}// SW12 按下 ;则P27 - P20分别为0111 1101  0x7Dif (KEYIN == 0x7D) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0x7D) {// SW12 已经被按下等待抬起while (1) {if (KEYIN == 0xFD) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xFD) {return 12;}}}}}// 将P22 置为 0 ;则P27 - P20分别为1111 1011  0xFBKEYIN = 0xFB;// SW13 按下 ;则P27 - P20分别为1110 1011  0xEBif (KEYIN == 0xEB) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0xEB) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xFB) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xFB) {return 13;}}}}}// SW14 按下 ;则P27 - P20分别为1101 1011  0xDBif (KEYIN == 0xDB) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0xDB) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xFB) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xFB) {return 14;}}}}}// SW15 按下 ;则P27 - P20分别为1011 1011  0xBBif (KEYIN == 0xBB) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0xBB) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xFB) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xFB) {return 15;}}}}}// SW16 按下 ;则P27 - P20分别为0111 1011  0x7Bif (KEYIN == 0x7B) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0x7B) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xFB) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xFB) {return 16;}}}}}// 将P23 置为 0 ;则P27 - P20分别为1111 0111  0xF7KEYIN = 0xF7;// SW17 按下 ;则P27 - P20分别为1110 0111  0xE7if (KEYIN == 0xE7) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0xE7) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xF7) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xF7) {return 17;}}}}}// SW18 按下 ;则P27 - P20分别为1101 0111  0xD7if (KEYIN == 0xD7) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0xD7) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xF7) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xF7) {return 18;}}}}}// SW19 按下 ;则P27 - P20分别为1011 0111  0xB7if (KEYIN == 0xB7) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0xB7) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xF7) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xF7) {return 19;}}}}}// SW20 按下 ;则P27 - P20分别为0111 0111  0x77if (KEYIN == 0x77) {// 消前抖Com_Util_Delay1ms(10);if (KEYIN == 0x77) {// SW5 已经被按下等待抬起while (1) {if (KEYIN == 0xF7) {// 消后抖Com_Util_Delay1ms(10);if (KEYIN == 0xF7) {return 20;}}}}}return 0;
}

3)main.c

#include <STC89C5XRC.H>
#include "Int_DigitalTube.h"
#include "Int_MatrixKeyboard.h"void main()
{u8 key_pressed;Int_DigitalTube_DisplayNum(0);while (1) {key_pressed = Int_MatrixKeyboard_CheckKey();if(key_pressed) {Int_DigitalTube_DisplayNum(key_pressed);}Int_DigitalTube_Refresh();}
}

5XRC.H>
#include “Int_DigitalTube.h”
#include “Int_MatrixKeyboard.h”

void main()
{
u8 key_pressed;
Int_DigitalTube_DisplayNum(0);
while (1) {
key_pressed = Int_MatrixKeyboard_CheckKey();
if(key_pressed) {
Int_DigitalTube_DisplayNum(key_pressed);
}
Int_DigitalTube_Refresh();
}
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Acer宏碁掠夺者战斧300笔记本电脑PH315-52工厂模式原装Win10系统安装包 恢复出厂开箱状态 带恢复重置

宏碁掠夺者PH315-52原厂Windows10工厂包镜像下载&#xff0c;预装oem系统 链接&#xff1a;https://pan.baidu.com/s/1grmJzz6nW1GOaImY_ymXGw?pwdi286 提取码&#xff1a;i286 原厂W10系统自带所有驱动、PredatorSense风扇键盘控制中心、Office办公软件、出厂主题壁纸、系统…

C语言简易类json格式解析

在使用MQTT时&#xff0c;获取的数据基本上都是json格式的&#xff0c;虽然C语言也可以添加第三方的解析库&#xff0c;但有些资源少的单片机用着还是挺吃力的&#xff0c;所以自己简单写了一个从json格式中获取数据的&#xff0c;说白了就是一个字符串查找。就比如下面这一段 …

Scrapy 爬虫教程:从原理到实战

Scrapy 爬虫教程&#xff1a;从原理到实战 一、Scrapy框架简介 Scrapy是一个由Python开发的高效网络爬虫框架&#xff0c;用于从网站上抓取数据并提取结构化信息。它采用异步IO处理请求&#xff0c;能够同时发送多个请求&#xff0c;极大地提高了爬虫效率。 二、Scrapy运行原…

如何使用PHP进行JSON编码和解码?

如何使用PHP进行JSON编码和解码&#xff1f; 使用PHP进行JSON编码和解码是开发过程中非常常见的任务。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它使得人们能够很容易地阅读和编写&#xff0c;同时也使得机器能够解析和…

阐述 Git 命令 reset 和 revert

1 概述 由于某次或某几次提交的代码污染了远程分支&#xff0c;需要对远程分支代码进行恢复操作&#xff0c;此时可以通过 git 的 reset 和 revert 命令进行恢复。 HEAD 是指向当前分支的最新提交的指针 &#xff0c;每一次提交代码都会产生一个 commit id 来标识工作区的变更…

Elasticsearch单机部署(Linux)

1. 准备环境 本文中Elasticsearch版本为7.12.0&#xff0c;JDK版本为1.8.0&#xff0c;Linux环境部署。 扩展&#xff1a; &#xff08;1&#xff09;查看Elasticsearch对应的常用的jdk版本如下&#xff1a;&#xff08;详情可看官网的支持一览表&#xff09; Elasticsearch a…

贪吃蛇项目实践!(下)

NextIsFood 比较蛇指向的节点和食物指向的节点是否相同 //pSnakeNode psn 是下⼀个节点的地址 //pSnake ps 维护蛇的指针 int NextIsFood(pSnakeNode psn, pSnake ps) {return (psn->x ps->_pFood->x) && (psn->y ps->_pFood->y); }EatFood //…

机器学习 -- 分类问题

场景 探讨了一个回归任务——预测住房价格&#xff0c;用到了线性回归、决策树以及随机森林等各种算法。本次中我们将把注意力转向分类系统。我们曾经对MNIST进行了分类任务&#xff0c;这次我们重新回到这里&#xff0c;细致的再来一次。 开始 获取数据 Scikit-Learn提供了…

ELK 日志分析系统(二)

一、ELK Kibana 部署 1.1 安装Kibana软件包 #上传软件包 kibana-5.5.1-x86_64.rpm 到/opt目录 cd /opt rpm -ivh kibana-5.5.1-x86_64.rpm 1.2 设置 Kibana 的主配置文件 vim /etc/kibana/kibana.yml --2--取消注释&#xff0c;Kiabana 服务的默认监听端口为5601 server.po…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

nodejs连接oracle批量更新数据测试

条件&#xff1a;oracle数据库,数据表20w。所有测试都在本机执行&#xff0c;保持相同的网络带宽。因为机器性能和更新速度问题&#xff0c;这里只测试更新1w数据。 方式1&#xff1a;nodejs代码程序块更新 const sql "declare i number: 0;begin" " while i …

为什么分类问题不能使用mse损失函数,更容易理解版本

分类问题通常不适合使用均方误差&#xff08;Mean Squared Error&#xff0c;MSE&#xff09;损失函数&#xff0c;原因如下&#xff1a; 1.输出差异&#xff1a; 输出差异的度量不同&#xff1a;MSE损失函数是基于预测值和真实值之间的差异的平方和进行计算的&#xff0c;适…

一分钟教你学浪视频怎么存到网盘里面#小浪助手

只需要将学浪视频下载下来,然后利用网盘的上传功能,就能将学浪视频存到网盘里面 那么怎么下载学浪视频呢?其实这里可以借助一个工具:小浪助手 小浪助手我已经打包好了,有需要的自己取一下 学浪下载器链接&#xff1a;https://pan.baidu.com/s/1nyjXc88BWbF8jnfQWUGLZQ?pwd…

Python爱心代码

爱心效果图&#xff1a; 完整代码&#xff1a; import random from math import sin, cos, pi, log from tkinter import *# 定义画布尺寸和颜色 CANVAS_WIDTH 640 CANVAS_HEIGHT 480 CANVAS_CENTER_X CANVAS_WIDTH / 2 CANVAS_CENTER_Y CANVAS_HEIGHT / 2 IMAGE_ENLARG…

Pandabuy代采模式独立站打造攻略,轻松开启全球电商新篇章!

Pandabuy是一个知名的代采平台&#xff0c;老外想要购买1688的物美价廉的商品&#xff0c;但是受限于物流和支付&#xff0c;老外没有大陆支付宝&#xff0c;另外1688不支持海外物流。作为跨境出口的代采平台&#xff0c;pandabuy解决了这个问题 通过对接1688的搜索api&#xf…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 4月26日,星期五

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年4月26日 星期五 农历三月十八 1、 神舟十八号载人飞船发射取得圆满成功&#xff0c;3名航天员与神舟十七号乘组实现“太空会师”。 2、 工信部征求意见&#xff1a;电动自行车拟禁用车载充电器。 3、 两部门&#xff1a;调…

暖阳脚本——写脚本注意事项!

1&#xff0c;要看他是不是全职技术 2&#xff0c;做多长时间&#xff0c;有没有项目经验 3&#xff0c;售后服务有没有保证 4&#xff0c;支不支持三方或面签 以上都满足&#xff0c;这个作者基本没什么问题

详解Qt中实现树状结构图

在Qt中&#xff0c;实现树状结构图通常采用QTreeWidget或QTreeView组件。这两个组件都允许我们创建具有层次结构的列表&#xff0c;但它们之间存在一些差异。QTreeWidget提供了更简单的API&#xff0c;适用于轻量级、快速开发的需求&#xff1b;而QTreeView则更为灵活和可定制&…

BERT(Bidirectional Encoder Representations from Transformers)

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;在深度学习中指的是一种基于Transformer架构的预训练模型&#xff0c;特别用于自然语言处理&#xff08;NLP&#xff09;任务。BERT是由Google的研究团队在2018年提出的&#xff0c;并且迅…

el-select 通过输入框筛选内容之后,清空输入框的值

问题描述&#xff1a; select组件的远程搜索需求&#xff0c;通过 input 输入框进行筛选&#xff0c;当选择确认之后在选中的内容之后还有输入的文案&#xff0c;这时需要手动去清除。 解决方案&#xff1a; 我们可以通过 ref 来获取 dom&#xff0c;其中 dom 的 query 字段…