51单片机键盘输入计算器

时间: 2023-10-30 13:06:53 浏览: 37
这是一个简单的51单片机键盘输入计算器的代码示例,可以实现基本的加减乘除运算: ```c #include <reg51.h> #define uchar unsigned char #define uint unsigned int uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 数码管显示0-9 uchar code table2[] = {0x3f,0x06,0x5b,0x4f}; // 数码管显示+ - * / sbit beep = P1^5; // 蜂鸣器 sbit key1 = P3^0; // 按键1,数字1 sbit key2 = P3^1; // 按键2,数字2 sbit key3 = P3^2; // 按键3,数字3 sbit key4 = P3^3; // 按键4,加法 sbit key5 = P3^4; // 按键5,数字4 sbit key6 = P3^5; // 按键6,数字5 sbit key7 = P3^6; // 按键7,数字6 sbit key8 = P3^7; // 按键8,减法 sbit key9 = P2^0; // 按键9,数字7 sbit key10 = P2^1; // 按键10,数字8 sbit key11 = P2^2; // 按键11,数字9 sbit key12 = P2^3; // 按键12,乘法 sbit key13 = P2^4; // 按键13,清零 sbit key14 = P2^5; // 按键14,数字0 sbit key15 = P2^6; // 按键15,等于 sbit key16 = P2^7; // 按键16,除法 uchar num1 = 0; // 第一个数 uchar num2 = 0; // 第二个数 uchar sign = 0; // 运算符 uint result = 0; // 计算结果 // 数码管显示函数 void display(uchar dat, uchar pos) { P0 = 0; // 关闭所有数码管 switch (pos) { case 1: P0 = 0xfe; break; // 第1位 case 2: P0 = 0xfd; break; // 第2位 case 3: P0 = 0xfb; break; // 第3位 case 4: P0 = 0xf7; break; // 第4位 } P0 = table[dat]; // 显示数字 } // 延时函数 void delay(uint i) { while (i--); } void main() { while (1) { if (!key1) { // 按键1按下 num1 = num1 * 10 + 1; display(num1, 1); } if (!key2) { // 按键2按下 num1 = num1 * 10 + 2; display(num1, 1); } if (!key3) { // 按键3按下 num1 = num1 * 10 + 3; display(num1, 1); } if (!key4) { // 按键4按下 sign = 1; // 加法 display(10, 2); // 显示符号加号 delay(1000); display(0, 2); // 清除符号 } if (!key5) { // 按键5按下 num1 = num1 * 10 + 4; display(num1, 1); } if (!key6) { // 按键6按下 num1 = num1 * 10 + 5; display(num1, 1); } if (!key7) { // 按键7按下 num1 = num1 * 10 + 6; display(num1, 1); } if (!key8) { // 按键8按下 sign = 2; // 减法 display(11, 2); // 显示符号减号 delay(1000); display(0, 2); // 清除符号 } if (!key9) { // 按键9按下 num1 = num1 * 10 + 7; display(num1, 1); } if (!key10) { // 按键10按下 num1 = num1 * 10 + 8; display(num1, 1); } if (!key11) { // 按键11按下 num1 = num1 * 10 + 9; display(num1, 1); } if (!key12) { // 按键12按下 sign = 3; // 乘法 display(12, 2); // 显示符号乘号 delay(1000); display(0, 2); // 清除符号 } if (!key13) { // 按键13按下 num1 = 0; // 清零 num2 = 0; sign = 0; result = 0; display(0, 1); display(0, 2); display(0, 3); display(0, 4); } if (!key14) { // 按键14按下 num1 = num1 * 10; display(num1, 1); } if (!key15) { // 按键15按下 num2 = num1; // 第二个数等于第一个数 num1 = 0; // 第一个数清零 display(0, 1); if (sign == 1) { // 加法 result = num2 + num1; display(10, 2); // 显示符号加号 } else if (sign == 2) { // 减法 result = num2 - num1; display(11, 2); // 显示符号减号 } else if (sign == 3) { // 乘法 result = num2 * num1; display(12, 2); // 显示符号乘号 } else if (sign == 4) { // 除法 result = num2 / num1; display(13, 2); // 显示符号除号 } display(result / 1000, 1); display((result % 1000) / 100, 2); display((result % 100) / 10, 3); display(result % 10, 4); delay(5000); display(0, 1); display(0, 2); display(0, 3); display(0, 4); } if (!key16) { // 按键16按下 sign = 4; // 除法 display(13, 2); // 显示符号除号 delay(1000); display(0, 2); // 清除符号 } } } ``` 这个计算器使用了4位共阳数码管进行显示,支持数字1-9、加减乘除、清零和等于操作。其中,数字1-9和0使用了16个按键进行输入。这个计算器的实现比较简单,但是在实际应用中,需要根据具体需求进行修改和优化。

