【51单片机系列】矩阵按键扩展实验
本文对矩阵按键的一个扩展,利用矩阵按键和动态数码管设计一个简易计算器。代码参考:https://blog.csdn.net/weixin_47060099/article/details/106664393
实现功能:使用矩阵按键,实现一个简易计算器,将计算数据及计算结果显示在数码管中。
矩阵按键设计如下图
代码实现:
/*实现功能:使用矩阵按键实现简易计算器[2023-12-07] zoya
*/
#include "reg52.h"typedef unsigned char u8;
typedef unsigned int u16;sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;#define GPIO_DIG P0 // 动态数码管
#define GPIO_KEY P1 // 矩阵按键u16 KeyValue; // 存放读取到的键值
u16 keyflag, i; // 用来判断按下的数字还是运算符或是清空键
u8 code smg[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00}; // 共阴极数码管u16 wei[8] = {0}; // 存放每一位数码管数字的数组// 延时函数,i=1延时10us
void delay(u16 i)
{while(i--);
}// 扫描显示动态数码管
void Display()
{LSA = 0; LSB = 0; LSC = 0; GPIO_DIG = smg[wei[7]]; delay(50); GPIO_DIG = 0x00; // 段选Y0,位选显示,延时,消隐LSA = 1; LSB = 0; LSC = 0; GPIO_DIG = smg[wei[6]]; delay(50); GPIO_DIG = 0x00; // 段选Y0,位选显示,延时,消隐LSA = 0; LSB = 1; LSC = 0; GPIO_DIG = smg[wei[5]]; delay(50); GPIO_DIG = 0x00; // 段选Y0,位选显示,延时,消隐LSA = 1; LSB = 1; LSC = 0; GPIO_DIG = smg[wei[4]]; delay(50); GPIO_DIG = 0x00; // 段选Y0,位选显示,延时,消隐LSA = 0; LSB = 0; LSC = 1; GPIO_DIG = smg[wei[3]]; delay(50); GPIO_DIG = 0x00; // 段选Y0,位选显示,延时,消隐LSA = 1; LSB = 0; LSC = 1; GPIO_DIG = smg[wei[2]]; delay(50); GPIO_DIG = 0x00; // 段选Y0,位选显示,延时,消隐LSA = 0; LSB = 1; LSC = 1; GPIO_DIG = smg[wei[1]]; delay(50); GPIO_DIG = 0x00; // 段选Y0,位选显示,延时,消隐LSA = 1; LSB = 1; LSC = 1; GPIO_DIG = smg[wei[0]]; delay(50); GPIO_DIG = 0x00; // 段选Y0,位选显示,延时,消隐
}// 检测有按键按下并读取键值
void KeyDown()
{u16 a = 0;GPIO_KEY = 0x0f; // 行全部为低电平,列全部为高电平if(0x0f != GPIO_KEY) // 读取按键是否按下{delay(1000); // 延时10ms进行消隐if(0x0f != GPIO_KEY){// 测试列GPIO_KEY = 0x0f;switch(GPIO_KEY) // 行列扫描法{case 0x07: KeyValue = 0; break;case 0x0b: KeyValue = 1; break;case 0x0d: KeyValue = 2; break;case 0x0e: KeyValue = 3; break;}// 测试行GPIO_KEY = 0xf0;switch(GPIO_KEY) // 行列扫描法{case 0x70: KeyValue = KeyValue; break;case 0xb0: KeyValue = KeyValue + 4; break;case 0xd0: KeyValue = KeyValue + 8; break;case 0xe0: KeyValue = KeyValue + 12; break;}if(KeyValue==0 || KeyValue==1 || KeyValue==2 || KeyValue==3 || KeyValue==4 || KeyValue==5|| KeyValue==6 || KeyValue==7 || KeyValue==8 || KeyValue==9){keyflag=1;}}while( (a < 50) && (GPIO_KEY != 0xf0) ) // 按键松手检测{delay(1000);a++;}}
}void main()
{u16 a=0, b=0, c=0;while(1){Display(); KeyDown(); // 键入第一个数字if(1 == keyflag){for(i=7;i>0;i--){wei[i] = wei[i-1]; // 键入一位数字向左移动一位}wei[0] = KeyValue;keyflag = 0;}else if(14 == KeyValue) // 清空显示{for(i=0;i<8;i++){wei[i] = 0;}Display();}else if(10 == KeyValue) // 加法运算{a = wei[0] + wei[1]*10 + wei[2]*100 + wei[3]*1000 +wei[4]*10000 + wei[5]*100000 + wei[6]*1000000 + wei[7]*10000000;for(i=0; i<8; i++){wei[i] = 0;}// 输入第二个数while(1){Display();KeyDown(); // 输入第二个数if(15 == KeyValue)break; // 当识别到等号时,停止输入if(1 == keyflag){for(i=7; i>0; i--){wei[i] = wei[i-1];}wei[0] = KeyValue;keyflag = 0;}}b = wei[0] + wei[1]*10 + wei[2]*100 + wei[3]*1000 +wei[4]*10000 + wei[5]*100000 + wei[6]*1000000 + wei[7]*10000000;c = a + b;wei[0] = c%10; // 计算C的各个位的数字wei[1] = c/10%10;wei[2] = c/100%10;wei[3] = c/1000%10;wei[4] = c/10000%10;wei[5] = c/100000%10;wei[6] = c/1000000%10;wei[7] = c/10000000%10;Display();}else if(11 == KeyValue) // 减法运算{a = wei[0] + wei[1]*10 + wei[2]*100 + wei[3]*1000 +wei[4]*10000 + wei[5]*100000 + wei[6]*1000000 + wei[7]*10000000;for(i=0; i<8; i++) // 清空数码管{wei[i] = 0;}// 输入第二个数while(1){Display();KeyDown(); // 输入第二个数if(15 == KeyValue)break; // 当识别到等号时,停止输入if(1 == keyflag){for(i=7; i>0; i--){wei[i] = wei[i-1];}wei[0] = KeyValue;keyflag = 0;}}b = wei[0] + wei[1]*10 + wei[2]*100 + wei[3]*1000 +wei[4]*10000 + wei[5]*100000 + wei[6]*1000000 + wei[7]*10000000;if(a > b){c = a - b;wei[0] = c%10; // 计算C的各个位的数字wei[1] = c/10%10;wei[2] = c/100%10;wei[3] = c/1000%10;wei[4] = c/10000%10;wei[5] = c/100000%10;wei[6] = c/1000000%10;wei[7] = c/10000000%10;}else if(a < b){u16 e = 0;c = b-a;wei[0] = c%10;wei[1] = c/10%10;if(wei[1] == 0){wei[1] = 16;e=1;}wei[2] = c/100%10;if(wei[2]==0 && e==0){wei[2] = 16;e=1;}wei[3] = c/1000%10;if(wei[3]==0 && e==0){wei[3] = 16;e=1;}wei[4] = c/10000%10;if(wei[4]==0 && e==0){wei[4] = 16;e=1;}wei[5] = c/100000%10;if(wei[5]==0 && e==0){wei[5] = 16;e=1;}wei[6] = c/1000000%10;if(wei[6]==0 && e==0){wei[6] = 16;e=1;}wei[7] = c/10000000%10;if(wei[7]==0 && e==0){wei[7] = 16;e=1;}}Display();}else if(12 == KeyValue) // 乘法运算{a = wei[0] + wei[1]*10 + wei[2]*100 + wei[3]*1000 +wei[4]*10000 + wei[5]*100000 + wei[6]*1000000 + wei[7]*10000000;for(i=0; i<8; i++){wei[i] = 0;}// 输入第二个数while(1){Display();KeyDown(); // 输入第二个数if(15 == KeyValue)break; // 当识别到等号时,停止输入if(1 == keyflag){for(i=7; i>0; i--){wei[i] = wei[i-1];}wei[0] = KeyValue;keyflag = 0;}}b = wei[0] + wei[1]*10 + wei[2]*100 + wei[3]*1000 +wei[4]*10000 + wei[5]*100000 + wei[6]*1000000 + wei[7]*10000000;c = a * b;wei[0] = c%10; // 计算C的各个位的数字wei[1] = c/10%10;wei[2] = c/100%10;wei[3] = c/1000%10;wei[4] = c/10000%10;wei[5] = c/100000%10;wei[6] = c/1000000%10;wei[7] = c/10000000%10;Display();}else if(13 == KeyValue) // 除法运算{a = wei[0] + wei[1]*10 + wei[2]*100 + wei[3]*1000 +wei[4]*10000 + wei[5]*100000 + wei[6]*1000000 + wei[7]*10000000;for(i=0; i<8; i++){wei[i] = 0;}// 输入第二个数while(1){Display();KeyDown(); // 输入第二个数if(15 == KeyValue)break; // 当识别到等号时,停止输入if(1 == keyflag){for(i=7; i>0; i--){wei[i] = wei[i-1];}wei[0] = KeyValue;keyflag = 0;}}b = wei[0] + wei[1]*10 + wei[2]*100 + wei[3]*1000 +wei[4]*10000 + wei[5]*100000 + wei[6]*1000000 + wei[7]*10000000;if(0 != b){c = a / b;wei[0] = c%10; // 计算C的各个位的数字wei[1] = c/10%10;wei[2] = c/100%10;wei[3] = c/1000%10;wei[4] = c/10000%10;wei[5] = c/100000%10;wei[6] = c/1000000%10;wei[7] = c/10000000%10;Display();}}}
}
仿真结果:
相关文章:

【51单片机系列】矩阵按键扩展实验
本文对矩阵按键的一个扩展,利用矩阵按键和动态数码管设计一个简易计算器。代码参考:https://blog.csdn.net/weixin_47060099/article/details/106664393 实现功能:使用矩阵按键,实现一个简易计算器,将计算数据及计算结…...

大数据云计算——Docker环境下部署Hadoop集群及运行集群案列
大数据云计算——Docker环境下部署Hadoop集群及运行集群案列 本文着重介绍了在Docker环境下部署Hadoop集群以及实际案例中的集群运行。首先,文章详细解释了Hadoop的基本概念和其在大数据处理中的重要性,以及为何选择在Docker环境下部署Hadoop集群。接着&…...
计算机网络链路层(期末、考研)
计算机网络总复习链接🔗 目录 组帧差错控制检错编码纠错编码 流量控制与可靠传输机制流量控制、可靠传输与滑动窗口机制单帧窗口与停止-等待协议多帧滑动窗口与后退N帧协议(GBN)多帧滑动窗口与选择重传协议 介质访问控制信道划分介质访问控制…...

洛谷 P8794 [蓝桥杯 2022 国 A] 环境治理
文章目录 [蓝桥杯 2022 国 A] 环境治理题目链接题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路解析CODE给点思考 [蓝桥杯 2022 国 A] 环境治理 题目链接 https://www.luogu.com.cn/problem/P8794 题目描述 LQ 国拥有 n n n 个城市,从 0 0 …...
力扣面试150题 | 买卖股票的最佳时期
力扣面试150题 | 买卖股票的最佳时期 题目描述解题思路代码实现 题目描述 121.买卖股票的最佳时期 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一…...

uniapp 之 图片 视频 文件上传
<view class"" style"padding: 24rpx 0"><text>相关资料 <text class"fs-26 color-666">(图片、视频、文档不超过9个)</text> </text><view class"flex align-center" style&…...

MIT线性代数笔记-第28讲-正定矩阵,最小值
目录 28.正定矩阵,最小值打赏 28.正定矩阵,最小值 由第 26 26 26讲的末尾可知在矩阵为实对称矩阵时,正定矩阵有以下四种判定方法(都是充要条件): 所有特征值都为正左上角所有 k k k阶子矩阵行列式都为正&…...

Python:五种算法RFO、GWO、DBO、HHO、SSA求解23个测试函数
一、五种算法介绍 (1)红狐优化算法(Red fox optimization,RFO) (2)灰狼优化算法(Grey Wolf Optimizer,GWO) (3)蜣螂优化算法(Dung beetle opti…...
如何参与开源项目
大家好,受卡哥邀请,和大家分享一下开源活动的相关经验。首先简要自我介绍一下,我目前在一所985研二在读,主要学习大数据方向,从去年开始参与开源活动近一年时间,也对多个Apache框架有所贡献。 由于学校或专…...

twitter开发如何避坑
此篇介绍在twitter开发过程中遇到的坑(尤其是费用的坑)。 一坑:免费接口少! 刚开始申请免费API使用的时候,twitter官方只会给你三个免费接口使用。 发twitter、删推文、查看用户信息。 这三个接口远远不够开发中使用…...

人工智能算法合集
人工智能(Artificial Intelligence,AI)作为当今世界最热门的技术领域之一,正日益改变着我们的生活方式、工作方式甚至整个社会结构。在人工智能领域中,算法是至关重要的一环,它们是实现人工智能技术应用的核…...

PythonStudio:一款国人写的python及窗口开发编辑IDE,可以替代pyqt designer等设计器了
本款软件只有十几兆,功能算是强大的,国人写的,很不错的python界面IDE.顶部有下载链接。下面有网盘下载链接,或者从官网直接下载。 目前产品免费,以后估计会有收费版本。主页链接:PythonStudio-硅量实验室 作…...

大模型应用_FastGPT
1 功能 整体功能,想解决什么问题 官方说明:FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!个人体会…...

elasticsearch|大数据|elasticsearch的api部分实战操作以及用户和密码的管理
一, 前言 本文主要内容是通过elasticsearch的api来进行一些集群的管理和信息查询工作,以及elasticsearch用户的增删改查和密码的重设以及重置如何操作 接上文:elasticsearch|大数据|elasticsearch低版本集群的部署安装和安全增强---密码设…...

Android多进程和跨进程通讯方式
前言 我们经常开发过程中经常会听到线程和进程,在讲述Android进程多进程前我打算先简单梳理一下这俩者。 了解什么是进程与线程 进程: 系统中正在运行的一个应用程序,某个程序一旦运行就是一个进程,是资源分配的最小单位&#…...
通过Jenkins将应用发布到K8s1.24.3
一、准备基础环境 cat >> /etc/hosts <<EOF 192.168.180.210 k8s-master 192.168.180.200 k8s-node1 192.168.180.190 k8s-node2 192.168.180.180 gitlab 192.168.180.170 jenkins 192.168.180.160 harbor EOF 配置主机名 hostnamectl set-hostname k8s-master &am…...
正则表达式入门与实践
文章目录 一、为什么要有正则二、正则表达式基础概念三、Pattern与Matcher类的使用(一)Pattern类的常用方法(二)Matcher类的常用方法四、常用正则规则及其含义(一)规范表示(二)数量表示(三)逻辑运算符五、String对正则表达式的支持六、实践演练(一)匹配给定文本中的…...

C++初阶(十六)优先级队列
📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、priority_queue的介绍和使用1、priority_queue的介绍2、priority_queue的使用 二、priori…...

深入探索C语言中的二叉树:数据结构之旅
引言 在计算机科学领域,数据结构是基础中的基础。在众多数据结构中,二叉树因其在各种操作中的高效性而脱颖而出。二叉树是一种特殊的树形结构,每个节点最多有两个子节点:左子节点和右子节点。这种结构使得搜索、插入、删除等操作…...
如何发现服务器被入侵了,服务器被入侵了该如何处理?
作为现代社会的重要基础设施之一,服务器的安全性备受关注。服务器被侵入可能导致严重的数据泄露、系统瘫痪等问题,因此及时排查服务器是否被侵入,成为了保障信息安全的重要环节。小德将给大家介绍服务器是否被侵入的排查方案,并采…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...

相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...