【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语言中的二叉树:数据结构之旅
引言 在计算机科学领域,数据结构是基础中的基础。在众多数据结构中,二叉树因其在各种操作中的高效性而脱颖而出。二叉树是一种特殊的树形结构,每个节点最多有两个子节点:左子节点和右子节点。这种结构使得搜索、插入、删除等操作…...
如何发现服务器被入侵了,服务器被入侵了该如何处理?
作为现代社会的重要基础设施之一,服务器的安全性备受关注。服务器被侵入可能导致严重的数据泄露、系统瘫痪等问题,因此及时排查服务器是否被侵入,成为了保障信息安全的重要环节。小德将给大家介绍服务器是否被侵入的排查方案,并采…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
