数码管之简单加减法计算器--项目总结

合集下载

电工实验报告 加法计算器

电工实验报告 加法计算器

姓名班级 1 学号
实验日期节次教师签字成绩
加法计算器
1.实验目的
熟悉掌握有关时序逻辑电路的组成原理;
通过设计一个简单的计算器,掌握组合逻辑电路、时序逻辑电路的分析和设计方法;
了解及掌握中规模集成电路,了解各个芯片的管脚图及结构图。

能够掌握全加器、计数器等的功能及实现方法;
锻炼自己的动手实践能力,并自己设计电路,培养自己的兴趣。

2.总体设计方案或技术路线
设计一个多功能计算器,它能实现简单的加法运算,只能显示结果为0—16的和数,并能够在数码管上显示,加法运算的实现要求:用四个开关代表四位二进制数,操纵开关,输入二进制数码,则在对应的数码管1上会显示出相应的十进制数,即代表被加数;用同样的方法在另外的四个开关上输入二进制数,则在对应的数码管2上还会出现相应的十进制数,即代表加数;当加数与被加数都输入后,在数码管3和数码管4上出现两数的和,两个数码管可以显示到和的十位。

3.实验电路图
4.仪器设备名称、型号和技术指标
直流稳压电源、试验箱、万用表;
2个74LS00D、1个74LS283D、1个74LS04D、2个74LS08D、1个74LS20D;
单刀双掷开关9个、导线若干。

(完整版)基于51单片机的数码管简易计算器

(完整版)基于51单片机的数码管简易计算器

基于51/52单片机的简易计算器制作11级自动化2班王栎斐宋为为闫巨东一、题目利用单片机芯片STC89C52、四位八段共阳数码管及已制作好的电路板等器件设计制作一个计算器。

二、任务与要求要求计算器能实现加减乘除四种运算具体如下1. 加法:四位整数加法计算结果若超过八位则显示计算错误2. 减法:四位整数减法计算结果若超过八位则显示计算错误3. 乘法:多位整数乘法计算结果若超过四位则显示计算错误4. 除法:整数除法5. 有清除功能三、课程设计简述总体设计思路简述1.按照系统设计的功能的要求初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成。

主控芯片使用STC89C52单片机。

2.键盘电路采用4*4矩阵键盘电路。

3.显示模块采用共阳极数码管构成。

四、硬件电路五、软件编程部份#include<reg52.h>#define uchar unsigned char#define uint unsigned int//uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴极// 0 1 2 3 4 5 6 7 8 9 熄灭-//uchar code loc[]={0xff,0xfe,0xfd,0xfb,0xf7};//uchar code ero[]={0x79,0x50,0x5c};uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x40};//共阳极uchar code loc[]={0x00,0x80,0x40,0x20,0x10};uchar code ero[]={~0x79,~0x50,~0x5c};uint n=0,n1=0,n2=0; //赋初值uchar flag=0; //计算类型选择关键字void delay(int t);void display(int n);void error();main(){while(1){uchar temp;//第一行检测P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xfe;if(temp!=0xfe){temp=P3;switch(temp){case 0xee:n1=0;n2=0;n=0;flag=0;break; //清零case 0xde:n1=10*n1+0;n=n1;break;case 0xbe: if(flag==1)n=n2+n1; //=if(flag==2)n=n2-n1;if(flag==3)n=n2*n1;if(flag==4)n=n2/n1;n1=0;break;case 0x7e: // +n2=n1;n1=0;flag=1;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第二行P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed:n1=10*n1+1;n=n1;break; //4case 0xdd:n1=10*n1+2;n=n1;break; //5case 0xbd:n1=10*n1+3;n=n1;break; //6case 0x7d:// -n2=n1;n1=0;flag=2;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第三行P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:n1=10*n1+4;n=n1;break;case 0xdb:n1=10*n1+5;n=n1;break;case 0xbb:n1=10*n1+6;n=n1;break;case 0x7b: // *n2=n1;n1=0;flag=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第四行P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:n1=10*n1+7;n=n1;break; //7case 0xd7:n1=10*n1+8;n=n1;break; //8case 0xb7:n1=10*n1+9;n=n1;break; //9case 0x77: // /n2=n1;n1=0;flag=4;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}display(n);}}//延时函数void delay(int t){int x,y;for(x=0;x<t;x++)for(y=0;y<t;y++);}//数码管显示void display(int n){//溢出处理uchar g,s,b,q;int abs;if((n>9999)||(n<-999)) error();//正数if((n>=0)&&(n<=9999)) {g=n%10;s=n/10%10;b=n/100%10;q=n/1000%10;P0=num[g];delay(5);P2=loc[4];delay(2);P2=loc[0];delay(3);if(n>=10){P0=num[s];P2=loc[3];delay(2);P2=loc[0];delay(3);}if(n>=100){P0=num[b];P2=loc[2];delay(2);P2=loc[0];delay(3);}if(n>=1000){P0=num[q];P2=loc[1];delay(2);P2=loc[0];delay(3);}}//负数if((n<0)&&(n>=-999)){abs=-n;g=abs%10;s=abs/10%10;b=abs/100%10;q=abs/1000%10;P0=num[g];P2=loc[4];delay(2);P2=loc[0];delay(2);if((abs/10%10>0)||(abs/100%10>0)){P0=num[s];P2=loc[3];;delay(2);P2=loc[0];delay(2);if((abs/100%10>0)){P0=num[b];P2=loc[2];delay(2);P2=loc[0];delay(2);if((abs/1000%10>0)){P0=num[q];P2=loc[1];delay(2);P2=loc[0];delay(2);}else{P0=num[11];P2=loc[1];delay(2);P2=loc[0];delay(2);}}else{P0=num[11];P2=loc[2];delay(2);P2=loc[0];delay(2);}}else{P0=num[11];P2=loc[3];delay(2);P2=loc[0];delay(2);}}}//溢出显示void error(){P2=loc[1];P0=ero[0];delay(2);P2=loc[0];delay(3);P2=loc[2];P0=ero[1];delay(2);P2=loc[0];delay(3);P2=loc[3];P0=ero[1];delay(2);P2=loc[0];delay(3);P2=loc[4];P0=ero[2];delay(2);P2=loc[0];delay(3); }。

简易加减计数器

简易加减计数器

1.设计目的1、综合运用相关课程中所学到的知识去完成设计课题。

2、学会电路的设计与仿真。

3、能自己熟练连接实现逻辑电路。

4、掌握Proteus的基本用法。

5、掌握74LS283N芯片的逻辑功能和译码显示器的使用方法。

2.设计要求1、用于两位以下十进制的加减运算。

2、以合适方式显示输入数据及计算结果。

3、设计要求被减数大于或等于减数。

3.总体设计3.1电路方框图图1电路方框图3.2工作原理先利用单刀双掷开关将加数(减数)与被加数(被减数)置入,然后通过将加数(减数)通过异或门进行逻辑组合,再通过74LS283N 实现8421码的转换,最后接上7段数码管显示结果。

4.单元电路设计与分析4.1加法电路加法电路原理图如图1所示:图1加法电路4.2减法电路图2减法电路4.3元件清单以及元件介绍2、设计思路第一步,置入两个四位二进制数。

例如(1001),(0011)和(0101),(1000),同时在两个七段译码显示器上显示出对应的十进制数9,3和5,8。

第二步,通过开关选择加(减)运算方式;第三步,若选择加运算方式所置数送入加法运算电路进行运算,同理若选择减运算方式,则所置数送入减法运算电路运算;第四步,前面所得结果通过另外两个七段译码器显示。

