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 P2

u8 Int_MatrixKeyboard_CheckKey()
{
    // 将P20 置为 0 ;则P27 - P20分别为1111 1110  0xFE
    KEYIN = 0xFE;
    // SW5 按下 ;则P27 - P20分别为1110 1110  0xEE
    if (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  0xDE
    if (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  0xBE
    if (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  0x7E
    if (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  0xFD
    KEYIN = 0xFD;

    // SW9 按下 ;则P27 - P20分别为1110 1101   0xED
    if (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  0xDD
    if (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  0xBD
    if (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  0x7D
    if (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  0xFB
    KEYIN = 0xFB;
    // SW13 按下 ;则P27 - P20分别为1110 1011  0xEB
    if (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  0xDB
    if (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  0xBB
    if (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  0x7B
    if (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  0xF7
    KEYIN = 0xF7;
    // SW17 按下 ;则P27 - P20分别为1110 0111  0xE7
    if (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  0xD7
    if (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  0xB7
    if (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  0x77
    if (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.mfbz.cn/a/575195.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV 实现霍夫圆变换

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV实现霍夫变换 下一篇:OpenCV 实现重新映射 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 HoughCircles()检测图像中的圆圈。 理论 Hough 圆变换 H…

Mysql 、Redis 数据双写一致性 更新策略与应用

零、important point 1. 缓存双写一致性问题 2. java实现逻辑&#xff08;对于 QPS < 1000 可以使用&#xff09; public class UserService {public static final String CACHE_KEY_USER "user:";Resourceprivate UserMapper userMapper;Resourceprivate Re…

javascript使用setTimeout函数来实现仅执行最后一次操作

在JavaScript中&#xff0c;setTimeout函数用于在指定的毫秒数后执行一个函数或计算表达式。它的主要用途是允许开发者延迟执行某些代码&#xff0c;而不是立即执行。 当我们想要确保仅最后一次更新UI时&#xff0c;我们可以使用setTimeout来合并多次连续的更新请求。具体做法…

C++11 数据结构7 队列的链式存储,实现,测试

前期考虑 队列是两边都有开口&#xff0c;那么在链式情况下&#xff0c;线性表的链式那一边作为对头好呢&#xff1f; 从线性表的核心的插入和删除算法来看&#xff0c;如果在线性表链表的头部插入&#xff0c;每次循环都不会走&#xff0c;但是删除的时候&#xff0c;要删除线…

回归与聚类——K-Means(六)

什么是无监督学习 一家广告平台需要根据相似的人口学特征和购买习惯将美国人口分成不同的小 组&#xff0c;以便广告客户可以通过有关联的广告接触到他们的目标客户。Airbnb 需要将自己的房屋清单分组成不同的社区&#xff0c;以便用户能更轻松地查阅这些清单。一个数据科学团队…

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…

C#实现TFTP客户端

1、文件结构 2、TftpConfig.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace TftpTest {public class TftpConfig{}/// <summary>/// 模式/// </summary>public enum Modes{…

大模型都在用的:旋转位置编码

写在前面 这篇文章提到了绝对位置编码和相对位置编码&#xff0c;但是他们都有局限性&#xff0c;比如绝对位置编码不能直接表征token的相对位置关系&#xff1b;相对位置编码过于复杂&#xff0c;影响效率。于是诞生了一种用绝对位置编码的方式实现相对位置编码的编码方式——…

LS2K1000LA基础教程

基于LS2K1000LA的基础教程 by 南京工业大学 孙冬梅 于 2024.4.25 文章目录 基于LS2K1000LA的基础教程一、目的二、平台1.硬件平台2.软件平台 三、测试0.开发板开机及编译器配置0.1 开发板控制台0.2 虚拟机编译器配置 1. 简单应用编程1.helloworld.c2. fileio 文件操作3.proce…

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

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

入坑 Java

原文&#xff1a;https://blog.iyatt.com/?p11305 前言 今天&#xff08;2023.8.31&#xff09;有个学长问我接不接一个单子&#xff0c;奈何没学过 Java&#xff0c;本来不打算接的。只是报酬感觉还不错&#xff0c;就接了。 要求的完成时间是在10月初&#xff0c;总共有一…

Spring Boost + Elasticsearch 实现检索查询

需求&#xff1a;对“昵称”进行“全文检索查询”&#xff0c;对“账号”进行“精确查询”。 认识 Elasticsearch 1. ES 的倒排索引 正向索引 对 id 进行检索速度很快。对其他字段即使加了索引&#xff0c;只能满足精确查询。模糊查询时&#xff0c;逐条数据扫描&#xff0c…

编译原理实验课

本人没咋学编译原理&#xff0c;能力有限&#xff0c;写的不好轻点喷&#xff0c;大佬路过的话&#xff0c;那你就路过就好 东大编译原理实验课原题&#xff0c;22年 1. 基本题&#xff1a;简单的扫描器设计 【问题描述】 熟悉并实现一个简单的扫描器&#xff0c;设计扫描器…

C++ | Leetcode C++题解之第49题字母异位词分组

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 自定义对 array<int, 26> 类型的哈希函数auto arrayHash [fn hash<int>{}] (const array<int, 26>&…

黑马点评(十二) -- UV统计

一 . UV统计-HyperLogLog 首先我们搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站&#xff0c;只记录1次。 PV&#xff1a;全称Page View&…

linux权限维持(四)

6.inetd服务后门 inetd 是一个监听外部网络请求 ( 就是一个 socket) 的系统守护进程&#xff0c;默认情况下为 13 端口。当 inetd 接收到 一个外部请求后&#xff0c;它会根据这个请求到自己的配置文件中去找到实际处理它的程序&#xff0c;然后再把接收到的 这个socket 交给那…

机器学习 -- 分类问题

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

力扣爆刷第127天之动态规划五连刷(整数拆分、一和零、背包)

力扣爆刷第127天之动态规划五连刷&#xff08;整数拆分、一和零、背包&#xff09; 文章目录 力扣爆刷第127天之动态规划五连刷&#xff08;整数拆分、一和零、背包&#xff09;关于0 1 背包问题的总结01背包遍历顺序&#xff1a;完全背包遍历顺序&#xff1a; 一、343. 整数拆…

Lock-It for Mac(应用程序加密工具)

OSXBytes Lock-It for Mac是一款功能强大的应用程序加密工具&#xff0c;专为Mac用户设计。该软件具有多种功能&#xff0c;旨在保护用户的隐私和数据安全。 Lock-It for Mac v1.3.0激活版下载 首先&#xff0c;Lock-It for Mac能够完全隐藏应用程序&#xff0c;使其不易被他人…

【Pytorch】(十四)C++ 加载TorchScript 模型

文章目录 &#xff08;十四&#xff09;C 加载TorchScript 模型Step 1: 将PyTorch模型转换为TorchScriptStep 2: 将TorchScript序列化为文件Step 3: C程序中加载TorchScript模型Step 4: C程序中运行TorchScript模型 【Pytorch】&#xff08;十三&#xff09;PyTorch模型部署: T…