相关推荐

最新推荐

recommend-type

基于AT89C51单片机的十进制计算器系统设计

本设计是基于AT89C51 单片机进行的十进制计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除4 位无符号数字的简单四则运算,并在LED 上相应的显示结果。硬件方面从功能考虑,首先选择内部存储资源丰富的...
recommend-type

51单片机设计(计算器和倒车雷达)

程序一:编写程序在四位 LED 显示 8、2、... a)定义键盘按键,5个为数字键6、3、5、8、7,3个功能键:减号-,乘号*,等号=; b)可进行三位8进制减法运算; c)可进行两位16进制乘法运算。 另有倒车雷达的课程设计
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】增量式PID的simulink仿真实现

# 2.1 Simulink仿真环境简介 Simulink是MATLAB中用于建模、仿真和分析动态系统的图形化环境。它提供了一个直观的用户界面,允许用户使用块和连接线来创建系统模型。Simulink模型由以下元素组成: - **子系统:**将复杂系统分解成更小的、可管理的模块。 - **块:**代表系统中的组件,如传感器、执行器和控制器。 - **连接线:**表示信号在块之间的流动。 Simulink仿真环境提供了广泛的块库,涵盖了各种工程学科,包括控制系统、电子和机械工程。它还支持用户自定义块的创建,以满足特定仿真需求。 # 2. Simulink仿真环境的搭建和建模 ### 2.
recommend-type

训练集和测试集的准确率都99%,但是预测效果不好

即使训练集和测试集的准确率都很高,但是在实际的预测中表现不佳,可能会有以下几个原因: 1. 数据质量问题:模型训练和测试的数据可能存在问题,比如数据标签错误、数据集采样不均衡、数据集中存在异常值等问题,这些问题可能会导致模型在实际预测中表现不佳。 2. 特征工程问题:模型的特征工程可能存在问题,导致模型无法很好地捕捉数据的特征,从而影响预测效果。 3. 模型选择问题:模型的选择可能不合适,比如选择的模型太简单,无法很好地拟合数据,或者选择的模型太复杂,导致过拟合等问题。 4. 超参数调整问题:模型的超参数可能没有调整到最佳状态,需要进行调整。 针对以上可能的原因,可以采取相应的措施进
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

【实战演练】MATLAB simulink船舶动力定位模拟器

# 1. MATLAB Simulink 简介** MATLAB Simulink 是 MathWorks 公司开发的一款图形化建模和仿真软件,广泛应用于工程、科学和教育领域。它提供了丰富的模块库和仿真环境,使工程师能够快速构建和仿真复杂系统。 Simulink 的核心概念是基于块状图建模,其中每个模块代表一个特定的功能或组件。用户可以通过拖放模块并连接它们来创建系统模型。Simulink 提供了广泛的模块库,涵盖了信号处理、控制系统、动力学和通信等领域。 此外,Simulink 还支持自定义模块开发,允许用户创建自己的模块来扩展其功能。这使得 Simulink 成为一个高度灵活的仿真平
recommend-type

linux下RS485怎么实现

在Linux下实现RS485通信,需要做以下几个步骤: 1. 确认硬件支持:首先需要确认通信设备硬件是否支持RS485通信,如果不支持需要更换支持RS485通信的硬件设备。 2. 配置串口参数:在Linux下使用RS485通信,需要对串口进行一些特殊的配置。例如,需要将串口设置为半双工模式、开启硬件流控等。可以使用Linux提供的stty命令或者相关API接口进行配置。 3. 编写应用程序:通过Linux提供的串口API接口,编写应用程序实现RS485通信。在应用程序中需要设置对应的串口参数,以及发送和接收数据的逻辑。 4. 配置硬件电平转换器:在使用RS485通信时,需要将串口的逻辑