即:若选择加法运算方式,则(1000)+(0110)=(1110)十进制8+6=14并在七段译码显示器上显示14。

若选择减法运算方式,则(0101)-(1000)=(10011)十进制5-8=-3,并在七段译码显示器上显示-3。

3、运算方案方案一通过开关J1-J8接不同的高低电平来控制输入端所置的两个一位十进制数,J1-J4控制第一个数A,J5-J8控制第二个数B,译码显示器U12和U13分别显示所置入的两个数。

数A直接置入四位超前进位加法器74LS283N的A4-A1端,74LS283的B4-B1端接四个2输入异或门。

四个2输入异或门的一输入端同时接到开关J9上,另一输入端分别接开关J5-J8,通过开关J5-J8控制数B的输入。

模电加减法运算电路实验总结

模电加减法运算电路实验总结

模电加减法运算电路实验总结对于学生而言,这个内容有点陌生。

因此,他们对这门课的兴趣不高。

为了改变这种现状,我从制作思路和如何提高学生学习兴趣方面着手准备了这份材料。

经过两周的努力终于完成了本节的内容。

通过此次模电的教学实践,使自己对于模电课程又重新认识与理解。

下面具体谈谈在教学中得出的几点体会:模拟电子技术课程的教学过程中涉及到许多加减乘除运算电路。

由于以前从未接触过类似知识,因此觉得它比较难学,尤其是加减乘除运算电路。

因此,给同学们带来很多麻烦,每当老师讲授加减乘除运算电路时,他们都显得无精打采的样子。

久而久之导致了对模电课程产生厌倦情绪。

针对这些问题,首先我尝试寻找问题的根源所在,然后再根据问题的症结去处理问题。

最后将问题解决掉。

由于实际的应用环境并非像理论书上说的那么复杂。

也正好符合学生感官的直观认识。

因此可以直观地理解。

还有,从日常生活中可以发现,加减乘除运算电路在我们日常生活中十分普遍,只要稍微留意一下就能找到相关事例。

所以在本节课上讲述了电子计算机的起源——算盘。

为什么算盘被淘汰?是否取代算盘?让学生清楚算盘存在的历史背景,明白算盘没落的真正原因。

在教学中利用计算机绘图软件画出的电路图帮助学生更快速地掌握了算盘的工作原理。

避免了枯燥乏味的抽象介绍。

学生通过动态的电路演示就会马上想到算盘怎么用,只需鼠标轻松一点即可进行加减乘除运算。

模电的数字部分主要是指:二进制数,0,1。

数码管和译码器是二进制的主要载体。

在计算机中,二进制运算的运算规则是固定的。

而0,1的表示却灵活多变。

它既能够用来表示逻辑0,1的位置,还能表示某个信号。

随着科技的发展,人们开始研究用0,1来编写加减乘除等功能的数字逻辑电路,把它称为逻辑电路。

在本次课上我们将讲解的是用集成电路制作电子计算器的原理。

为什么用集成电路呢?一般说来,只要满足晶体管有输入端口、输出端口,输出级的输出信号为正或负即可;另外集成电路便宜、易于操作,能够做出各种各样的形式,且易于修改。

简单计算器—实训报告

简单计算器—实训报告

Linux应用与编程实习报告学院名称专业班级学生姓名学号指导教师山东科技大学一、实习题目: B2-简单计算器二、实习时间:19周~ 20周实习地点: J13- 128三、实习任务:实现一个简单计算器,计算器包括加、减、乘、除四种运算。

用户通过鼠标进行数据输入,输入的数据以及计算结果显示在文本框中四、小组分工说明:独立完成五、实习成绩六、指导教师对实习的评语:指导教师(签章):2015年月日目录1. 概述 -------------------------------------------------------- 42. 相关技术 -------------------------------------------------- 42.1 QT中信号和槽 -------------------------------------- 42.2 字符串输出数据组 -------- 错误!未定义书签。

3. 需求分析 -------------------------------------------------- 54. 总体设计与详细设计 ----------------------------------- 54.1 系统模块划分 --------------------------------------- 54.2 主要功能模块 --------------------------------------- 55. 编码实现 -------------------------------------------------- 6 6.测试情况说明------------------------------------------- 157. 实训中遇到的主要问题及解决方法 ---------------- 168. 实训收获与体会 ---------------------------------------- 161. 概述1.1 实训项目简介本次实训项目是应用Linux系统中的QT编译器编写一个界面简洁,操作简单的简易计算器。

简单计算器实验报告

简单计算器实验报告

简单计算器实验报告
《简单计算器实验报告》
实验目的:通过使用简单计算器进行数学运算,探究其在日常生活中的实际应用价值。

实验材料:简单计算器、纸笔
实验步骤:
1. 使用简单计算器进行加法、减法、乘法和除法运算,记录运算过程和结果。

2. 尝试使用计算器进行复杂运算,如求平方根、求倒数等。

3. 计算器的功能和使用方法的讨论。

实验结果:
通过实验,我们发现简单计算器在日常生活中有着非常重要的应用价值。

它可以帮助我们快速准确地进行数学运算,节省时间和精力。

同时,计算器还具有一些高级的功能,如求平方根、求倒数等,这些功能在科学计算和工程计算中也具有很大的作用。

结论:
简单计算器是我们日常生活中必不可少的工具之一,它的实际应用价值是非常高的。

通过这次实验,我们更加深入地了解了计算器的功能和使用方法,对于我们的学习和工作都有着重要的帮助。

通过这次实验,我们不仅对计算器有了更深入的了解,也增加了对数学运算的兴趣,希望我们在日常生活中能够更加灵活地运用计算器,提高我们的数学运算能力。

简易加减计算器设计(数电)

简易加减计算器设计(数电)

电子技术课程设计电气与信息工程学院建筑电气与智能化专业题目:简易加减计算器设计姓名:徐雪娇学号:094412110指导教师:祁林简易加减计算器设计一、设计目的1、在前导验证性认知实验基础上,进行更高层次的命题设计实验.2、在教师指导下独立查阅资料、设计、特定功能的电子电路。

3、培养利用数字电路知识,解决电子线路中常见实际问题的能力.4、积累电子制作经验,巩固基础、培养技能、追求创新、走向实用。

5、培养严肃认真的工作作风和严谨的科学态度。

二、设计要求1、用于两位一下十进制的加减运算。

2、以合适方式显示输入数据及计算结果。

三、总体设计第一步置入两个四位二进制数。

例如(1001)2,(0011)2和(0101)2,(1000)2,同时在两个七段译码显示器上显示出对应的十进制数9,3和5,8。

第二步通过开关选择加(减)运算方式;第三步若选择加运算方式所置数送入加法运算电路进行运算;同理若选择减运算方式,则所置数送入减法运算电路运算;第四步前面所得结果通过另外两个七段译码器显示。

即:方案一通过开关J1-J8接不同的高低电平来控制输入端所置的两个一位十进制数,译码显示器U10和U13分别显示所置入的两个数。

数A直接置入四位超前进位加法器74LS283的A4-A1端,74LS283的B4-B1端接四个2输入异或门。

四个2输入异或门的一输入端同时接到开关S1上,另一输入端分别接开关J5-J8,通过开关J5-J8控制数B的输入。

当开关S1接低电平时,B与0异或的结果为B,通过加法器74LS283完成两个数A和B的相加。

当开关J1接高电平时,B与1异或的结果为B非,置入的数B在74LS283的输入端为B的反码,且74LS283的进位信号C0为1,其完成S=A+B(反码)+1,实际上其计算的结果为S=A-B完成减法运算。

