目 录
摘 要……………………………………………………………………………2
引 言……………………………………………………………………………3
- 系统整体概述 ………………………………………………………4
- 硬件设计……………………………………………………………6
- 软件设计 ……………………………………………………………9
- 调试与分析…………………………………………………………13
- 制作感受 …………………………………………………………14
附录……………………………………………………………………………15
摘 要近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。
计算器在人们的日常生活中是比较常见的电子产品之一。可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计是用AT89C51单片机、LCD液晶显示器、控制按键等为元件来设计的计算器。利用此设计熟悉单片机微控制器及C语言编程,对其片资源及各个I/O端口的功能和基本用途的了解。掌握Microsoft Visual C++ 6.0及Keil软件应用程序开发环境,常用的LCD显示器的使用方法和一般键盘的使用方法。
引言
当今社会,随着人们物质生活的不断提高,电子产品已经走进了家家户户,无论是生活或学习,还是娱乐和消遣几乎样样都离不开电子产品,大型复杂的计算能力是人脑所不能胜任的,而且比较容易出错。计算器作为一种快速通用的计算工具方便了用户的使用。计算器可谓是我们最亲密的电子伙伴之一。计算器一般由运算器、控制器、存储器、键盘、显示器、电源和一些可选外围设备及电子配件通过人工或机器设备组成。键盘是计算器的输入部件,一般采用接触式或传感式。为减小计算器的尺寸,一键常常有多种功能。显示器是计算器的输出部件,有发光二极管显示器和液晶显示器等。除显示计算结果外,还常有溢出指示、错误指示等。
人们利用计算器代替了许多复杂计算,包括加减乘除和其他运算。尤其是小型计算器,它携带方便,在生活中用起来方便快捷,成为了财政、学习、生意上都青睐的必需品。它的需求广泛,在计算器的发展上存在很大的空间和市场意义。单片机在我国的各行各业得到了广泛使用,单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心。如今,它已经广泛应用到我们生活中的各个领域,用单片机可以很方便的实现计算器的设计。
众所周知单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统。单片机由于其微小的体积和极低的成本,广泛的应用于家用电器、工业控制等领域中。在工业生产中。单片微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
第一章 系统整体概述
1.1 设计目的应用《单片机应用基础》、《计算机应用基础》等所学相关知识及查阅资料,完成简易计算器的设计,以达到理论与实践更好的结合、进一步提高综合运用所学知识和设计的能力的目的。
通过本次设计的训练,可以使我在基本思路和基本方法上对基于MCS-51单片机的嵌入式系统设计有一个比较感性的认识,并具备一定程度的设计能力。
主要完成如下方面的设计任务:
1、简要阐述单片机技术发展的国内外现状及LED动态显示和矩阵键盘基本原理;
2、掌握MCS-51系列某种产品(例如8051)的最小电路及外围扩展电路的设计方法;
3、了解单片机数据转换功能及工作过程;
4、完成主要功能模块的硬件电路设计及必要的参数确定.
1.2 计算器设计总体思想根据功能和指示要求,本系统选用以51单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。
具体设计如下:
1、由于要设计的是简单的计算器,可以进行四则运算,为了得到教好的显示效果,采用LCD显示数据和结果。
2、另外键盘包括数字键(0-9)、符号键(+、-、*、/)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算机键盘。
3、执行程序:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。
4、错误提示:当单片机执行程序中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算器得到的结果大于计算器的显示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD上提示错误。
1.3系统的组成
计算器设计硬件电路采用三部分电路模块构成,第一部分是键盘模块电路,采用4*4矩阵式键盘作为输入电路;第二部分是LCD1602液晶显示模块;第三部分是以51单片机作为控制核心。软件程序主要由三部分组成:主程序、按键扫描程序和LCD1602显示程序。
图片在51hei附件中
图 系统组成及总体框图
本系统就是充分利用了8051芯片的I/O引脚。系统以采用MCS-51系列单片机Intel8051为中心器件来设计计算器控制器,实现了能根据实际输入值显示并存储的功能,计算程序则是参照教材。
本计算器是以MCS-51系列8051单片机为核心构成的简易计算器系统。该系统通过单片机控制,实现对4*4键盘扫描进行实时的按键检测,并把检测数据存储下来。整个计算器系统的工作过程为:首先存储单元初始化,显示初始值和键盘扫描,判断按键位置,查表得出按键值,单片机则对数据进行储存与相应处理转换,之后送入LED显示器动态显示。整个系统可分为三个主要功能模块:功能模块一,实时键盘扫描;功能模块二,数据转换成显示器显示;功能模块三,显示器动态显示。
第二章 硬件系统设计硬件系统是指构成微机系统的实体和装置,通常由运算器、控制器、存储器、输入接口电路和输入设备、输出接口电路和输出设备等组成。单片机实质上是一个硬件的芯片,在实际应用中,通常很难直接和被控对象进行电气连接,必须外加各种扩展接口电路、外部设备、被控对象等硬件和软件,才能构成一个单片机应用系统。本设计选用以AT89S51单片机为主控单元。显示部分:采用LCD静态显示。按键部分,采用4*4键盘。 硬件电路原理图如图2.1所示:
图2.1 硬件电路原理图
2.1 键盘接口电路计算机输入数字和其他功能按键时要用到很多按键,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这样的方式,而是采用矩阵键盘的方式。矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的数量就为4*4个。这样行列式键盘结构能有效的提高单片机系统中I/O口的利用率。
计算器的键盘布局如图2.2所示:一般有16个键组成,在单片机中正好有一个P端口实现16个按键功能,这种形式在单片机系统中最常用。
图2.2 矩阵键盘内部电路
2.2 LCD显示模块本设计采用LCD液晶显示器来显示输出数据。LCD的特性有:1、+5V电压,对比可调度;2、内含复位电路;3、提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;4、有80字节显示数据存储器DDRAM;5、内建有160个5X7点阵的字型的字符发生器CGROM;6、8个可由用户自定义的5X7的字符发生器CGRAM。
本设计通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应的数据。其接口电路如图2.3所示。
图2.3 LCD接口电路
LCD的引脚说明如表2.1所示:
表2.1 LCD的引脚说明
2.3 运算模块MCS-51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等计算机所需要的基本功能部件。如果按功能划分,它由以下功能部件组成,即微处理器(CPU),数据存储器(RAM),程序存储器(ROM/EPROM),并行I/O口,串行口,定时器/计数器,中断系统及特殊功能寄存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的一些功能,通过使用单片机编写的程序可以实现高智能、高效率以及高可靠性,因此采用单片机作为计算器的主要功能部件,可以很快的实现运算功能。
运算模块由键盘和显示屏组成。单片机通过按键来实现输入数据和操作方式的控制,在运算过程中,对所设的数据进行四则运算时,要先确定选用的是哪一个运算符,若是+或*,则要判断结果是否会溢出,溢出则显示错误提示,没有溢出则显示运算结果,若是/,则要判断除数是否为零,为零时显示错误提示,不为零显示运算结果。
第三章 软件设计
3.1 语言的特点及选择本设计是硬件电路和软件编程相结合的设计方案,选择合适的编程语言是一个重要的环节。在单片机的应用系统程序设计时,常用的是汇编语言和C语言。机硬件,程序可读性和可移植性比较差。而C语言虽然执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。
由于现在单片机的发展已经达到了很高的水平,内部的各种资源相当的丰富,CPU的处理速度非常的快。用C语言来控制单片机无疑是一个理想的选择。所以在本设计中采用C语言编写软件程序。主程序的设计详见附录三。
3.2 键扫程序设计键扫程序的过程为:开始时,先判断是否有键闭合,无键闭合时,返回继续判断,有键闭合时,先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭合,若有键按下,则判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回继续释放。其流程图如图3.1所示。
图3.1 键扫程序流程图
3.3 算术运算程序设计算术运算程序的过程为:先判断输入的运算符是+、-、*、/ 中的哪一个,若是+或-,则要判断运算结果是否溢出,溢出则显示错误信息,没溢出就显示运算结果,若是/,则要先判断除数是否为零,为零就显示错误信息,不为零则显示运算结果,若是-,则直接显示运算结果。其流程图如图3.2所示。
图3.2 算术运算程序设计流程图
3.4 显示程序设计显示程序的过程为:显示开始时,先进行LCD的初始化,判断是否显示汉字或ACSII码或图形,若不显示,则返回,若显示的是汉字或ACSII码,则进行相应功能的设置,然后送地址和数据,再判断是否显示完,显示完则返回,没有显示完则继续送地址,若显示的是图形,则先进行相应功能的设置,再送行地址和列地址,然后送数据,最后判断是否显示完,显示完则返回,没有显示完则继续送行地址和列地址。其流程图如图3.3所示。
图3.3 显示程序流程图
第四章 调试与分析
4.1 硬件调试常见故障:
1、逻辑错误:它是由设计错误或加工过程中的工艺性错误所造成的。这类错误包括错线、开路、短路等。
2、元器件失效:有两方面的原因:一是器件本身已损坏或性能不符合要求;二是组装错误造成元件失效,如电解电容、集成电路安装方向错误等。
3、可靠性差:因其可靠性差的原因很多,如金属化孔、接插件接触不良会造成系统时好时坏,经不起振动;走线和布局不合理也会引起系统可靠性差。
4、电源故障:若样机由电源故障,则加电后很容易造成器件损坏。电源故障包括电压值不符合设计要求,电源引线和插座不对,功率不足,负载能力差等。
调试方法:包括多级调试和联机调试。在调试过程中要针对可能出现的故障认真分析,直至检查出原因并排除。
本次硬件调试过程中,对所出现的问题进行了认真的分析和改正,最后能够很好的达到设计要求的效果。
4.2 软件调试软件调试分为以下四个阶段:1、 编写程序并查错;2、在C语言的编译系统中编译源程序3、对程序进行编译连接,并及时发现程序中存在的错误;4、改正错误。
在本次调试中出现的问题有:
1、在程序中有的函数名未定义;
2、在抄录程序时,少录入一些字符,如:“;”、“{”、“-”等符号,而出现错误;
3、有一些函数名录入时少写一个字母或顺序颠倒;
4、没有注意函数名的调用及定义;
5、芯片引脚定义出错而导致没有实验现象。
在软件调试过程中,对出现的错误进行了认真的分析和修改,多次调试成功后,能够很好的达到既定的设计效果。
第五章 制作感受通过这个作品的设计,收获颇多,当我开始准备做单片机作品设计的时候,设计什么都是我十分困惑的,无意中室友找我借计算器去考试,灵感就来了,没错就设计计算器了,于是便搜集各种关于计算器的相关资料。开始感觉设计出来应该会很难,不过,经过不断地努力之后,了解计算器的工作原理,设计计算器的电路原理图和实物图,然后便到网上买需要的电子元器件了,经过一些时日各种东西都已准备齐全,说干就干,按照原理图一步步进行焊接。做起来越来越来劲,感觉很有趣的样子,都说兴趣是最好的老师,果然没错。
当我刚刚做完这个作品第一次进行功能运行的时候,没有成功,当时心里有些无奈,经过几天的布线焊接最终却没成功,有点点小失落。当然不是每个人都能一次就能做成的,便进行各种检查调试,经过几番周折最后勉强能实现功能了,但是还有些不尽人意,不过当时已有一种成功的喜悦感了。再经过不断地进行修改完善,终于达到了我想要的效果,这时的我感觉自己棒棒哒,自己也能做出计算器了。这个过程中除了学到知识以外,还感受到了坚持努力最终就会取得自己想要的成绩。
附录
附录一:计算器proteus仿真图
附录二:元器件清单
1 | 10uf | 直插电解电容 | 1 |
2 | 30P | 直插瓷片电容 | 2 |
3 | 10K | 9脚排阻 | 1 |
4 | LCD1602 | LCD1602液晶显示器 | 1 |
5 | POWER | DC电源插座 | 1 |
6 | 2.2k | 色环电阻 | 1 |
7 | 10K | 2 |
8 | SW-PB | 按键6X6X5MM | 17 |
9 | SWITCH | 自锁开关 | 1 |
10 | STC89C51/52 | 51单片机 | 1 |
11 | 12MHZ | 晶振 | 1 |
12 | 导线 | XXcm | 1 |
13 | 焊锡 | XXcm | 1 |
14 | USB转DC3.5mm电源线 | 系统供电 | 1 |
15 | 9*15万用板 |
| 1 |
16 | 单片机插座 | 40脚IC座 | 1 |
17 | DC电源头 | DC插头 3.5-1.35MM | 1 |
18 | LCD1602插座 | 16P排母 | 1 |
19 | LCD1602引出脚 | 16P排针 | 1 |
附录三:源程序
- /*
- 接盘按键说明:
- --------------------------------------------------
- | 1 | 2 | 3 | + |
- - - - - - - - - - - - - -
- | 4 | 5 | 6 | - |
- - - - - - - - - - - - - -
- | 7 | 8 | 9 | * |
- - - - - - - - - - - - - -
- | C | 0 | = | / |
- --------------------------------------------------*/
- //操作简介
- // 按第一个数,再按'+-*/',再按'='显示出结果,然后按C清屏
- // 加最大9999+9999=19998
- // 减最大9999-0 =9999
- // 乘最大9999*9999=99980001
- // 除 1/9=0.1111 保留小数点后4位
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- //--------LCD1602-------------------
- //P00-07==== D0-7
- sbit rs=P2^5; //指令or数据
- sbit wela=P2^6; //读or写
- sbit lcden=P2^7; //使能信号
- //--------LCD1602-------------------
- //--------KEY-----------------------
- //P1口
- //--------KEY-----------------------
- uchar code table[]= " ";
-
- long int data_a,data_b; //第一个数和第二个数
- long int data_c; //计算结果
-
- uchar dispaly[10]; //显示缓冲
-
- //************************************************************************/
- // 描述: 延时t us函数
- //************************************************************************/
- void LCD_Delay_us(unsigned int t)
- {
- while(t--); //t=0,退出
- }
- //************************************************************************/
- // 描述: 延时t ms函数
- //************************************************************************/
- void LCD_Delay_ms(unsigned int t)
- {
- unsigned int i,j;
- for(i=0;i<t;i++) //执行t次循环
- for(j=0;j<113;j++) //执行113次循环
- ;
- }
- //************************************************************************/
- // 描述: 1602液晶写指令
- //************************************************************************/
- void write_com(uchar com) //1602液晶写指令
- {
- rs=0; //写指令
- lcden=0; //使能1602
- P0=com; //写入指令com
- LCD_Delay_ms(1); //延时1ms
- lcden=1; //使能1602
- LCD_Delay_ms(2); //延时2ms
- lcden=0; //使能1602
- }
- //************************************************************************/
- // 描述:1602液晶写数据
- //************************************************************************/
- void write_date(uchar date) //1602液晶写数据
- {
- rs=1; //写数据
- lcden=0; //使能1602
- P0=date; //写入数据date
- LCD_Delay_ms(1); //延时1ms
- lcden=1; //使能1602
- LCD_Delay_ms(2); //延时2ms
- lcden=0; //使能1602
- }
- //************************************************************************/
- // 描述:指定x,y写入字符函数
- //************************************************************************/
- void W_lcd(unsigned char x,unsigned char y,unsigned char Data)
- {
- if (y == 0){write_com(0x80 + x);} //第一行
- else{write_com(0xc0 + x);} //第二行
- write_date( Data); //写入数据
- }
- //指定x,y写入字符串函数
- void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
- {
- if (y == 0){write_com(0x80 + x);} //第一行
- else{write_com(0xC0 + x);} //第二行
- while (*s) //
- {write_date( *s); s++;} //写入数据
- }
- //************************************************************************/
- // 描述:初始化液晶,及画面初始化
- //************************************************************************/
- void init_lcd(void) //初始化液晶,及画面初始化
- {
- wela=0; //写液晶
- lcden=0; //使能1602
- write_com(0x38); //8 位总线,双行显示,5X7 的点阵字符
- LCD_Delay_us(100); //延时100us
- write_com(0x0c); //开显示,无光标,光标不闪烁
- write_com(0x06); //光标右移动
- write_com(0x01); //清屏
- write_com(0x80); //DDRAM 地址归0
- }
- //************************************************************************/
- // 描述: 反转法键盘扫描
- //************************************************************************/
- short keycheckdown() /* 反转法键盘扫描 */
- {
-
- short temp1,temp2,temp,a=0xff;
- P1=0xf0; /* 输入行值(或列值) */
- LCD_Delay_ms(20); /* 延时 */
- temp1=P1; /* 读列值(或行值) */
- P1=0xff;
- LCD_Delay_ms(20); /* 延时 */
- P1=0x0f; /* 输入列值(或行值) */
- LCD_Delay_ms(20); /* 延时 */
- temp2=P1; /* 读行值(或列值) */
- P1=0xff;
- temp=(temp1&0xf0)|(temp2&0xf); /* 将两次读入数据组合 */
- switch(temp) /* 通过读入数据组合判断按键位置 */
- {
-
-
- case 0x77 :a=0x0d;break;// 按键/
- case 0x7b :a=0x0e; break;// 按键=
- case 0x7d :a=0; break;// 按键0
- case 0x7e :a=0x0f; break;// 按键CE
-
- case 0xb7 :a=0x0c;break;// 按键*
- case 0xbb :a=0x9;break; // 按键9
- case 0xbd :a=0x8;break; // 按键8
- case 0xbe :a=0x7;break; // 按键7
-
- case 0xd7 :a=0x0b;break;// 按键-
- case 0xdb :a=0x6;break; // 按键6
- case 0xdd :a=0x5;break; // 按键5
- case 0xde :a=0x4;break; // 按键4
-
- case 0xe7 :a=0x0a; break;// 按键+
- case 0xeb :a=3;break; // 按键3
- case 0xed :a=2;break; // 按键2
- case 0xee :a=1;break; // 按键1
-
- default :a=0xff;
- }
- return a; /* 返回按键值 */
- }
- void display_a() //显示数据a
- {
- dispaly[3]=data_a%10000/1000; //千
- dispaly[2]=data_a%1000/100; //百
- dispaly[1]=data_a%100/10; //十
- dispaly[0]=data_a%10; //个
-
- write_com(0x80+0); //显示数据a
- if(data_a>999){ write_date('0'+dispaly[3]);} //显示千位
- if(data_a>99){ write_date('0'+dispaly[2]);} //显示百位
- if(data_a>9){ write_date('0'+dispaly[1]);} //显示十位
- write_date('0'+dispaly[0]); //显示个位
- }
-
- void display_b() //显示数据b
- {
- write_com(0x80+7); //第一行
- dispaly[3]=data_b%10000/1000; //千
- dispaly[2]=data_b%1000/100; //百
- dispaly[1]=data_b%100/10; //十
- dispaly[0]=data_b%10; //个
-
- if(data_b>999){ write_date('0'+dispaly[3]); } //显示千位
- if(data_b>99) { write_date('0'+dispaly[2]); } //显示百位
- if(data_b>9) { write_date('0'+dispaly[1]); } //显示十位
- write_date('0'+dispaly[0]); //显示个位
- }
-
- //计算结果
- void display_c(x)
- {
-
- if(data_c<100000000&&data_c>-1)//溢出时显示错误
- {
-
- dispaly[8]=data_c%1000000000/100000000; //万万
- dispaly[7]=data_c%100000000/10000000; //千万
- dispaly[6]=data_c%10000000/1000000; //百万
- dispaly[5]=data_c%1000000/100000; //十万
- dispaly[4]=data_c%100000/10000; //万
- dispaly[3]=data_c%10000/1000; //千
- dispaly[2]=data_c%1000/100; //百
- dispaly[1]=data_c%100/10; //十
- dispaly[0]=data_c%10; //个
- write_com(0x80+6+0x40); //第一行
- if(x==4)
- {
- if(data_c>99999999) { write_date('0'+dispaly[8]);} //显示万万
- if(data_c>9999999) { write_date('0'+dispaly[7]);} //千万
- if(data_c>999999) { write_date('0'+dispaly[6]);} //百万
- if(data_c>99999) { write_date('0'+dispaly[5]);} //十万
- write_date('0'+dispaly[4]); //万
- write_date('.');
- write_date('0'+dispaly[3]); //千
- write_date('0'+dispaly[2]); //百
- write_date('0'+dispaly[1]); //十
- write_date('0'+dispaly[0]); //个
- }
- else{
- if(data_c>99999999) { write_date('0'+dispaly[8]);} //显示万万
- if(data_c>9999999) { write_date('0'+dispaly[7]);} //千万
- if(data_c>999999) { write_date('0'+dispaly[6]);} //百万
- if(data_c>99999) { write_date('0'+dispaly[5]);} //十万
- if(data_c>9999) { write_date('0'+dispaly[4]);} //万
- if(data_c>999) { write_date('0'+dispaly[3]);} //千
- if(data_c>99) { write_date('0'+dispaly[2]);} //百
- if(data_c>9) { write_date('0'+dispaly[1]);} //十
- write_date('0'+dispaly[0]); //个
- }
- }
- else //溢出时显示错误
- {
- write_com(0x80+11+0x40); //第一行
- write_date('E'); //显示 E
- write_date('r'); //显示R
- write_date('r'); //显示R
- write_date('o'); //显示O
- write_date('r'); //显示E
- }
- }
-
- void eql(uchar x)//加减乘除运算
- {
- switch(x) /*功能键选择*/
- {
- case 1:data_c=data_a+data_b;break; //加 /* + S=1 */ /* 数值转换函数 */
- case 2:if(data_a>=data_b){data_c=data_a-data_b;} /* - S=2 *///减
- else{data_c=data_b-data_a;W_lcd(5,1,'-');} //负数符号
- break;
- case 3:data_c=(data_a*data_b);break; /* * S=3 *///乘
- case 4:if(data_b==0){LCD_Write_String(0,1,"Error !");}else{data_c=(data_a*10000)/data_b;}break; /* / S=4 *///除//溢出时显示错误
- case 0:break;
- }
-
- }
-
- void main()
- {
- uchar key=0xff; //键值初始化
- uchar n=0; //第1个数可以按1-4次
- uchar m=5; //第2个数可以按1-4次
- uchar x=0;
- data_a=0; //前一个数
- data_b=0; //后一个数
- data_c=0; //结果
- init_lcd(); //1602液晶初始化
- display_a();
- while(1)
- {
- key=keycheckdown(); /*动态扫描键盘,返回按键对应值,赋给j key=0到f */
- if(0xff!=key) /*若返回值有效,进入内部处理程序*/
- {
- if(key<10)
- {
- if(n<4){data_a=data_a*10+key;m=5;display_a();}n++; //首先输入第一个数
- if(m<4){data_b=data_b*10+key;n=5;display_b();}m++; //必须按了+-*/才能输入第二个数
- }
- else
- { switch(key) /*功能键选择*/
- {
- case 0xa:n=5;m=0;x=1;W_lcd(5,0,'+');break; //加 /* + S=1 */ /* 数值转换函数 */
- case 0xb:n=5;m=0;x=2;W_lcd(5,0,'-');break; /* - S=2 *///减
- case 0xc:n=5;m=0;x=3;W_lcd(5,0,'*');break; /* * S=3 *///乘
- case 0xd:n=5;m=0;x=4;W_lcd(5,0,'/');break; /* / S=4 *///除
- case 0xe:n=5;m=5;eql(x);W_lcd(12,0,'=');display_c(x);break;
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
完整论文下载(word格式 可编辑):
单片机作品之计算器设计报告.doc
(622.26 KB, 下载次数: 299)