基于单片机的简易计算器设计原理图及程序代码

合集下载

简易计算器(1602加矩阵键盘)

简易计算器(1602加矩阵键盘)

一、原理图:二、程序#include<reg51.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件#include<math.h>sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P1^7; //忙碌标志位,#define NO_KEY_PRESS 0xff/********************************************************************************************************/unsigned char code tab[]={0xb7,0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb};unsigned long num1,num2,alg;unsigned char flag;void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<15;j++);}/********************************************************************************************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。

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

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

摘要近几年单片机技术的发展很快,其中,电子产品的更新速度迅猛。

计算器是日常生活中比较常见的电子产品之一。

如何才能使计算器技术更加的成熟,充分利用已有的硬件和软件条件,设计出更出色的计算器。

本设计是以STC89C52单片机为核心的计算器模拟系统设计,输入采用4*4矩阵键盘,可以进行加、减、乘、除带符号数字运算(六位整数、两位小数),并在液晶显示屏LCD1602上静态显示操作过程及结果。

本设计的操作过程是利用SCTT89C51的来控制LXD1602显示器,SCT89C51有共四个端口,作为数据的输入端和输出端,其中两个端口作为输出端,两个端口作为输出端,两个特殊的端口XTAL2和XTAL1,则作为外部振荡器的输入端和输出端。

四个端口的作用是:一个输入端接4*4矩阵键盘,另一个数据输入端接显示屏LCD1602的三个特殊端口,而另外两个端口作为输出端口,一个端口接显示屏LCD1602的数据端口,另一个端口作为振荡电路的输入端和输出端,连接好电路,接通电源,则可在液晶显示屏LCD1602显示加、减、乘、除的运算过程及结果,这是计算机的设计总过程。

关键词:单片机;C语言;计算器Simple calculator design based on single chipABSTRACTSingle-chip computer technology developing rapidly in recent years, among them,electronic product update speed is fast. The calculator is one of the electronic products are common in everyday life. How can you make the calculator technology more mature, make full use of existing hardware and software conditions, design a better calculator.This design is based on STC89C52 single-chip microcomputer as the core of calculator simulation system design, input use 4 * 4 matrix keyboard, could add, subtract, multiply and divide signed number-crunching six (integer, two decimal places), and static on the LCD display LCD1602 display operation process and results. This design process is controlled by using SCTT89C51 LXD1602 display, SCT89C51 has a total of four ports, as the data input terminal and output terminal, two of the port as the output side, the two ports as the output side, and two special port XTAL1 and XTAL2, as external oscillator input end and output end. Four port is: a 4 * 4 matrix keyboard input, another data input termination display LCD1602 three specific ports, and the other two ports as output port, a port display LCD1602 data port, another port as oscillation circuit input end and output end, good connection electric circuit, switch on the power, can be in the LCD display LCD1602 display of add, subtract, multiply and divide operation process and result, this is the computer's design process.Key words:Single chip microcomputer; The C language; Calculating machine目录序言 (1)1. 方案论证 (1)1.1 芯片 (1)1.1.1 方案一 (1)1.1.2 方案优点 (2)1.2 输入模块 (2)1.2.1 方案一 (2)1.2.2 方案的优点 (2)1.3 显示模块 (2)1.3.1 方案一 (2)1.3.2 方案的应用 (3)2. 计算器硬件设计 (3)2.1 系统组成及硬件框图 (3)2.2 元器件简介 (3)2.2.1 STC89C52特点 (3)2.2.2 LCD1602液晶显示屏 (8)3. 计算器设计原理分析 (11)3.1 设计方案一 (11)3.2 计算器硬件方案及硬件资源分配 (11)3.2.1 硬件资源分配 (11)3.2.2 系统的硬件设计 (11)3.2.3 键盘电路的设计 (12)3.2.4 显示电路的结构 (13)4. 计算器软件设计 (13)4.1 计算器的软件规划 (13)4.2 主模块的程序设计 (13)4.3 显示模块的程序设计 (15)4.4 键盘模块的程序设计 (16)结论 (18)参考文献 (19)附录一电路原理图 (20)附录二软件程序 (20)致谢 (27)基于单片机的简易计算器的设计序言随着社会的发展,科学的进步,人们的生活水平在逐步地提高,尤其是微电子技术的发展犹如雨后春笋般的变化。

基于单片机简易计算器的设计说明

基于单片机简易计算器的设计说明

基于单片机简易计算器的设计说明一、设计目的计算器是人们日常生活中常用的工具之一,而基于单片机的简易计算器则是计算器的一种应用形式。

本设计旨在利用单片机的强大功能,实现一款功能简单但使用方便的计算器。

二、设计原理1.硬件部分本设计使用单片机作为计算器的核心处理器,通过外接的键盘进行输入,然后通过液晶显示屏进行结果的输出。

电路部分需要将键盘和液晶显示屏与单片机相连接,通过单片机与外设之间的通信实现输入和输出。

2.软件部分计算器的软件部分主要包括输入处理和输出显示两个模块:(1)输入处理:根据键盘输入的按键,通过单片机进行扫描和判断,根据按键的不同采取不同的策略进行处理。

例如,如果输入的是数字键,则将其添加到当前输入的数字序列中;如果输入的是运算符号,则判断当前表达式是否符合运算规则,如果符合则进行计算。

并通过液晶显示屏实时显示输入的数字和表达式。

(2)输出显示:根据输入处理模块的计算结果,通过液晶显示屏进行显示。

根据液晶显示屏的大小和显示效果,进行合适的显示格式和布局,保证计算结果的清晰可读。

三、设计要点1.按键输入处理在设计按键输入处理模块时,需要考虑按键的布局和功能划分。

可以根据计算器的基本功能,将按键分为数字键、运算符键和功能键等,然后根据功能的不同设置不同的处理策略。

2.表达式的计算计算器的核心功能是根据输入的表达式进行实时计算和显示结果。

在设计表达式计算模块时,需要考虑多种表达式的情况,例如加减乘除、括号等,以及运算的优先级和顺序等。

可以利用栈等数据结构来实现表达式的计算。

3.结果的显示设计结果的显示模块时,要考虑到数字的位数以及小数的精确度。

可以设置合适的显示格式,例如科学计数法等,以保证计算结果的准确性和可读性。