由于译码显示器只能显示0-9,所以当A+B>9时不能显示,我们在此用另一片芯片74LS283完成二进制码与8421BCD码的转换,即S>9(1001)时加上6(0110)2,产生的进位信号送入译码器U12来显示结果的十位,U11 2显示结果的个位。

单片机实践简易计算器实验报告

单片机实践简易计算器实验报告

单片机实践简易计算器实验报告本次实验的目的是通过单片机实现一个简易计算器,实现加减乘除四则运算。

在实验过程中,我们使用了STC89C52单片机,通过编写程序实现计算器的功能。

实验步骤:1. 确定硬件电路连接我们需要确定硬件电路连接。

本次实验使用的是STC89C52单片机,需要将其与LCD1602液晶屏、4x4矩阵键盘、蜂鸣器等硬件连接。

具体连接方式如下:STC89C52单片机:P0口:连接LCD1602液晶屏的数据线D0-D7P1口:连接LCD1602液晶屏的控制线RS、RW、EP2口:连接4x4矩阵键盘的行线R1-R4P3口:连接4x4矩阵键盘的列线C1-C4P4口:连接蜂鸣器2. 编写程序接下来,我们需要编写程序实现计算器的功能。

程序主要分为以下几个部分:(1)LCD1602液晶屏初始化(2)4x4矩阵键盘扫描(3)计算器功能实现(4)LCD1602液晶屏显示结果3. 调试程序编写完程序后,我们需要进行调试。

在调试过程中,我们需要注意以下几点:(1)检查硬件连接是否正确(2)检查程序是否有语法错误(3)检查程序是否能够正常运行4. 实验结果经过调试,我们成功实现了一个简易计算器。

在使用过程中,用户可以通过4x4矩阵键盘输入数字和运算符,计算器会自动进行计算,并在LCD1602液晶屏上显示结果。

同时,计算器还具有清零、退格等功能,方便用户进行操作。

总结:通过本次实验,我们学习了单片机的基本原理和编程方法,掌握了如何使用单片机实现一个简易计算器。

同时,我们还学习了如何进行硬件电路连接和程序调试,提高了我们的实践能力和动手能力。

嵌入式实验报告-简易计算器

嵌入式实验报告-简易计算器

1实验目的根据计算器的原理设计一个具有加减乘除功能的简易计算器2实验要求(1)数字和结果用数码管显示。

(2)数字、+—*/、=、C用4X4键盘实现。

(3)计算结果正确,有出错提示。

二实验原理框图基本工作原理:本设计利用数码管和4*4 矩阵式键盘实现了简易计算器的功能。

接通电源,数码管显示全0。

计算时,通过键盘输入需要计算的数字,该数字显示在数码管上,当键入等号时,计算结果显示在数码管上。

进行第二次运算时,按 C 键清除键盘结果。

当计算出现错误时,LED 灯亮报警。

当计算结果超出数码管显示出现溢出时,报警电路也会报警。

报警输出为-- 。

四系统软件设计1. 数据输入模块原理:通过4*4 矩阵模块输入数字,在数码管上显示出来。

2. 运算模块原理:四种运算同步运行,通过按键加、减、乘、除选择输出对应的计算结果,当按键等号时,将所得结果反馈给运算模块输入端。

3. 输出模块原理:通过按键等号来控制显示运算对象还是运算结果,当等号按下时,输出计算结果,否则显示当前输入的数据。

当输出结果溢出是LED亮四次,同时数码管显示都为-- 。

五实验调试首先按清零键清零。

然后进行调试。

输入数据2,再按乘法键,输入第二个数字6,按等号键,数码管显示12;再按除法键,输入第二个数据3,按等号键,数码管显示4;再按加法键,输入第三个数据7,依次按等号键,数码管显示11;按减法键,输入第四个数据99,依次按等号键,数码管显示-88 。

若输入超出显示管的最大值或者超出数码管的位数,结果溢出,LED亮报警, 同时数码管显示都为--。

如输入999999加上2,结果就溢出,LED灯亮四次报警。

