89c51单片机简易计算器

时间: 2023-10-06 17:14:23 浏览: 64
实现一个简易的计算器,可以使用 89c51 单片机和一些基本的电子元件。 首先,需要连接一个 16x2 LCD 显示器,用于显示计算器的输入和输出。然后,需要连接一些按钮,用于输入数字和操作符。这些按钮可以使用矩阵键盘或单独的按钮连接到单片机的 GPIO 引脚上。 接下来,需要编写程序来读取按钮输入和显示结果。程序应该能够处理加、减、乘、除四种基本的数学运算,并能够处理小数点和清除输入。 以下是一个简单的代码示例: ```c #include <reg51.h> #define LCD_RS P1_0 #define LCD_RW P1_1 #define LCD_E P1_2 #define LCD_D4 P1_3 #define LCD_D5 P1_4 #define LCD_D6 P1_5 #define LCD_D7 P1_6 void delay(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 120; j++) { // do nothing } } } void lcd_cmd(unsigned char cmd) { LCD_RS = 0; LCD_RW = 0; LCD_E = 1; LCD_D4 = cmd >> 4; LCD_D5 = cmd >> 5; LCD_D6 = cmd >> 6; LCD_D7 = cmd >> 7; delay(1); LCD_E = 0; delay(1); LCD_D4 = cmd & 0x0F; LCD_D5 = (cmd & 0x1F) << 1; LCD_D6 = (cmd & 0x3F) << 2; LCD_D7 = (cmd & 0x7F) << 3; delay(1); LCD_E = 1; delay(1); LCD_E = 0; delay(1); } void lcd_data(unsigned char data) { LCD_RS = 1; LCD_RW = 0; LCD_E = 1; LCD_D4 = data >> 4; LCD_D5 = data >> 5; LCD_D6 = data >> 6; LCD_D7 = data >> 7; delay(1); LCD_E = 0; delay(1); LCD_D4 = data & 0x0F; LCD_D5 = (data & 0x1F) << 1; LCD_D6 = (data & 0x3F) << 2; LCD_D7 = (data & 0x7F) << 3; delay(1); LCD_E = 1; delay(1); LCD_E = 0; delay(1); } void lcd_init() { lcd_cmd(0x33); lcd_cmd(0x32); lcd_cmd(0x28); lcd_cmd(0x0C); lcd_cmd(0x06); lcd_cmd(0x01); delay(10); } unsigned char read_key() { unsigned char key = 0xFF; unsigned char row, col; for (row = 0; row < 4; row++) { P2 = ~(1 << row); col = P2 & 0x0F; if (col != 0x0F) { key = row * 4 + col; break; } } return key; } unsigned char get_digit() { unsigned char digit = 0; while (1) { unsigned char key = read_key(); if (key != 0xFF) { if (key == 0x0D) { // enter break; } else if (key == 0x0C) { // clear digit = 0; break; } else if (key >= 0x00 && key <= 0x09) { // 0-9 digit = digit * 10 + (key & 0x0F); lcd_data(key + '0'); } else if (key == 0x0A) { // . lcd_data('.'); } while (read_key() != 0xFF) { // wait for key release } } } return digit; } unsigned char get_operator() { unsigned char op = 0; while (1) { unsigned char key = read_key(); if (key != 0xFF) { if (key == 0x0D) { // enter break; } else if (key == 0x0C) { // clear op = 0; break; } else if (key == 0x0B) { // + op = '+'; lcd_data('+'); } else if (key == 0x07) { // - op = '-'; lcd_data('-'); } else if (key == 0x03) { // * op = '*'; lcd_data('*'); } else if (key == 0x06) { // / op = '/'; lcd_data('/'); } while (read_key() != 0xFF) { // wait for key release } } } return op; } void main() { lcd_init(); lcd_cmd(0x80); while (1) { unsigned char a = get_digit(); unsigned char op = get_operator(); unsigned char b = get_digit(); lcd_cmd(0xC0); if (op == '+') { lcd_data(a + b); } else if (op == '-') { lcd_data(a - b); } else if (op == '*') { lcd_data(a * b); } else if (op == '/') { lcd_data(a / b); } else { lcd_data('E'); } while (read_key() != 0xFF) { // wait for key release } } } ``` 这段代码实现了一个简单的计算器,可以通过矩阵键盘输入数字和操作符,并在 LCD 显示器上显示结果。需要注意的是,这个计算器并没有处理优先级和括号等复杂的数学运算,只能处理两个数字之间的基本四则运算。