四、设计优点1.功能简单:本设计主要实现了计算器的基本功能,包括数字输入、四则运算和结果显示等。

不涉及复杂的高级运算,使得计算器的使用更加简单方便。

2.使用方便:由于采用了单片机进行处理,使得计算器的体积小巧且可以携带,用户可以随时进行计算,满足各种场合的需求。

基于单片机的简易计算器编程

基于单片机的简易计算器编程
if(t[j]==0x33) { DispCharacter(0,k--,'3');}
if(t[j]==0x34) { DispCharacter(0,k--,'4');}
if(t[j]==0x35) { DispCharacter(0,k--,'5');}
if(t[j]==0x36) { DispCharacter(0,k--,'6');}
}
for(i=r-2;i>=0;i--)
{
tx=u;
u=u+(( unsigned long )(t[i]-48)*(pow(r-i-2)));
if(u<tx) { systemerror();}
}
}
void hou( ) //计算符号后面的数值
{
int j,flash=0; //标志位:从不是零的高位开始显示!
int k=12;
for(j=3;j>=0;j--)
{
if(f3==0) { break; }
if(m[0]==0x30&&m[1]==0x30&&m[2]==0x30) { f3=0; break; }
PinRW=0;
PinE=0;
PinData = data1;
PinE=1;
ShortDelay(10);
PinE=0;
PinRW=1;
PinRS=0;
}
void WriteInstruc(char Instruc)
{
while(StatusCheck());
if(m[j]==0x32) { DispCharacter(1,k++,'2'); flash++;}

单片机简易计算器设计

单片机简易计算器设计

单片机简易计算器设计English Answer:## Design of a Simple Calculator Using a Microcontroller.### Introduction.Microcontrollers are widely used in various electronic applications, including embedded systems, industrial automation, and consumer electronics. They offer a powerful and cost-effective solution for performing complex tasks. In this article, we will design a simple calculator using a microcontroller.### Hardware Requirements.The following hardware components are required for this project:Microcontroller.LCD display.Keypad.Resistors.Capacitors.### Microcontroller Selection.For this project, we will use an 8-bit microcontroller such as the ATmega328 or PIC16F887. These microcontrollers have sufficient memory and processing power to perform basic arithmetic operations.### LCD Display Interface.The LCD display is used to display the calculator's results. We will use a character-based LCD display with a 16x2 character resolution. The LCD display is interfacedwith the microcontroller using a parallel interface.### Keypad Interface.The keypad is used to enter numbers and operators. We will use a 4x4 keypad with 16 keys. The keypad is interfaced with the microcontroller using a multiplexed input/output (I/O) interface.### Circuit Design.The circuit diagram for the simple calculator is shown below:[Image of circuit diagram]The circuit consists of the following components:Microcontroller.LCD display.Keypad.Resistors.Capacitors.The microcontroller is connected to the LCD display and keypad using parallel interfaces. The resistors and capacitors provide voltage regulation and filtering.### Software Development.The software for the simple calculator is written in C language. The software consists of the following modules:Main Program: This module initializes the microcontroller, LCD display, and keypad. It also handles the main loop of the calculator.Input Module: This module reads input from the keypad and processes it.Arithmetic Module: This module performs basic arithmetic operations on the input data.Output Module: This module displays the calculator's results on the LCD display.### Conclusion.In this article, we designed a simple calculator using a microcontroller. The calculator is capable of performing basic arithmetic operations and displaying the results on an LCD display. The project is a good example of how microcontrollers can be used to create useful and practical applications.Chinese Answer:## 使用单片机设计简易计算器。

单片机设计简易计算器

单片机设计简易计算器

单片机设计简易计算器(共18页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--简易计算器Simply Calculator1 设计思想此计算器有键盘部分、单片机、显示部分三部分组成,键盘部分主要完成输入功能;单片机主要完成数据处理功能,包括确定按键,完成运算,以及输出数据;显示器部分主要完成单片机输出的显示。

本设计的思路是利用单片机性能好,稳定性强的优点来实现系统的运行。

设计大致可以分为三个步骤:第一步,硬件的选取和设计;第二步,程序的设计和调试;第三步,Protues系统仿真。

硬件是设计的骨骼,不仅关系到设计总体方向的确定,还要综合考虑节能,环保,以及稳定性和经济性等各种因素。

因此需要花费大量的时间。

硬件的选取最为重要,包括选用的芯片,显示设备的选取,输入设备的选取等。

本设计是通过单片机来实现的,因此选用了ATMEGA16单片机作为主体,输入设备选用矩阵键盘。

程序是硬件的灵魂,是实现设计的中心环节。

本设计使用的程序语言是C语言,在“ICC AVR”中运行,调试,直到运行出正确结果,然后输出后缀名为.HEX格式的文件,以备在Protues中仿真使用。

程序是设计的关键,程序的调试需要大量的时间,耐心,还够要有足的细心才能成功。

本设计中就出现了大量的错误,经过认真修改,最终才能运行出正确结果。

最后的系统仿真是设计是否成功的验证,是设计不可缺少的重要环节。

这就要求能掌握Protues的一些基本操作。

2原理分析矩阵键盘的扫描图矩阵键盘图如图所示,单片机的8个I/O口和矩阵键盘相连,用8个I/O口来控制矩阵键盘的16个按键是非常有意思的,首先我们设置单片机的PD0—PD7为输出,且PD0—PD3依次设置为低电平,而PD4—PD7设置为高电平,然后我们设置PD4—PD7为输入,而PD0—PD3仍然为输出,假如此时M1键按下,则PD0与PD4相连,因为PD0是低电平,而PD4是输入,所以PD4会被拉为低电平,同理,如果M2被按下,则PD5会被拉低,M3按下,PD6会被拉低,M4按下,PD7被拉低。

毕业设计(论文)-基于AT89C51单片机的简易计算器设计

毕业设计(论文)-基于AT89C51单片机的简易计算器设计

计算器(Calculator)是微型电子计算机的一种特殊类型。

它与一般通用计算机的主要区别在于程序输入方式的不同。

计算器的程序一般都已经固定,只需按键输入数据和运算符号就会得出结果,很容易就能掌握。

而一般计算机的程序可以根据需要随时改动,或重新输入新的程序。

简易计算器主要用于加减乘除;科学计算器,又增添了初等函数运算(有的还带有数据总加、求平均值等统计运算)。

现代电子计算器首次问世是1963年。

那时的计算器是台式的,在美国波士顿的电子博览会上展出过。

与计算机相比,它小巧玲珑,计算迅捷,一般问题不必事先编写复杂的程序。

随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。

这种技术促使机器人技术也有了突飞猛进的发展,目前人们已经完全可以设计并制造出具有某些特殊功能的简易智能机器人。

随着社会需求,计算器也从原有单一的数字加减计算演变为复杂的多种运算。

现在不在单一的在某一方面而是涉及到生活的方方面面.由于我对知识掌握的不够熟练,重点不够清楚,导致在重点与非重点处花费的时间不成比例,进度缓慢,这是设计没能全部完成的部分原因。

目前只做到按键与显示的结合(即在显示器上可以显示数字键还有命令键+-*/ =清零);加法子程序已经编写成功并严整无误,但在整体调试中未能圆满实现,本部分正在调试中。

等调试成功后,其它运算子程序的问题将迎刃而解。

引言 (1)目录 (2)1.简易计算器的设计方案 (3)1.1硬件部分设计方案 (3)1.2软件部分设计 (3)1.3 硬件设计原理图 (4)2. 简易计算器部分电路设计 (5)2.1 AT89C51常用指令 (5)2.2 显示及显示接口 (11)2.3 键盘、液晶显示的组合接口 (15)2.4 算术逻辑运算处理 (18)3.总设计电路及调试 (19)致谢 (21)参考文献 (22)1.简易计算器的设计方案1.1硬件部分设计方案1 单片机部分单片机以AT89C51来做为核心元器件。

基于C51单片机的简易计算器设计

基于C51单片机的简易计算器设计

基于单片机的简易设计原理专业:通信专业班级:通信1班姓名:刘民学号:1304041127摘要:按下键盘,通过键盘扫描程序,在LCD液晶显示屏上显示按键的操作过程,最终显示计算结果,实现计算器的基本功能。

本文详细介绍LCD显示屏、矩阵键盘与C51单片机接口的应用,并介绍如何通过C51单片机实现计算器的算法。

关键字:C51单片机,键盘,LCD液晶,计算器一、设计任务:本次实验是要以51系列单片机为核心实现一个简易计算器,它的结构简单,外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块STC90C51单片机构成,通过软件编程可实现简单加、减、乘、除、清除结果。

实现对计算器的设计,具体设计如下:1、采用6位显示,最大显示值为“999999”,设计16个按键的矩阵键盘,按键包括‘0~9’、‘+’、‘-’、‘*’、‘/’、‘=’、‘C’。

2、加减法做四字节运算;乘法做双字节运算;除法被除数为四字节,除数为两字节。

3、当运算结果超出显示范围时,显示ERROR!。

4、上述运算输入值均为整数,当结果带有小数时,可以采用四舍五入方式处理,也可以带小数显示。

二、方案论证经分析,计算器电路包括三个部分:显示电路、、4*4键扫描电路、单片机微控制电路。

具体如下:⒈)LCD显示电路LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,但是初学者往往要注意结合LCD本身的时序图来完善初始化程序。

又以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD.⒉)4*4键盘扫描电路(中断式,扫描式,反转式)用户设计行列键盘接口,一般常采用3 种方法读取键值。

一种是中断式,外两种是扫描法和反转法。

扫描法:对键盘上的某一行送低电平,其他行及列全为高电平,然后读取列值,检查各列线点评的变化,如果某列线电平为低电平,就可以确定此行此列交叉点处的按键被按下,采用延时去抖动。

⒊)单片机微控制电路微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复位电路的接法。