六程序#include "LPC2468.h" /* LPC24xx definitions */#include "type.h"#include "irq.h"#include "target.h"#include "timer.h"#include "fio.h"#include "keyboard.h"#include "SPI.h" extern BYTE seg_buf[50]; // LPC2468 开发板使用此数组的 0~5 显示六个数 码管;LPC2478板使用1~6BYTE seg_copy1[7];BYTE seg_copy2[7];extern BYTE KEY; // LPC2468 开发板使用此数组的 0~5 显示六个数码管; LPC2478板 使用 1~6 enum { Add =1, Dec, Mut, Div, nofuntion}funtion;********* ** Main Function main()********************************************************************* int main (void) {unsigned long Num1 =0;/*第一个输入的数字 */ unsigned long Num2 =0;/*第二个输入的数字 */ unsigned long Num3 =0;/*第二个输入的数字*/计算输入的数字的个数,超过 6 个则报警, 允许输入数字标志 */ 允许输入数字标志 */ 运算功能 */unsigned char Ne_num = 0;/* 负数标志 */DWORD value=0,i=0;TargetResetInit(); enable_timer(1);SPI_Init(8); // Seg_Init(); // LedsInit();for(i=0;i<7;i++){seg_copy1[i]=0;seg_copy2[i]=0; seg_buf[i]=0;}counter = 0;cal_allow = 1;input_allow = 1; funtion_type = nofuntion;while ( 1 ){value = KEY;/* 输入数字 */ if(value>0 && value<11)if(counter < 6&&input_allow==1){if(counter == 0) seg_buf[1] = value-1;else{for(i=0;i<counter;i++){ unsigned char counter = 0; /* 运算结果超过 6 位数也报警 */unsigned char cal_allow = 1; /*unsigned char input_allow = 1;/* unsigned char funtion_type = 0;/* SPI 总线速率为28.8/8 = 3.6 MHz 数码管初始化seg_buf[counter+1-i] = seg_buf[counter-i];}seg_buf[1] = value-1;} counter++;}if(counter == 6){input_allow = 0;LedOn(1);LedOn(2);LedOn(3);LedOn(4);}}/* 如果是“ C”键,则清除显示,清除计算标志*/ if(value == 11){for(i=0;i<7;i++){ seg_copy1[i]=0; seg_copy2[i]=0;seg_buf[i]=0;counter = 0;Num1 = 0;Num2 = 0;Num3 = 0;cal_allow = 1;input_allow = 1;Ne_num = 0;/* 负数标志*/ funtion_type = nofuntion;}/* 如果是“ +”键,则显示结果*/if(value == 13 ){if(cal_allow == 1){for(i=0;i<7;i++){seg_copy1[i] = seg_buf[i];/* 备份第一次输入的数字*/ seg_buf[i]=0; /* 字*/}funtion_type = Add;counter = 0; /* cal_allow=1; /* input_allow = 1; /* }else{ 计数器清零允许第二次计数*/ 再等号按下前不能再按第二次*/ 允许第二次输入数据*/input_allow = 0; /* 禁止按下2 次功能键时候输入数据*/显示清零以准备第二次输入数}/* 如果是“ - ”键,则显示结果*/ if(value == 14&& cal_allow == 1){if(cal_allow == 1){for(i=0;i<7;i++){seg_copy1[i] = seg_buf[i];/*seg_buf[i]=0; /* 字*/}funtion_type = Dec;counter = 0; /*cal_allow =1; /*input_allow = 1; /*}else{input_allow = 0; /*}}备份第一次输入的数字*/显示清零以准备第二次输入数计数器清零允许第二次计数*/ 再等号按下前不能再按第二次*/ 允许第二次输入数据*/禁止按下 2 次功能键时候输入数据*//* 如果是“X”键,则显示结果*/ if(value == 15 && cal_allow == 1) {if(cal_allow == 1){for(i=0;i<7;i++)seg_copy1[i] seg_buf[i]=0; = seg_buf[i];/*/*备份第一次输入的数字 */ 显示清零以准备第二次输入数字*/}funtion_type = Mut;counter = 0; /* 计数器清零允许第二次计数 */cal_allow =1; /* 再等号按下前不能再按第二次 */input_allow = 1 } else {input_allow =; /*允许第二次输入数据 */; /* 禁止按下 2 次功能键时候输入数据 */}} /* 如果是“ / ”键,则显示结果 */if(value == 16 && cal_allow == 1){if(cal_allow == 1){for(i=0;i<7;i++){seg_copy1[i] = seg_buf[i];/*备份第一次输入的数字 */ seg_buf[i]=0; /*显示清零以准备第二次输入数字*/}funtion_type = Div;counter = 0; /*计数器清零允许第二次计数 */ cal_allow =1; /*再等号按下前不能再按第二次 */ }else{input_allow = 0; /* 禁止按下2 次功能键时候输入数据*/}}/* 如果是“ =”键,则清除显示,清除计算标志*/if(value == 12){for(i=0;i<7;i++){seg_copy2[i] = seg_buf[i];/* 拷贝第二次输入的数字*/}/* 把输入的数字串1 合成运算数字*/Num1 = seg_copy1[6]*100000+seg_copy1[5]*10000+ seg_copy1[4]*1000 +seg_copy1[3]*100+ seg_copy1[2]*10 +seg_copy1[1];/* 把输入的数字串2 合成运算数字*/Num2 = seg_copy2[6]*100000+seg_copy2[5]*10000+ seg_copy2[4]*1000 +seg_copy2[3]*100+ seg_copy2[2]*10 +seg_copy2[1];switch(funtion_type){case Add:Num1 = Num1+Num2;/* break;}case Dec:{if(Num1==Num2) Num1 = 0; else if(Num1>Num2) {Num3 = Num1-Num2;/* Num1 = Num3;}else if(Num2 > Num1) {Num3 = Num2-Num1; Ne_num =1;Num1 = Num3;} break;}case Mut:{Num3 = Num1*Num2;/* 计算结果存在 Num1 中*/ Num1 = Num3;break;}case Div:if(Num1>=Num2&&Num2!=0) {Num3 = Num1/Num2;/* 计算结果存在 Num1 中 */ } 计算结果存在Num1中*/ 计算结果存在Num1中*/Num1 = Num3;break;} default:break;}/* 显示结果*/if(Num1>999999||(Ne_num ==1&&Num1>99999)||Num2 ==0) {for(i=0;i<7;i++){seg_copy1[i]=0;seg_copy2[i]=0;seg_buf[i]=10;/* 显示横杠表示计算溢出错误!*/ }for(i=0;i<5;i++){LedOn(1);LedOn(2);LedOn(3);LedOn(4);delayMs(1,200);LedOff(1);LedOff(2);LedOff(3);LedOff(4);delayMs(1,200);}}else{seg_buf[1] = Num1%10;seg_buf[2] = (Num1%100)/10;seg_buf[3] = (Num1%1000)/100;seg_buf[4] = (Num1%10000)/1000;seg_buf[5] = (Num1%100000)/10000;seg_buf[6] = Num1/100000;if(Ne_num ==1){seg_buf[6] = 10;/* 显示负号*/}}} delayMs(1,200);*********End Of File********************************************************************* ********/七实验现象(1)运行成功以后的计算机界面如图一:图一(2)正确输入6+6=12的现象如图二和图三:图三(3)当进行除操作且除数为0时的现象如图四:图四七实验小结在设计计算机的过程中,我们遇到了很多问题,但是都通过查资料和请教同学得到了解决。

单片机数码管加减程序

单片机数码管加减程序

单片机数码管加减程序数码管加减程序是一种常见的单片机应用程序,用于控制数码管显示数字,并实现加减运算。

本文将从人类视角出发,介绍数码管加减程序的原理和实现方法,帮助读者理解和掌握这一技术。

一、数码管加减程序的原理数码管是一种常见的数字显示装置,由多个发光二极管组成,可以显示0-9的数字。

单片机通过控制数码管的亮灭和显示的数字,实现加减运算的功能。

二、数码管加减程序的实现方法1. 连接电路:首先,需要将数码管连接到单片机的IO口上。

具体的连接方式可以参考数码管和单片机的引脚定义,确保连接正确。

2. 初始化设置:在程序开始时,需要对单片机进行初始化设置,包括设置IO口的输入输出方向和数码管的亮度等参数。

3. 输入数字:接下来,用户可以通过按下按钮或其他输入方式,输入需要进行加减运算的数字。

程序需要读取用户输入的数字,并将其保存在变量中。

4. 加减运算:根据用户输入的数字和加减运算符,进行相应的加减运算。

可以使用单片机的加减指令或函数来实现这一步骤。

5. 显示结果:最后,将运算结果通过数码管显示出来。

可以将结果拆分成多个数字,并依次在数码管上显示。

三、数码管加减程序的应用数码管加减程序广泛应用于计算器、计数器等场景。

通过编程控制数码管的显示,可以实现简单的加减运算,并方便用户进行数字输入和结果显示。

四、总结数码管加减程序是一种常见的单片机应用程序,通过控制数码管的亮灭和显示的数字,实现加减运算的功能。

通过连接电路、初始化设置、输入数字、加减运算和显示结果等步骤,可以实现数码管加减程序的功能。

这一技术在计算器、计数器等场景中有广泛的应用。

希望本文能够帮助读者理解和掌握数码管加减程序的原理和实现方法。

数字逻辑与数字系统课程设计简单计算器

数字逻辑与数字系统课程设计简单计算器

简单计算器一、设计分析1、功能描述设计一个简单0-9数之间的加、减、乘法运算的计算器,,输入和输出均可以显示在数码管上。

2、实现工具1、用VHDL 语言文本形式输入;2、maxplusII行语言编写时序仿真和综合。

二、设计思想采用自顶向下的设计方式,分层进行设计。

设计分为五个模块进行;计算器模块、八位二进制数转化成8421BCD码模块,四选一数据选择器模块,七段显示译码器模块、模4计数器模块、模8计数器块、3—8译码器块。

顶层设计可以完全独立于目标器件芯片物理结构的硬件描述语言。

使用VHDL模型在所综合级别上对硬件设计进行说明、建模和仿真。

1、顶层原原理框图2、具体实现1、计算器模块、2、八位二进制数转化成8421BCD码模块3、四选一数据选择器模块4、七段显示译码器模块5、模4计数器模块6、模8计数器块7、3—8译码器块三、设计过程1、建立工程建立一个Project,命名为jiandanjisuanqi。

将各个模块生成的文件放在同一个文件夹下。

2、文本输入将各个模块的VHDL代码输入,保存并综合。

3、仿真建立各个模块的gdf图,设置输入波形并仿真。

4、顶层原理图输入利用各个模块生成的sym文件建立顶层原理图,编译并仿真。

5、硬件实现实验室提供的器件为FLEX10K,型号为EPF10K10LC84-4,将文件下载到器件当中,在实验箱中进行模拟。