相关推荐

最新推荐

基于AT89C51单片机简易计算器的设计.doc

设计的是简单的计算器,可以进行四则运算(+、-、×、÷),C语言编程,PROTUES仿真,实验报告 单片机课程设计

基于AT89C51的简易计算器设计

基于单片机的简易计算器,能实现四位整数的加减乘除计算。软件程序使用Keil C实现。

简易数字计算器课程设计

设计要求及任务 (1)设计4*4键盘电路; (2)按下数字键,数码管上相应能显示数字; (3)按下功能键,能相应执行程序,即“加”,“减”,“乘”,“除”,“等于”; (4)数码管个数为四个,能实现满足数码管最大位数的...

单片机串行口与PC机通讯课程设计论文

AT89C51单片机在无线数据的应用.doc DPJshiyan(ZhangSheng).wmv LCD点阵字符显示屏应用设计.doc LED彩灯控制器设计.doc LED显示的电压表电路设计.doc 八路扫描式抢答器设计.doc 报时定时控制系统.doc 采用实时时钟...

操作系统实验一报告【使用C语言/C++实现时间片轮转调度算法】

操作系统实验一报告【使用C语言/C++实现时间片轮转调度算法】

三相电压型逆变器工作原理分析.pptx

运动控制技术及应用

管理建模和仿真的文件

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

液位控制技术在换热站工程中的应用与案例分析

# 1. 引言 ### 1.1 研究背景 在工程领域中,液位控制技术作为一项重要的自动化控制技术,广泛应用于各种工业生产和设备操作中。其中,液位控制技术在换热站工程中具有重要意义和价值。本文将针对液位控制技术在换热站工程中的应用展开深入研究和分析。 ### 1.2 研究意义 换热站作为工业生产中的关键设备,其性能稳定性和安全运行对于整个生产系统至关重要。液位控制技术作为一项可以实现对液体介质在容器内的准确控制的技术,在换热站工程中可以起到至关重要的作用。因此,深入研究液位控制技术在换热站工程中的应用对于提升工程效率、降低生产成本具有重要意义。 ### 1.3 研究目的 本文旨在通过

vue this.tagsList判断是否包含某个值

你可以使用JavaScript中的`includes()`方法来判断一个数组是否包含某个值。在Vue中,你可以使用以下代码来判断`this.tagsList`数组中是否包含某个值: ```javascript if (this.tagsList.includes('某个值')) { // 数组包含该值的处理逻辑 } else { // 数组不包含该值的处理逻辑 } ``` 其中,将`某个值`替换为你要判断的值即可。

数据中心现状与趋势-201704.pdf

2 2 IDC发展驱动力 一、IDC行业发展现状 3 3 IDC发展驱动力 4 4 ü 2011年以前,全球IDC增长迅速,2012-2013年受经济影响放慢了增长速度,但从2014年开始,技术创新 驱动的智能终端、VR、人工智能、可穿戴设备、物联网以及基因测序等领域快速发展,带动数据存储规模 、计算能力以及网络流量的大幅增加,全球尤其是亚太地区云计算拉动的新一代基础设施建设进入加速期。 ü 2016 年全球 IDC 市场规模达到 451.9 亿美元,增速达 17.5%。从市场总量来看,美国和欧洲地区占据了 全球 IDC 市场规模的 50%以上。从增速来看,全球市场规模增速趋缓,亚太地区继续在各区域市场中保持 领先,其中以中国、印度和新加坡增长最快。 2010-2016年全球IDC市场规模 IDC市场现状-全球 5 5 IDC市场现状-国内 ü 中国2012、2013年IDC市场增速下滑,但仍高于全球平均增速。2014年以来,政府加强政策引导、开放 IDC牌照,同时移动互联网、视频、游戏等新兴行业发展迅速,推动IDC行业发展重返快车道。 ü 2016 年中国 IDC 市场继续保持高速增