基于单片机的简易计算器设计原理图及程序代码

基于单片机的简易计算器设计原理图及程序代码
dsp[1]=0;
for(i=2;i<9;i++)
dsp[i]=12;
c=0;
}
while(dsp[0]==15&&c==0)
{
dsp[0]=keyscan();
if(dsp[0]==14||dsp[0]<10)
{
dsp[0]=14;
dsp[1]=0;
for(i=2;i<9;i++)
dsp[i]=12;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
}
}
if(k==13)
{
if(y==0)
{
BEEP=0;
r[0]=11;
r[1]=11;
if(k==10)
{
x=x+y;
if(x>99999999)
{
BEEP=0;
r[0]=11;
r[1]=11;
r[2]=10;
r[3]=12;
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
}
else
{
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
P2=0xff;
}
}
ET0=1;
}
x=10000*x;
x=x+a[0]+a[1]*10+a[2]*100+a[3]*1000+a[5]*100000+a[6]*1000000+a[7]*10000000;

单片机简易计算器C代码

单片机简易计算器C代码

*****************************************************************************/ #include <>#include <>#include <>#define uchar unsigned char#define DATA=P0sbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;/*----------------------------函数声明------------------------------*/void delay(unsigned int i);uchar keyscan(void);void LCD_Init(void);bit LCD_Busy(void);void LCD_Write_CMD(uchar command);void LCD_Write_DATA(uchar date);/*----------------------------delay------------------------------*/void delay(unsigned int i)//延时函数{while(i--);}/*----------------------------keyscan------------------------------*/uchar keyscan(void)//逐行扫描法{uchar H_line,L_line,Num=0;//行列值P3=0x1e; //行线第一条为0L_line=P1&0x1f; //读入列线值if(L_line!=0x1f) //先检测有无按键按下{delay(100); //去抖L_line=P1&0x1f; //读入列线值if(L_line!=0x1f){switch(L_line){case 0x0f:Num='7';break;//7 按下相应的键显示相对应的码值case 0x17:Num='8';break;//8case 0x1b:Num='9';break;//9case 0x1d:Num='F';break;//Fcase 0x1e:Num='+';break;//+}while(P1!=0xff) //一次按键检测,松手跳出循环{H_line=P3&0x1f;}}}delay(50);P3=0x1d; //行线第二条为0L_line=P1&0x1f; //读入列线值if(L_line!=0x1f) //先检测有无按键按下{delay(100); //去抖L_line=P1&0x1f; //读入列线值if(L_line!=0x1f){switch(L_line){case 0x0f:Num='4';break;//4 按下相应的键显示相对应的码值case 0x17:Num='5';break;//5case 0x1b:Num='6';break;//6case 0x1d:Num='E';break;//Ecase 0x1e:Num='-';break;//-}while(P1!=0xff) //一次按键检测,松手跳出循环{H_line=P3&0x1f;}}}delay(50);P3=0x1b; //行线第三条为0L_line=P1&0x1f; //读入列线值if(L_line!=0x1f) //先检测有无按键按下{delay(100); //去抖L_line=P1&0x1f; //读入列线值if(L_line!=0x1f){switch(L_line){case 0x0f:Num='1';break;//1 按下相应的键显示相对应的码值case 0x17:Num='2';break;//2case 0x1b:Num='3';break;//3case 0x1d:Num='D';break;//Dcase 0x1e:Num='*';break;//*}while(P1!=0xff) //一次按键检测,松手跳出循环{H_line=P3&0x1f;}}}delay(50);P3=0x17; //行线第四条为0L_line=P1&0x1f; //读入列线值if(L_line!=0x1f) //先检测有无按键按下{delay(100); //去抖L_line=P1&0x1f; //读入列线值if(L_line!=0x1f){switch(L_line){case 0x0f:Num='0';break;//0 按下相应的键显示相对应的码值case 0x17:Num='A';break;//Acase 0x1b:Num='B';break;//Bcase 0x1d:Num='C';break;//Ccase 0x1e:Num='/';break;///}while(P1!=0xff) //一次按键检测,松手跳出循环{H_line=P3&0x1f;}}}delay(50);P3=0x0f; //行线第五条为0L_line=P1&0x1f; //读入列线值if(L_line!=0x1f) //先检测有无按键按下{delay(100); //去抖L_line=P1&0x1f; //读入列线值if(L_line!=0x1f){switch(L_line){case 0x0f:Num='b';break;//b 按下相应的键显示相对应的码值case 0x17:Num='o';break;//ocase 0x1b:Num='h';break;//hcase 0x1d:Num='R';break;//Rcase 0x1e:Num='=';break;//=号}while(P1!=0xff) //一次按键检测,松手跳出循环{H_line=P3&0x1f;}}}while(Num!=0)return Num;}/*-------------------------LCD_Init---------------------*/void LCD_Init(void){EN=0;LCD_Write_CMD(0x38);delay(15);LCD_Write_CMD(0x38);delay(15);LCD_Write_CMD(0x38);delay(15);LCD_Write_CMD(0x0d);delay(15);LCD_Write_CMD(0x06);delay(15);LCD_Write_CMD(0x01);}/*-------------------------LCD_Busy---------------------*/bit LCD_Busy(void){bit result;RS=0; //读指令RW=1;EN=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);EN=0;return result;}/*----------------------LCD_Write_CMD----------------------------*/ void LCD_Write_CMD(uchar command){bit Busy_flag;Busy_flag=LCD_Busy();while(Busy_flag)Busy_flag=LCD_Busy(); // 判RS=0;RW=0;EN=1;P0=command;delay(100);EN=0;}/*----------------------LCD_Write_DATA----------------------------*/ void LCD_Write_DATA(uchar date){bit Busy_flag;Busy_flag=LCD_Busy();while(Busy_flag)Busy_flag=LCD_Busy(); // 判定LCD 是不是忙碌RS=1;RW=0;EN=1;P0=date;delay(10);EN=0;}/*----------------------------main--------------------------------*/void main(void){uchar key;long int num1=0,num2=0,result=0;int cnt1=0,cnt2=0,k;unsigned int flagcal=0,flagtrs=0;//运算符标志uchar rem0,rem1,rem2;//寄存运算符char num;unsigned char data Str1[10]={0};//寄存数据LCD_Init();LCD_Write_CMD(0x80);// 设置显示位置( 第一行开头)delay(500);LCD_Write_DATA('0');//测试用LCD_Write_CMD(0x80);while(1){key=keyscan();if(key=='R'){LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('0');LCD_Write_CMD(0x80);break;}/*-------------------------------大体运算------------------------------*/ if (!(key=='o'||key=='b'||key=='h')){if(flagtrs==1) //进制转换启动条件{Str1[cnt1++]=key; //能存上了if(rem1=='o'){if(key>='A'&&key<='F'){LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('E');LCD_Write_DATA('r');LCD_Write_DATA('r');delay(500000);cnt1=0;LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('0');LCD_Write_CMD(0x80);break;}}if(rem1=='b'){if((key>='A'&&key<='F')||(key>='2'&&key<='9')){LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('E');LCD_Write_DATA('r');LCD_Write_DATA('r');delay(500000);cnt1=0;LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('0');LCD_Write_CMD(0x80);break;}}if(key>='A'&&key<='F'){LCD_Write_DATA(key);}}if(key>='0'&&key<='9'){LCD_Write_DATA(key);if(flagcal==0){num1=num1*10+key-'0';if(num1>||num1<-) //溢犯错误{LCD_Write_CMD(0x01);delay(5);LCD_Write_CMD(0x80);delay(5);LCD_Write_DATA('E');delay(5);LCD_Write_DATA('r');delay(5);LCD_Write_DATA('r');break;num1=0;LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('0');LCD_Write_CMD(0x80);}}else{num2=num2*10+key-'0';if(num2>||num2<-) //溢犯错误{LCD_Write_CMD(0x01);delay(5);LCD_Write_CMD(0x80);LCD_Write_DATA('E');delay(5);LCD_Write_DATA('r');delay(5);LCD_Write_DATA('r');break;num2=0;LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('0');LCD_Write_CMD(0x80);}}}if(key=='+'||key=='-'||key=='*'||key=='/'){LCD_Write_DATA(key);LCD_Write_CMD(0xc0);flagcal=1;switch(key){case '+':rem0='+';break;case '-':rem0='-';break;case '*':rem0='*';break;case '/':rem0='/';break;}}if(key=='='){LCD_Write_DATA('=');LCD_Write_CMD(0x8f);LCD_Write_CMD(0x04);switch(rem0){case '+':result=num1+num2;num2=0;num1=0;break;case '-':if(num1>=num2)result=num1-num2;else result=num2-num1;break;case '*':result=num1*num2;num2=0;num1=0;break;case '/':if(num2!=0)result=num1/num2;elseresult=9;num2=0;num1=0;break;default :result=num1;break;}if(result>||result<-) //溢犯错误{LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('E');LCD_Write_DATA('r');LCD_Write_DATA('r');break;result=0;LCD_Write_CMD(0x01);LCD_Write_CMD(0x80);LCD_Write_DATA('0');LCD_Write_CMD(0x80);}for(;result!=0;){num=result%10+'0';LCD_Write_DATA(num);result/=10;}if(num1<num2)LCD_Write_DATA('-');}}/*----------------------------------- 进制转换------------------------------*/ else{if(flagtrs==0){LCD_Write_DATA(key);flagtrs=1;switch(key){case 'o':rem1='o';break;case 'b':rem1='b';break;case 'h':rem1='h';break;}}else{LCD_Write_DATA(key);flagtrs=2;switch(key){case 'o':rem2='o';break;case 'b':rem2='b';break;case 'h':rem2='h';break;}if(rem1=='o'&&rem2=='b')//10-2{LCD_Write_CMD(0xc0);LCD_Write_DATA('o');LCD_Write_DATA('-');LCD_Write_DATA('b');LCD_Write_CMD(0x8f);LCD_Write_CMD(0x04);cnt2=cnt1-1;num1=cnt1+'0';LCD_Write_DATA('b');num1=0;//num=cnt2+'0';//LCD_Write_DATA(num); //测试用。

新基于51单片机的简易计算器

新基于51单片机的简易计算器

基于51单片机的简易计算器1、前言:本设计是基于51系列单片机来进展的数字计算器系统设计,可以完成计算器的键盘输入,进展加、减、乘、除根本四则运算,并在LCD上显示相应的结果;设计电路采用STC90C51单片机为主要控制电路,利用MM74C922作为计算器4*4键盘的扫描IC读取键盘上的输入;显示采用字符LCD静态显示;软件方面使用C语言编程,并用PROTUES仿真。

2、设计任务:计算器软件程序要完成以下模块的设计:(1)键盘输入检测模块;〔2〕LCD 显示模块;〔3〕算术运算模块;〔4〕错误处理及提示模块。

3、主体设计局部:〔1〕、系统模块图:2〕、系统总流程图:4、硬件局部单片机局部+矩阵键盘+1602显示如下列图为简易计算器的电路原理图。

P3口用于键盘输入,接4*4矩阵键盘,键值与键盘的对应表如表----所示,p0口和p2口用于显示,p2口用于显示数值的高位,po口用于显示数值的低位。

简易计算器电路原理图矩阵键盘有16个按键,满足对简易计算器的计算实现,显示局部采用LCD1602,第一行显示计算的数值符号,第二行显示计算结果。

LCD显示模块:本设计采用LCD液晶显示器来显示输出数据。

通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应数据。

5、软件局部*include<reg52.h>*include<intrins.h>*define uchar unsigned charsbit lcden=P2^7;sbit lcdrs=P2^6;sbit lcdrw=P2^5;sbit lcdbf=P0^7;uchar temp,key,i,j,flag,fh,k;long a,b,c;uchar code table[]={1,2,3,0,4,5,6,0,7,8,9,0,0,0,0,0};uchar code table2[]="123+456-789*000/"; void delay(uchar ms){uchar *,y;for(*=ms;*>0;*--)for(y=110;y>0;y--);}/*-------------对LCD1602的操作-----------*/ bit busy(void)//判断忙碌{bit res;lcdrs=0;lcdrw=1;lcden=1;_nop_();_nop_();res=lcdbf;lcden=0;return res;}void write_inst (uchar cmd)//写命令{while(busy()==1); //忙碌就等待lcdrs=0;.lcdrw=0;lcden=0;_nop_();_nop_();P0=cmd;_nop_();_nop_();lcden=1;_nop_();_nop_();lcden=0;}void write_(uchar )//写地址{write_inst(|0*80);}void write_date(uchar dat) //写数据{while(busy()==1);lcdrs=1;lcdrw=0;lcden=0;P0=dat;_nop_();_nop_();lcden=1;_nop_();_nop_();lcden=0;}void init() //初始化{lcden=1;write_inst(0*38);//显示8位2行delay(5);write_inst(0*0c);//显示开,光标关,不闪烁delay(5);write_inst(0*06);//增量方式不位移delay(5);write_inst(0*80);//检测忙碌信号delay(5);write_inst(0*01);//delay(5);}/*------------键盘扫描-----------*/void keyscan()//键盘扫描{P3=0*fe;if(P3!=0*fe){delay(100);if(P3!=0*fe){temp=P3&0*f0;switch(temp){case 0*e0:key=0;break;case 0*d0:key=1;break;case 0*b0:key=2;break;case 0*70:key=3;break;}}while(P3!=0*fe);if(key==0||key==1||key==2){if(j!=0){write_inst(0*01);j=0;}if(flag==0){a=a*10+table[key];}if(flag==1){b=b*10+table[key];}write_date(table2[key]);}else{if(k==0){flag=1;k=1;fh=1;write_date(table2[key]);}}}P3=0*fd;if(P3!=0*fd){delay(100);if(P3!=0*fd){temp=P3&0*f0;switch(temp){case 0*e0:key=4;break;case 0*d0:key=5;break;case 0*b0:key=6;break;case 0*70:key=7;break;}}while(P3!=0*fd);if(key==4||key==5||key==6){if(j!=0){write_inst(0*01);j=0;}if(flag==0){a=a*10+table[key];}if(flag==1){b=b*10+table[key];}write_date(table2[key]);}else{if(k==0){flag=1;k=1;fh=2;write_date(table2[key]);}}}P3=0*fb;if(P3!=0*fb){delay(100);if(P3!=0*fb){temp=P3&0*f0;switch(temp){case 0*e0:key=8;break;case 0*d0:key=9;break;case 0*b0:key=10;break;case 0*70:key=11;break;}}while(P3!=0*fb);if(key==8||key==9||key==10) {if(j!=0){write_inst(0*01);j=0;}if(flag==0){a=a*10+table[key];}if(flag==1){b=b*10+table[key];}write_date(table2[key]);}else{if(k==0){flag=1;k=1;fh=3;write_date(table2[key]);}}}P3=0*f7;if(P3!=0*f7){delay(100);if(P3!=0*f7){temp=P3&0*f0;switch(temp){case 0*e0:key=12;break;case 0*d0:key=13;break;case 0*b0:key=14;break;case 0*70:key=15;break;}}while(P3!=0*f7);.switch(key){case 12:{write_inst(0*01);a=0;b=0;flag=0;fh=0;j=0;k=0;} break;case 13:{if(flag==0){a=a*10;write_date(0*30);P1=0;}else if(flag==1){b=b*10;write_date(0*30);}.} break;case 14:{j=1;if(fh==1){write_(0*4f);write_inst(0*04);c=a+b;while(c!=0){write_date(0*30+c%10);c=c/10;}write_date(0*3d);a=0;b=0;flag=0;fh=0;k=0;}else if(fh==2){write_(0*4f);write_inst(0*04);if((a-b)>0)c=a-b;elsec=b-a;if(c==0)write_date(0*30+0);while(c!=0){write_date(0*30+c%10);c=c/10;}if((a-b)*(-1)>0)write_date(0*2d);write_date(0*3d);a=0;b=0;flag=0;fh=0;k=0;}else if(fh==3){write_(0*4f);write_inst(0*04);c=a*b;if(c==0)write_date(0*30+0);while(c!=0){write_date(0*30+c%10);c=c/10;}write_date(0*3d);a=0;b=0;flag=0;fh=0;k=0;}else if(fh==4){write_(0*4f);write_inst(0*04);i=0;c=(long)(((float)a/b)*1000); //计算c的数据if(c==0)write_date(0*30+0);while(c!=0){write_date(0*30+c%10);c=c/10;i++;if(i==3)write_date(0*2e); //写数据}if((a/b)<=0)write_date(0*30);write_date(0*3d);a=0;b=0;flag=0;fh=0;k=0;}} break;case 15:{if(k==0).{write_date(table2[key]);flag=1;k=1;fh=4;}} break;}}}void main(){init();i=0;j=0;.a=0;b=0;c=0;k=0;flag=0;fh=0;while(1){keyscan();}}6、总结通过该计算器的设计我深入学习数码管扫描和键盘控制,提高对了51系列单片机的实际应用能力。

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

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

基于单片机的简易计算器的设计摘要单片机是采用超大规模集成电路技术,把一台计算机的主要部件集成在一个芯片上所构成的一种集成电路芯片,因此单片机被称为单片微型计算机。

由于单片机体积小、价格低、可靠性高、适用面宽以及有其本身的指令系统等诸多优势,在各个领域、各个行业都得到了广泛应用。

很多大专、本科院校都开设了关于单片机原理与应用方面的课程。

本设计就是依据单片机的原理来进行简易计算器的设计的,设计采用了STC89C52RC单片机作为计算器的主控制器,TC1602液晶作为显示器,4×4矩阵键盘作为输入按键,通过软硬件相结合,来实现整数的“加”、“减”、“乘”、“除”运算。

并在计算器顺利完成的基础上,对系统进行了简单的扩展,增加了电子表功能,使系统完善化和多功能化。

关键词:单片机,计算器,运算,扩展ABSTRACTSCM is a integrated circuit chips that integrated the main cmponents of a computer in a chip by using the large scale integrated circuit technology.So the SCM is called the single chip computer. In various fields, SCM has been widely used for its small size, low price, high reliability, and wide application etc. Many college and universities opened the courses about the principle and application of SCM.The design is a simple calculato that based on the principle of SCM. The chip of STC89C52RC is the main controller of the calculator and the display is TC1602LCD in my design, the keyboard of 4 × 4 matrix is used as input keys, With the combination of hardware and software, it can achieve the integer to plus, reduction, multiplication, division. on the basis of the successful completion, the design can expand the system and make it perfect and multi-functional.Key Words:MCS Calculator Operation Expand目录1. 绪论 (1)1.1课题简介 (1)1.2设计目的 (1)1.3设计任务 (2)2. 课题背景 (3)2.1单片机的发展现状 (3)2.2 STC89系列单片机的简介 (4)2.3计算器的总体功能描述 (8)3. 计算器的硬件系统设计 (9)3.1计算器的硬件系统框架 (9)3.2最小系统的设计 (10)3.3键盘接口电路的设计 (12)3.4显示电路的设计 (13)3.5 DS1302实时时钟电路的设计 (15)3.6计算器的硬件电路原理图 (17)4. 计算器的软件系统设计 (18)4.1主模块程序的设计 (18)4.2键盘扫描模块程序的设计 (19)4.3运算模块程序的设计 (21)4.4显示模块程序的设计 (22)4. 5 DS1302实时时钟模块程序的设计 (23)5. 计算器系统的组装与调试 (26)5.1软件系统的调试与仿真 (26)5.2硬件系统的组装与调试 (27)总结 (30)参考文献 (31)答谢 (32)附录一 (33)1. 绪论1.1课题简介近年来,随着社会的不断发展与进步,人民生活水平、物质水平的不断提高,各种各样的电子产品走进了家家户户,为我们的生活、学习、工作、娱乐提供了各种各样的便利。

基于C51单片机简易计算器的课程设计

基于C51单片机简易计算器的课程设计

赣南师范大学基于C51单片机的简易计算器学院:物理与电子信息学院专业: 电子信息工程班级:学名:学号:指导教师:日期:目录1. 绪论 (3)2。

系统软件设计方案 (4)2。

1设计目标和实现方法 (4)2.2整体方案论证 (4)3. 系统硬件的设计与介绍 (5)3.1复位电路的设计与运用 (5)3。

2时钟振荡器电路的设计与运用 (6)3.3输入电路的设计 (6)3.4输出电路的设计 (8)4。

系统程序的设计与介绍 (11)4。

1 LED显示程序流程图设计 (11)4.2读键输入程序流程图设计 (13)4。

3主程序流程图设计 (14)4.4仿真与调试 (15)5. 结论 .................................................... . (17)元件清单 (18)附录1简易计算器源程序 (19)1.绪论中国古代最早采用的一种计算工具叫筹策,又被叫做算筹。

这种算筹多是用竹子制成,也有用木头,兽骨充当材料的。

大约二百七十枚一束,放在布袋里可以随身携带。

直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时期的珠算盘已经与现代的珠算盘几乎没有差别.17世纪初,西方国家的计算工具已经有了较大的发展,英国数学家纳皮尔发明的”纳皮尔算筹”,英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的快速发展,也为实现现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具.1642年,年仅19岁的法国伟大科学家帕斯卡引用算盘的原理,发明了世界上第一部机械式计算器,在他的计算器中有一些互相联锁的齿轮,一个转过十位的齿轮会使另一个齿轮转过一位,人们可以像拨电话号码盘那样,把数字拨进去,计算结果就会出现在另外一个窗口中,但是只能做加减计算。

1694年,莱布尼兹在德国将其改进成可以进行乘除的计算.此后,一直要到20世纪50年代末才有了电子计算器的出现。

单片机的计算器设计方案(完整)

单片机的计算器设计方案(完整)
}
}
break。
case 15:{write_date(0x30+table1[num]>。flag=1。fuhao=1。}
break。
}
}
}
main(>
{
init(>。
while(1>
{
keyscan(>。
}
}
第4章 仿真和调试
下面用KEIL uVision与 porteus仿真软件实现简易计算器的仿真与调试。
{
b=b*10。
write_date(0x30>。
}
}
break。
case 14:{j=1。
if(fuhao==1>{write_com(0x80+0x4f>。//按下等于键,光标前进至第二行最后一个显示处
write_com(0x04>。 //设置从后住前写数据,每写完一个数据,光0,
4,5,6,0,
1,2,3,0,
0,0,0,0}。
uchar code table1[]={
7,8,9,0x2f-0x30,
4,5,6,0x2a-0x30,
1,2,3,0x2d-0x30,
0x01-0x30,0,0x3d-0x30,0x2b-0x30}。
void delay(uchar z> // 延迟函数
2. Keil C51单片机软件开发系统的整体结构
C51工具包的整体结构中,其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE>,可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及A51编译器编译生成目标文件(.OBJ>。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS>。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。

毕业设计,基于C51单片机的简易计算器的设计演示PPT

毕业设计,基于C51单片机的简易计算器的设计演示PPT

PSEN ALE EA
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
PSEN ALE EA
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
7SEG-MPX8-LED
8051 CALCULATOR(简易计算器) (1)计算器能显示8位数字,开机运行时,只有 数码管最低位显示为“0”,其余位全部不显示; (2)具有4×4键盘,分别表示0~9、+、-、 ×、/ 、=和清零键CL,输入的数字从设计的键盘 输入; (3)可对两个无符号数进行加、减、乘、除运算, 并显示计算结果。 (4)结果溢出时发出“嘀”报警声
GND
ISET
VCC
2 3 4 5 6 7 8 9
P3.4
Q1
AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7
9
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
39 AD0 38 AD1 37 AD2 36 AD3 35 AD4 34 AD5 33 AD6 32 AD7
本设计收获戒成效
• (1)查阅资料、熟悉计算器模拟系统的工作原理和设计 思路。 • (2)掌握单片机软件编程方法,了解硬件设计制作和方 法。 • (3)提高电路制作(protel99se软件)和调试能力。 • (4)提高毕业论文的撰写能力。 • (5)提高不人合作的能力和意识。

利用单片机实现简单功能计算器设计

利用单片机实现简单功能计算器设计

基于单片机的多功能计算器设计1.方案论证与选择1.1输入模块方案一:采用独立式按键作为输入模块,其特点:直接用I/O口构成单个按键电路,接口电路配置灵活、按键识别和软件结构简单,但是当键数较多时,占用I/O口较多,比较浪费资源;其原理图如图1所示:图1 独立的功能按键方案二:采用矩阵式键盘作为输入电路,其特点:电路和软件稍复杂,但相比之下,当键数越多时越节约I/O口,比较节省资源。

其原理图如图2所示:图2 矩阵键盘输入本设计使用键盘输入预置用于计算或计时,按键较多。

若采用独立按键,需频繁按键,为软件设计增加负担,且操作界面不友好。

若采用矩阵式按键,可以方便地输入一个数值,使操作界面更具人性化,节约了宝贵的I/O口资源。

通过对比,故采用方案二作为系统输入模块。

1.2显示模块:方案一:用LCD显示,要用LCD显示,需要学习其专用的驱动控制芯片,比如HD61203,软件实现较为复杂,且LCD的价格昂贵。

方案二:采用LED数码管串行静态显示,虽然其显示亮度高,但是如果显示器的位数较多,需要增加锁存器,故而静态显示占用I/O口线较多,CPU的开销较大。

方案三:采用LED数码管并行动态显示,显示亮度不及静态显示,但电路简单,适合于显示位数较多的情况。

表1 用LED显示器显示十六位进制数的字形代码在下图表示:综上所述,采用方案三并行动态显示是本设计最佳显示方案。

LED数码管显示器由6个发光二极管组成,因此也称之为6段LED显示器,其排列形状如上。

注:该设计电路中的6段LED数码显示器是共阳极的。

2.其他硬件电路模块功能介绍:2.1驱动模块该设计的驱动电路是由74LS245来驱动的。

74LS245是我们常用的芯片,用来驱动LED或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。

74LS245还具有双向三态功能,既可以输出,也可以输入数据。

当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。

单片机课程设计报告(简易计算器).

单片机课程设计报告(简易计算器).

简易计算器摘要:计算器是人们的日常生活中是最常见的电子产品之一,它应用极广、发展迅猛,并且不断出现着拥有更加强大功能的计算器。

为了解和研究计算器,本次课设设计制作了一个简易计算器,能够在十四位的计算范围内进行“+”、“-”、“*”、“/”的基本运算,能进行负数以及小数点后两位的精确结果显示。

该计算器以AT89C51单片机芯片作为核心。

采用LCD1602工业字符液晶进行显示。

完成的计算器经过检验能够完整的实现预设功能,各种细节完善,具有很高的使用价值。

关键词:单片机;简易计算器;AT89C51;LCD1602Simple CalculatorAbstract:Calculator is People's Daily life is one of the most common electronic products, used very wide, developing rapidly, and constantly appear more powerful function with have calculators. In order to understand and study calculator, this class set design made a simple calculator, can the calculation in within 14 "+" and "-" and "*", "/" the basic computing, can carry out negative and two decimal places accurate results are shown. This calculator with AT89C51 chips as the core. Using liquid LCD1602 industrial characters displayed. Complete calculator after inspection can complete realization, various details preset functions to perfect, have high use value.Keywords:MCU; Simple calculator;AT89C51;LCD1602目录中文摘要............................................................1英文摘要............................................................2单片机课程设计......................................................4 1 课程设计任务.....................................................41.1 主要功能设计................................................41.2 任务目的....................................................42 整体设计方案......................................................42.1 方案论证....................................................42.2 系统框图....................................................53 硬件电路的设计...................................................63.1 计算机Protel总图............................................63.2 显示电路设计方案............................................93.3 键盘设计方案................................................93.4 复位电路设计...............................................103.5 晶振电路设计...............................................104 控制软件设计....................................................114.1 程序时序总图...............................................114.2 液晶显示软件设计...........................................124.3 键盘输入软件设计...........................................134.4 计算函数设置...............................................155 系统调试........................................................185.1 硬件调试...................................................185.2 软件调试...................................................18 参考文献...........................................................20 个人小结...........................................................21 附录...............................................................24 附录1..........................................................24 附录2..........................................................251课程设计任务1.1 主要功能设计以AT89C51单片机芯片为核心来制作一个简易计算器,外部由4*4矩阵键盘和一个LCD1602工业字符型液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
r[2]=10;
r[3]=12;
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
}
else
{
x=x/y;
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
{
do
{
dsp[0]=keyscan();
if(dsp[0]==14||dsp[0]<10)
{
BEEP=1;
dsp[1]=0;
for(i=2;i<9;i++)
dsp[i]=12;
c=0;
}
}while((dsp[0]==15)&&(c==0));
}
else if(dsp[0]==14)
{
BEEP=1;
switch(KeyL | KeyR)
{
case 0xb7:{return 0;break;}
case 0x7e:{return 1;break;}
case 0xbe:{return 2;break;}
case 0xde:{return 3;break;}
case 0x7d:{return 4;break;}
c=0;
}
}
}while(dsp[0]==14);
do
{
if(c==0)
{
k=dsp[0];
for(i=0;i<8;i++)
{
a[i]=dsp[i+1];
}
dsp[1]=0;
for(i=2;i<9;i++)
dsp[i]=12;
c=1;
goto KSC;
}
else if(c==1)
{
for(i=0;i<8;i++)
{0xc0,0xf9,0xa4,0xb0,0x99,//0-4
0x92,0x82,0xf8,0x80,0x90,//5-9
0x86,0xaf,0xff,0x7f,0xbf};//E,r,不显,.,-
void delay11(unsigned int i)
{
while(i--);
}
char keyscan()
case 0xbd:{return 5;break;}
case 0xdd:{return 6;break;}
case 0x7b:{return 7;break;}
case 0xbb:{return 8;break;}
case 0xdb:{return 9;break;}
case 0xee:{return 10;break;}//加法
case 0xed:{return 11;break;}//减法
case 0xeb:{return 12;break;}//乘法
case 0xe7:{return 13;break;}//除法
case 0xd7:{return 14;break;}//清零
case 0x77:{return 15;break;}//等于
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
}
}
if(k==13)
{
if(y==0)
{
BEEP=0;
r[0]=11;
r[1]=11;
原理图:
#include<reg52.H>
sbit BEEP=P3^7;
char dsp[9]={0,0,12,12,12,12,12,12,12};
unsigned char code Select[]=
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code LED_CODES[]=
P2=0xff;
}
}
ET0=1;
}c=0;}Fra bibliotekelse if(c==2&&dsp[0]>9)
{
c=0;
}
if(dsp[0]==0&&dsp[1]==0&&dsp[2]==12)
{
goto KSC;
}
else if(dsp[0]>9) break;
else
{for(j=i;j>0;j--)
dsp[j]=dsp[j-1];
}
}
if(i==9)
r[0]=11;
r[1]=11;
r[2]=10;
r[3]=12;
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
}
else
{
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
x=10000*x;
x=x+a[0]+a[1]*10+a[2]*100+a[3]*1000+a[5]*100000+a[6]*1000000+a[7]*10000000;
y=b[4];
y=10000*y;
y=y+b[0]+b[1]*10+b[2]*100+b[3]*1000+b[5]*100000+b[6]*1000000+b[7]*10000000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
}
}
for(i=7;i>0;i--)
{
if(r[i]==0)
r[i]=12;
else
break;
}
for(i=0;i<8;i++)
{
dsp[i+1]=r[i];
}
}
void main(void)
{
char i,j,k,c;
{
char KeyL;
char KeyR;
P1=0xf0;
do
{
do
{
P1=0xF0;
P1=P1|0xF0;
if(P1!=0xF0)
{
KeyL=P1;
P1=0x0F;
P1=P1|0x0F;
KeyR=P1;
}
}while(KeyL==0xF0||KeyR==0x0F);
delay11(300);
}while(P1!=0x0F);
r[3]=(x%10000)/1000;
r[4]=(x%100000)/10000;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
}
}
if(k==11)
{
if(x<y)
{
x=y-x;
if(x>9999999)
{
BEEP=0;
r[5]=(x%1000000)/100000;
r[6]=(x%10000000)/1000000;
r[7]=x/10000000;
for(i=7;i>0;i--)
{
if(r[i]==0&&r[i-1]!=0)
{
r[i]=14;
break;
}
}
}
}
else
{
x=x-y;
r[0]=x%10;
r[1]=(x%100)/10;
if(k==10)
{
x=x+y;
if(x>99999999)
{
BEEP=0;
r[0]=11;
r[1]=11;
r[2]=10;
r[3]=12;
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
}
else
{
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
}
}
void calculate(char k,char a[8],char b[8])
{
char r[8];
long i;
long x,y;
i=0;
x=0;
y=0;
for(i=7;i>0;i--)
{
while(a[i]==12)a[i]=0;
while(b[i]==12)b[i]=0;
}
x=a[4];
{
x=0;
}
else if(x>99999999||x<i)
{
BEEP=0;
r[0]=11;
r[1]=11;
r[2]=10;
r[3]=12;
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
}
else
{
r[0]=x%10;
r[1]=(x%100)/10;
r[2]=(x%1000)/100;
goto KSC;
while(1);
}
void display() interrupt 1
相关文档
最新文档