四、整体框图五、VHDL部分代码及说明1、计算器模块、library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity jisuanqi isPort (a,b: in STD_LOGIC_VECTOR (3 downto 0);sel:in STD_LOGIC_VECTOR (1 downto 0); -----加减乘控制端s: out STD_LOGIC_VECTOR (7 downto 0));end jisuanqi;architecture Behavioral of jisuanqi issignal q1 ,q2: STD_LOGIC_VECTOR (3 downto 0);signal q3: STD_LOGIC_VECTOR (7 downto 0);signal q4: STD_LOGIC_VECTOR (1 downto 0);beginq1<=a;q2<=b;q4<=sel;process(q4,q3)begincase q4 iswhen "00" => ----加减乘算法q3<=q1+q2;s<=q3;when "01" =>if(q1>q2)thenq3<= q1-q2;s<=q3;elseq3<=q2-q1;s<=q3;end if;when "10"=>q3<=q1*q2;s<=q3;when "11"=>q3<=q1*q2;s<=q3;when others=>q3<="00000000";s<=q3;end case;end process;end Behavioral;2、八位二进制数转化成8421BCD码模块library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity bcd isPort (s : in STD_LOGIC_VECTOR (7 downto 0);a : out STD_LOGIC_VECTOR (3 downto 0);b : out STD_LOGIC_VECTOR (3 downto 0));end bcd;architecture Behavioral of bcd issignal q0: STD_LOGIC_VECTOR (7 downto 0);signal q1: STD_LOGIC_VECTOR (3 downto 0);signal q2: STD_LOGIC_VECTOR (3 downto 0);beginprocess(s)beginq0<=s;case q0 is ----把八位二进制数转化为8421BCD码when"00000000"=>q1<="0000";q2<="0000";when"00000001"=>q1<="0000";q2<="0001";when"00000010"=>q1<="0000";q2<="0010";when"00000011"=>…………………………….3、四选一数据选择器模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_signed.all;entity mux4_1 isport(d0,d1,d2,d3 :in std_logic_vector(3 downto 0);q :out std_logic_vector(3 downto 0);sel :in std_logic_vector(1 downto 0) );end mux4_1;architecture rtl of mux4_1 isbeginprocess(sel)begin ------实现从四个数据中选择一个出来if(sel = "00") thenq<=d0;elsif(sel = "01")thenq<=d1;elsif(sel = "10")thenq<=d2;elsif(sel = "11")thenq<=d3;end if;end process;end rtl;4、七段显示译码器模块library ieee;use ieee.std_logic_1164.all;entity bcd_7dis isport (bcdm: in std_logic_vector(3 downto 0);a,b,c,d,e,f,g : out std_logic);end bcd_7dis;architecture art of bcd_7dis issignal w : std_logic_vector(6 downto 0);beginprocess(bcdm)begina<=w(6);b<=w(5);c<=w(4);d<=w(3);e<=w(2);f<=w(1);g<=w(0);case bcdm is -----实现8421码转化为2进制码的转换when "0000" =>w<="1111110";when "0001" =>w<="0110000";when "0010" =>w<="1101101";when "0011" =>w<="1111001";when "0100" =>w<="0110011";when "0101" =>w<="1011011";when "0110" =>w<="1011111";when "0111" =>w<="1110000";when "1000" =>w<="1111111";when "1001" =>w<="1111011";when "1100" =>w<="0000001";when others =>w<="0000000";end case;end process;end art;5、模4计数器模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_signed.all;entity mo4 isport(q :out std_logic_vector(1 downto 0);clk :in std_logic);end mo4;architecture rtl of mo4 issignal qcl : std_logic_vector(1 downto 0);beginprocess(clk)begin ----实现模为4的计数if(clk'event and clk = '1')thenif(qcl = "11")thenqcl <= "00";elseqcl <= qcl + '1';end if;end if;q <= qcl;end process;end rtl;6、模8计数器块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity count_8 isport( clk:in std_logic;ql :out std_logic_vector(2 downto 0));end count_8;architecture rt1 of count_8 issignal qcl:std_logic_vector(2 downto 0);beginprocess(clk)begin ---- 实现模8的计数if(clk'event and clk='1') thenif (qcl="111") thenqcl<="000";elseqcl<=qcl+'1';end if;end if;ql<=qcl;end process;end rt1;7、3—8译码器块library ieee;use ieee.std_logic_1164.all;entity decode3_8 isport(d :in std_logic_vector(2 downto 0);y :out std_logic_vector(7 downto 0));end decode3_8 ;architecture rt1 of decode3_8 isbeginprocess(d)begincase d is ------实现3对8的译码when "000"=>y<="10000000";when "001"=>y<="01000000";when "010"=>y<="00100000";when "011"=>y<="00010000";when others=>y<="00000000";end case;end process;end rt1;六、各模块仿真结果1、计算器模块2、八位二进制数转化成8421BCD码模块3.、四选一数据选择器模块4、七段显示译码器模块5、模4计数器模块6、模8计数器块7、3—8译码器块8、整体仿真七、管脚锁定及硬件实现1、管脚锁定2、文件下载将文件下载完后在硬件实验箱中进行仿真检查。

加法和减法运算电路实验报告总结

加法和减法运算电路实验报告总结

加法和减法运算电路实验报告总结
加法和减法运算电路是数字电路中常见的基本电路之一。

本次实验主要目的是通过搭建加法器和减法器电路,实现两个二进制数的加法和减法运算。

通过本次实验,我学到了以下几点:
1. 加法器电路的原理:加法器电路是通过将两个输入数的每一位进行相加,然后进行进位运算,最后得到每一位的和。

根据加法器的不同类型(半加器、全加器等),我们可以得到不同位数的加法器电路。

2. 减法器电路的原理:减法器电路是通过将减数取反后与被减数相加,然后进行进位运算,最后得到每一位的差。

通常将减数进行取反可以简化运算过程。

3. 实验步骤:实验中我按照课本和实验要求进行了电路搭建工作。

首先,分别搭建了加法器和减法器电路,使用逻辑门和触发器实现了相关功能。

然后,通过给定的测试用例检验了电路的正确性。

4. 实验结果:实验中我得到了正确的加法和减法运算结果。

通过观察电路输出与预期结果的一致性,我验证了电路的正确性。

同时,我还注意到了电路的稳定性和可靠性。

5. 实验总结:通过本次实验,我对加法和减法运算电路有了更深入的理解。

我学会了如何搭建这些基本的数字电路,并且能够根据需求进行相应的扩展和改进。

在今后的学习和实践中,我将能够更好地应用这些原理和方法。

总之,本次实验使我对加法和减法运算电路有了更深刻的理解和掌握。

通过实际动手操作,我不仅获得了实验结果,还加深了对数字电路的理论知识的理解,为将来的学习和实践奠定了基础。

简易计算器实训报告(一)

简易计算器实训报告(一)

简易计算器实训报告(一)简易计算器实训报告实训目的本次简易计算器实训的目的在于让学生了解python语言的基本语法和运算符,同时通过实践操作,提升学生的编程思维和实际应用能力。

实训内容本次实训内容主要包括以下方面:1.简易计算器的基本功能:加、减、乘、除。

2.计算器的界面设计与功能实现。

3.错误处理与异常捕获。

实训步骤步骤一:设计计算器界面在本次实训中,我们采用tkinter库来设计计算器的用户界面。

具体步骤如下:1.创建一个窗口;2.在窗口中添加各种按钮和文本框,用于输入和显示计算结果;3.将按钮按照功能分类,为每个按钮设置对应的事件处理函数。

步骤二:实现基本计算功能根据下拉菜单中所选的运算符,我们可以对输入的两个数进行相应的计算。

具体实现方法如下:1.在计算器窗口中添加一个下拉菜单,用于选择运算符;2.根据所选运算符,获取相应的输入数据,并调用对应的计算函数;3.将计算结果输出到窗口中。

步骤三:错误处理与异常捕获在实际应用中,我们不能保证用户输入的一定是数字,所以我们需要对输入做一些错误处理。

具体方法如下:1.在获取用户输入时,先对输入的字符串进行判断,如果用户输入不合法,弹出提示窗口;2.对于除数为0等异常情况进行相应的异常捕获处理,避免程序崩溃。

实训总结通过本次实训,我们学习了python语言的基本语法和运算符,并通过实践操作,学习了tkinter库的使用方法。

通过本次实训,我们还深入了解了计算器的界面设计和功能实现过程。

此外,我们也学会了一些常用的错误处理和异常捕获方法。

未来拓展本次实训只是简易计算器的基本实现,还有很多可以拓展的功能,如:1.添加科学记数法、三角函数、对数函数、平方根等高级数学运算;2.设计多个数字输入框,实现多操作数的计算;3.添加历史记录功能,记录用户计算过程和结果;4.将计算器移植到移动设备或网页上,提供更为便捷的计算服务。

5.添加输入历史记录及回显功能,便于用户查错和复查。

简易计算器实验报告

简易计算器实验报告

目录1.概述 (1)2.系统软件设计 (1)2.1设计目标和实现方法 (1)2.2整体方案论证 (1)3.系统硬件的设计 (2)3.1复位电路的设计 (2)3.2时钟振荡器电路的设计 (3)3.3输入电路的设计 (4)3.4输出电路的设计 (7)4.系统程序的设计与介绍 (9)4.1读键输入程序流程图设计 (9)4.2 LED显示程序流程图设计 (11)4.3主程序流程图设计 (12)5.程序设计体会........................................... . (12)附 1 源程序代码 (14)附 2 计算器电路图 (24)1.概述随着社会的发展, 科学的进步, 人们的生活水平在逐步地提高, 尤其是微电子技术的发展犹如雨后春笋般的变化。

电子产品的更新速度快就不足惊奇了。

计算器在人们的日常中是比较常见的电子产品之一, 如何使计算器技术更加的成熟, 充分利用已有的软件和硬件条件, 设计出更出色的计算器, 使其更好地为各个行业服务, 成了如今电子领域重要的研究课题。

1、现如今, 人们的日常生活中已经离不开计算器了, 社会的各个角落都有它的身影, 比如商店、办公室、学校……因此设计一款简单实用的计算器会有很大的实际意义。

2、本设计旨在进一步掌握单片机理论知识, 理解嵌入式单片机系统的硬软件设计, 加强对实际应用系统设计的能力。

通过本设计的学习, 使我掌握单片机程序设计和微机接口应用的基本方法, 并能综合运用本科阶段所学软、硬件知识分析实际问题, 提高解决毕业设计实际问题的能力, 为单片机应用和开发打下良好的基础。

对字符液晶显示模块的工作原理, 如初始化、清屏、显示、调用及外特性有较清楚的认识, 并会使用LCD(液晶显示模块)实现计算结果的显示;掌握液晶显示模块的驱动和编程, 设计LCD和单片机的接口电路, 以及利用单片机对液晶显示模块的驱动和操作;在充分分析内部逻辑的概念, 进行软件和调试, 学会使用, 并能够以其为平台设计出具有四则运算能力简易计算器的硬件电路和软件程序。

毕业设计简易加减乘除计算器

毕业设计简易加减乘除计算器

毕业设计题目简易加减乘除计算器系别专业班级姓名学号指导教师日期设计任务书设计题目:简易加减乘除计算器设计要求:1.根据所学内容运用编程做一个简易加减乘除计算器,实现加、减、乘、除、等以及清零的功能。

2.设置一组数码管, 使其能够显示程序运行,按键动作的内容。

3.设置一组按键,使其键依次对应0——9、“+”、“-”、“*”、“/”、“=”和清除键。

4.可以进行小于255的数的加减乘除运算,并可连续运算。

当键入值大于255时,将自动清零,可重新输入。

设计进度要求:第一周:确定题目,寻找单片机和计算器设计的相关资料;第二周:读懂资料,有初步的设计思路;第三周:绘制硬件电路图;第三周:设计软件框图;第四周:相应软件设计(程序设计);第五周:进行程序调试并且修改;第六周:写毕业设计论文;第七周:修改并提交毕业设计;第八周:准备论文答辩;指导教师(签名):摘要在很多领域的数据处理中要用到数学运算,作为计算机自动处理系统更显得重要。

此项目设计以单片机为核心部件的计算器,采用4*4矩阵式键盘,16个键依次对应0——9、“+”、“-”、“*”、“/”、“=”和清除键。

使用单片机最小应用系统1模块,简单方便。

采用静态显示,显示器由5个共阴极数码管组成。

输入只有两个信号,它们是串行数据线DIN和移位信号CLK。

5个串/并行移位寄存器芯片74LS164首尾相连。

每片的并行输出作为LED数码管的段码。

本计算器系统简单,实用性强,成本低,使用维护方便,软件功能强,运行稳定可靠等优点。

关键词:单片机,计算器,键盘,静态显示前言随着半导体集成工艺的不断发展,单片机的集成度将更高、体积将更小、功能将更强。

在单片机家族中,80C51系列是其中的佼佼者,加之Intel公司将其MCS –51系列中的80C51内核使用权以专利互换或出售形式转让给全世界许多著名IC制造厂商,如Philips、 NEC、Atmel、AMD、华邦等,这些公司都在保持与80C51单片机兼容的基础上改善了80C51的许多特性。

简易加减计算器设计(数电)

简易加减计算器设计(数电)

电子技术课程设计电气与信息工程学院建筑电气与智能化专业题目:简易加减计算器设计姓名:徐雪娇学号:094412110指导教师:祁林简易加减计算器设计一、设计目的1、在前导验证性认知实验基础上,进行更高层次的命题设计实验.2、在教师指导下独立查阅资料、设计、特定功能的电子电路。

3、培养利用数字电路知识,解决电子线路中常见实际问题的能力.4、积累电子制作经验,巩固基础、培养技能、追求创新、走向实用。

5、培养严肃认真的工作作风和严谨的科学态度。

二、设计要求1、用于两位一下十进制的加减运算。

2、以合适方式显示输入数据及计算结果。

三、总体设计第一步置入两个四位二进制数。

例如(1001)2,(0011)2和(0101)2,(1000)2,同时在两个七段译码显示器上显示出对应的十进制数9,3和5,8。

第二步通过开关选择加(减)运算方式;第三步若选择加运算方式所置数送入加法运算电路进行运算;同理若选择减运算方式,则所置数送入减法运算电路运算;第四步前面所得结果通过另外两个七段译码器显示。

即:方案一通过开关J1-J8接不同的高低电平来控制输入端所置的两个一位十进制数,译码显示器U10和U13分别显示所置入的两个数。

数A直接置入四位超前进位加法器74LS283的A4-A1端,74LS283的B4-B1端接四个2输入异或门。

四个2输入异或门的一输入端同时接到开关S1上,另一输入端分别接开关J5-J8,通过开关J5-J8控制数B的输入。

当开关S1接低电平时,B与0异或的结果为B,通过加法器74LS283完成两个数A和B的相加。

当开关J1接高电平时,B与1异或的结果为B非,置入的数B在74LS283的输入端为B的反码,且74LS283的进位信号C0为1,其完成S=A+B(反码)+1,实际上其计算的结果为S=A-B完成减法运算。

由于译码显示器只能显示0-9,所以当A+B>9时不能显示,我们在此用另一片芯片74LS283完成二进制码与8421BCD码的转换,即S>9(1001)时加上6(0110)2,产生的进位信号送入译码器U12来显示结果的十位,U11 2显示结果的个位。

web简单计算器自我评析和总结

web简单计算器自我评析和总结

web简单计算器自我评析和总结
实验任务:
根据计算器的原理设计一个具有加减乘除功能的简易计算器实验基本要求:
1、实现最大输入两位十进制数字的四则运算。

2、能够实现多次连算。

3、最大长度以数码管最大个数为限,溢出报警。

实验设计方案总结:
1、用QuartusII的原理图输入来完成系统的顶层设计。

2、用VHDL编写以及直接拖模块来各功能模块。

3、通过2个脉冲分别实现个位数和十位数的输入。

4、通过选择每次的输出数值,将输出值反馈到运算输入端
5、通过除法运算实现十六进制到十进制的转换输出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数码管之简单加减法计算器--项目总结总结人:徐冉1.项目使用到的硬件板载资源1)单片机STC89C52RC作为系统的处理器2)6位共阳极数码管作为计算器的数字显示器件3)LCD1602液晶显示一些提示信息如计算时的符号(正/负)4)4*4矩阵按键作为计算器的数字输入设备5)8个贴片LED小灯,用于走马灯效果作为修饰6)用到了单片机的内部资源定时器T02.项目的基本功能通过程序的烧录,将工程中的hex文件烧录到Kingst-51开发板上。

现象如下:初始时1)最右边的数码管上显示0,其余数码管不显示。

2)五个LED小灯像小火车一样循环跑着。

3)LCD1602液晶的左上角显示Symbol:字样,用于显示符号。

正数不显示,负数时将显示‘-’。

进行简单的加减法运算当用户使用按键输入相应的数字时,会在数码管上显示。

数字值将进行进位累加方式实现。

数字键(k13 k1 ~ k3 k5 ~ k7 k9 ~ k11 0 ~ 9),k4加法功能键,k12减法功能键,k14 ESC清零键,k4和k12是双功能键,即k4既是加法键也是计算键,k12既是减法键也是计算键。

达到一键两用的效果。

注意:用户在进行加法计算时可以随意计算,但在计算减法时第一步需要进行一次加法,然后才能进行减法运算。

当计算结果是负数时会在数码管上显示相应的数值的绝对值,而在LCD1602液晶上显示‘-’。

在计算期间LED 小灯会一直循环流动。

这个计算器可以实现连加连减,计算十分方便,但没有处理小数。

当计算完成时,或输入错误时可按k14进行清零操作。

3.项目的创新点首先该项目使用了LED 的跑马灯效果进行了装饰,为了程序的简单且直观性程序使用了LCD1602进行运算时符号的显示。

程序在计算上使用了一键两用的功能设计,这样设计方便快捷。

4.项目的设计流程NY上电LCD1602液晶初始化74HC138译码器初始化配置定时器T0定时1ms 中断Lcd1602初始化显示Symbol主函数while 循环进行按键动作检测1ms 到按键扫描LED 小灯&数码管扫描结束5.项目的不足之处本项目只考虑了简单的加法和减法运算,且只是整数运算,而未能考虑到小数运算。

乘除法亦没有考虑到。

在进行减法运算时都必须进行一次加法运算才可以运算正常。

6.项目需要改进的地方可对本项目进行全面的扩展,使其既能进行加减乘除运算,又能处理小数和负数的功能。

符号显示直接使用数码管显示即可。

将计算功能键单独进行处理,做成真正的计算器。

7.项目的硬件电路连接图8.项目的源代码/*********************************************************************************** @file mytype.h* @author qlp* @date 2014年6月18日* @version V1.2.3* @brief 自定义类型头文件******************************************************************************** */#ifndef _MYTYPE_H_H#define _MYTYPE_H_Htypedef unsigned char uint8;typedef unsigned int uint16;typedef unsigned long uint32;#endif //_MYTYPE_H_H/************************************************************************** @file Lcd1602.c* @author qlp* @date 2014年6月18日* @version V1.2.3* @brief LCD1602液晶底层驱动************************************************************************/#include <reg52.h>//LCD1602_IOsbit LCD1602_RS = P1^0;sbit LCD1602_RW = P1^1;sbit LCD1602_EN = P1^5;//74HC138sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;sbit ENLED = P1^4;bit tmpADDR0 = 0;bit tmpADDR1 = 0;//地址选择缓冲区#define LCD1602_DB P0/*暂停LED扫描*/void LEDRefreshPause(){ENLED = 1;//关闭LED使能tmpADDR0 = ADDR0;//因为LED和LCD同时使用了P1^0和P1^1引脚,所以要暂时保存ADDR0和ADDR1的数据即LED扫描地址值tmpADDR1 = ADDR1;P0 = 0xFF; //数码管+LED小灯去抖动}/*继续扫描LED*/void ContinueRefreshLED(){ADDR0 = tmpADDR0;ADDR1 = tmpADDR1;//恢复原来LED扫描的地址选择值ENLED = 0;//选择LEDP0 = 0xFF; //数码管和LED去抖}/* 液晶忙碌等待 */void LCD1602Wait(){unsigned char sta;LCD1602_DB = 0xFF;//总线拉高,检测液晶状态字LCD1602_RS = 0;LCD1602_RW = 1;do{LCD1602_EN = 1;sta = LCD1602_DB;LCD1602_EN = 0;//避免液晶输出数据} while (sta & 0x80);//状态字最高位STA7 == 0空闲,1忙碌}/* 液晶写命令 */void LCD1602WriteCmd(unsigned char cmd){LEDRefreshPause(); //暂停LED数码管刷新LCD1602Wait();LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_EN = 0;LCD1602_DB = cmd;LCD1602_EN = 1;LCD1602_EN = 0;ContinueRefreshLED();//继续LED数码管刷新}/* 液晶写数据 */void LCD1602WriteData(unsigned char dat){LEDRefreshPause(); //暂停LED数码管刷新LCD1602Wait();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_EN = 0;LCD1602_DB = dat;LCD1602_EN = 1;LCD1602_EN = 0;ContinueRefreshLED();//继续LED数码管刷新}/* 液晶初始化 */void InitalLCD1602(){LCD1602WriteCmd(0x38);LCD1602WriteCmd(0x0C);LCD1602WriteCmd(0x06);LCD1602WriteCmd(0x01);//清屏}/* 写数据到液晶上,字符串str,坐标(x, y),地址addr */void LcdShowStr(unsigned char x, unsigned char y, unsigned char * str){unsigned char addr;if (y == 0){addr = 0x00 + x;}else{addr = 0x40 + x;}LCD1602WriteCmd(addr | 0x80);while (*str != '\0'){LCD1602WriteData(*str++);}}/********************************************************************************** * @file main.c* @author qlp* @date 2014年6月18日* @version V1.2.3* @brief 简易加减法可实现连加连减* @note 单片机STC89C52RC MCU 晶振 11.0592MHZ******************************************************************************** */#include <reg52.h>#include <intrins.h>#include "mytype.h"//74HC138sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;sbit ENLED = P1^4;//时钟晶振和系统时钟#define XTAL 11059200UL //11.0592MHZ#define SYS_XTAL XTAL/12 //系统时钟,为晶振的12分频//按键输入输出sbit KEY_IN_1 = P2^4;sbit KEY_IN_2 = P2^5;sbit KEY_IN_3 = P2^6;sbit KEY_IN_4 = P2^7;sbit KEY_OUT_1 = P2^3;sbit KEY_OUT_2 = P2^2;sbit KEY_OUT_3 = P2^1;sbit KEY_OUT_4 = P2^0;bit flag = 0;//0 : add 1 : sub//按键状态枚举typedef enum {KEY_DOWN = 0, KEY_UP = 1} ekey;//数据输入口#define DISP_DB P0static volatile uint8 keySta[4][4] = {{1, 1, 1, 1},{1, 1, 1, 1},{1, 1, 1, 1},{1, 1, 1, 1}}; //按键当前值/*矩阵按键到PC标准键盘键码映射表*/uint8 code keyCodeMap[4][4] = {{0x01, 0x02, 0x03, 0x0A}, //数字键1-3 向上键UP{0x04, 0x05, 0x06, 0x0D}, //数字键4-6 向左键Left{0x07, 0x08, 0x09, 0x0C}, //数字键7-9 向下键DOWN{0x00, 0x0E, 0x0F, 0x0B} //数字键0 ESC键回车键向右键Right };uint8 code LedTable[] = {0xC0, //"0"0xF9, //"1"0xA4, //"2"0xB0, //"3"0x99, //"4"0x92, //"5"0x82, //"6"0xF8, //"7"0x80, //"8"0x90, //"9"0xBF //"-"};/* 定义跑马灯数组 */unsigned char code LedTable2[] = {0xE0, // 111000000xC1, // 110000010x83, // 100000110x07, // 000001110x0E, // 000011100x1C, // 000111000x38, // 001110000x70 // 11100000};uint8 LedBuff[7] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//数码管显示缓冲区uint8 thr0, tlr0;//定义用于加法计算的变量signed long result = 0;//结果signed long addNum = 0;//加数void KeyHandle();void KeyAction(uint8 keycode);void KeyScan();void showNum(uint32 num);void ConfigHC138();void ConfigTimer0(uint16 xms);extern void InitalLCD1602();extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char * str);void main(){InitalLCD1602();ConfigHC138();ConfigTimer0(1);LcdShowStr(0, 0, "Symbol: ");//符号while (1){KeyHandle();}}/*** @brief : Led小灯扫描* @param : 无* @retval : 无*/void LED_Scan( void ){static unsigned char j = 0;P0 = 0xFF; /* 消隐 */LedBuff[6] = LedTable2[j++]; /* 送入要求的数据到LED显示数据口 */ j &= 0x07; /* 到8归零 */}/*** @brief 定时器T0配置* @param xms* @retval 无*/void ConfigHC138(){ADDR3 = 1;ENLED = 0;LedBuff[0] = LedTable[0];}/*** @brief 定时器T0配置* @param xms* @retval 无*/void ConfigTimer0(uint16 xms){uint16 tmp;tmp = 65536-xms*SYS_XTAL/1000;thr0 = (uint8)(tmp >> 8);tlr0 = (uint8)(tmp & 0x00FF);TMOD &= 0xF0;TMOD |= 0x01;TH0 = thr0;TL0 = tlr0;TR0 = 1;EA = 1;ET0 = 1;}/*** @brief 按键驱动函数 (根据按下的按键的键码执行相应的动作)* @param 无* @retval 无*/void KeyHandle(){static uint8 backup[4][4] = {{1, 1, 1, 1},{1, 1, 1, 1},{1, 1, 1, 1},{1, 1, 1, 1}}; //按键备份值uint8 i = 0, j = 0;for (i = 0; i < 4; i++)for (j = 0; j < 4; j++){if (keySta[i][j] != backup[i][j]){if (backup[i][j] == KEY_DOWN){ //按键弹起KeyAction(keyCodeMap[i][j]);//调用按键动作函数,根据按下的按键的键码执行相应的操作}backup[i][j] = keySta[i][j];//备份按键值}}}/*** @brief 按键动作函数 (根据按下的按键的键码执行相应的动作)* @param 按下按键的键码 uint8 keycode* @retval 无*/void KeyAction(uint8 keycode){if (result >= 0){LcdShowStr(9, 0, " ");//清除}else{}if ((keycode >= 0x01) && (keycode <= 0x09)) //keycode 键码是0-9的按键{addNum = (addNum * 10) + (keycode - 0x00);//将原来的加数扩大十倍后,在加上用户按下的数字,即为用户输入的加数showNum(addNum);//数据分解}else if (keycode == 0x0A) //向上键 +{//将上一个加数+到result中result += addNum;//可以实现连加addNum = 0;showNum(result);//分解并显示结果}else if (keycode == 0x0C) //向下键 - {result -= addNum;//连减addNum = 0;if (result >= 0){showNum(result);}else{result = -result;LcdShowStr(9, 0, "-");showNum(result);result = 0;}}else if (keycode == 0x0E) //ESC键{result = 0;addNum = 0;//清零showNum(addNum);LcdShowStr(9, 0, " ");//清除}else if (keycode == 0x0F) //回车键{addNum = 0;showNum(result);}}/*** @brief 数据分解,只显示有效位* @param 待分解的数据 uint32 num* @retval 无*/void showNum(uint32 num){uint8 buff[6];//中间缓冲区signed char i = 0;for (i = 0; i < 6; i++){buff[i] = num % 10;//取最低位数字num /= 10;//num缩小10倍}//去掉无效位,不显示0for (i = 5; i >= 1; i--) //从最高位开始检测无效位,遇0就赋值0xFF{if (buff[i] == 0){LedBuff[i] = 0xFF;//不显示}else{break;//遇到第一个有效位就退出}}//将有效位数字存入缓冲区for (; i >= 0; i--){LedBuff[i] = LedTable[buff[i]];}}/*** @brief 按键检测* @param 无* @retval 无*/void KeyScan(){static uint8 keybuff[4][4] = {{0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF}}; //按键检测值缓冲区static uint8 keyout = 0;//行索引uint8 i = 0;keybuff[keyout][0] = (keybuff[keyout][0] << 1) | KEY_IN_1;//检测第keyout行的第0个按键的值keybuff[keyout][1] = (keybuff[keyout][1] << 1) | KEY_IN_2;keybuff[keyout][2] = (keybuff[keyout][2] << 1) | KEY_IN_3;keybuff[keyout][3] = (keybuff[keyout][3] << 1) | KEY_IN_4;//更新消抖后的按键值for (i = 0; i < 4; i++){if ((keybuff[keyout][i] & 0x1F) == 0x1F) //五次连续检测都是1{keySta[keyout][i] = KEY_UP;}else if ((keybuff[keyout][i] & 0x1F) == 0x00) //五次连续检测都是0{keySta[keyout][i] = KEY_DOWN;}}keyout++;//行++if (keyout >= 4)keyout = 0;switch (keyout){case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;default : break; //只有一行被选中}}/*** @brief LED数码管刷新* @param 无* @retval 无*/void refresh(){static uint8 j = 0;DISP_DB = 0xFF;//消隐switch (j){case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; break;case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; break;case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; break;case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; break;case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; break;case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; break; case 6: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; break;default: break;}DISP_DB = LedBuff[j++];if (j >= 7){j = 0;}}/*** @brief 定时器T0中断服务* @param 无* @retval 无*/void timer0_ISP() interrupt 1{static unsigned char counter = 0;TH0 = thr0;TL0 = tlr0;counter++;if (counter >= 200){counter = 0;LED_Scan();}KeyScan();//按键检测refresh();//数码管刷新}于2014年6月25日23:40:29。

相关文档
最新文档