版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1引言1.1概述众所周知单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。本设计要制作的就是单片机于生活中最为常见的几种应用——简易计算器。本简易计算器以AT89S52单片机作为核心,可以显示简易的计算和时间,时间可以人为设定;另外还可以显示当前的日历,显示格式为年(四位),月(两位),日(两位)。设置时间的位切换、设定数值、启动定时器、切换日历通过外部中断来实现。简易计算器不仅可以进行简易的计算还可以显示时间。简易计算器显示电路由LCD1602组成,制作该装置的材料需要有软硬件的支持,硬件方面AT89C51单片机,晶振,电源,液晶屏LCD1602。1.2设计思路1、本课题设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,所以采用LCD显示数据和结果;2、计算器部分:键盘包括数字键(0-9)、符号键(+、-、*、/)、清除键(ON/C)和等号键(=),故需要16个按键,设计中采用矩阵键盘;3、时间显示的部分,有年、月、日、时、分、秒、时间显示和计算器控制键的分别设置,故需要8个独立的按键;3、执行程序:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果;4、错误提示:当单片机执行程序中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算器得到的结果大于计算器的显示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD上提示错误,显示“error”。2单片机及其应用单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。图2.1AT89S522.1单片机介绍单片微型计算机简称单片机,是典型的嵌入式微控制器(MicrocontrollerUnit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。单片机由芯片内仅有CPU的专用处理器发展而来。最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!单片机的硬件特性:单片机集成度高。单片机包括CPU、4KB容量的ROM(8031无)、128B容量的RAM、2个16位定时/计数器、4个8位并行口、全双工串口行口。系统结构简单,使用方便,实现模块化。P1口:P1口是一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。在flash编程和校验时,P1口接收低8位地址字节。引脚号第二功能P1.0T2(定时器/计数器T2的外部计数输入),时钟输出P1.1T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)P1.5MOSI(在系统编程用)P1.6MISO(在系统编程用)P1.7SCK(在系统编程用)P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。在flash编程和校验时,P3口也接收一些控制信号。引脚号第二功能:P3.0RXD(串行输入)P3.1TXD(串行输出)P3.2INT0(外部中断0)P3.3INT0(外部中断0)P3.4T0(定时器0外部输入)P3.5T1(定时器1外部输入)P3.6WR(外部数据存储器写选通)P3.7RD(外部数据存储器写选通)RST:复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,RST脚输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。否则,ALE将被微弱拉高。这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。EA/VPP:访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在flash编程期间,EA也接收12伏VPP电压。XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。XTAL2:振荡器反相放大器的输出端。3LCD1602的原理及其应用3.1LCD1602的介绍LCD1602已很普遍了,具体介绍我就不多说了,市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样。3.2LCD1602的引脚1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表3.1所示:表3.1LCD1602的引脚说明编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极表3.1:引脚接口说明表第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。3.3LCD1602的指令1602液晶模块内部的控制器共有11条控制指令,如表3.2所示:表3.2LCD1602的指令说明编号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L**6置功能00001DLNF**7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容表3.2:控制命令表1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。指令11:读数据。与HD44780相兼容的芯片时序表如下:表3.3LCD1602基本操作时序说明读状态输入RS=L,R/W=H,E=H输出D0—D7=状态字写指令输入RS=L,R/W=L,D0—D7=指令码,E=高脉冲输出无读数据输入RS=H,R/W=H,E=H输出D0—D7=数据写数据输入RS=H,R/W=L,D0—D7=数据,E=高脉冲输出无3.4LCD1602的RAM地址映射及标准字库表液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图3.1是1602的内部显示地址。图3.1LCD1602的内部地址例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表3.4所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。表3.4CGROM和CGRAM中字符代码与字符图形对应关系4整体设计4.1设计方法本电路设计采用AT89S52单片机为核心,利用晶振产生频率为1HZ的时钟脉冲信号,利用液晶屏LCD1602显示计算及其时间信息,通过对AT89S52单片机的编程控制液晶屏LCD1602的显示。显示计算和简易计算的信息同在LCD1602,通过按键切换选择。外部按键可及时设定或调整时间或计算的信息。4.2硬件设计本系统以AT89S52单片机为核心,本系统选用12MHZ的晶振,,使得单片机有合理的运行速度。起振电容22pF对振荡器的频率高低、振荡器的稳定性和起振的快速性影响较合适,复位电路为按键高电平复位。4.2.1按键调整电路图4.1独立按键S0为调秒的按键,当按下S0时秒加1;S1为调分的按键,当按S1时分加1;S2按键为调时,当按下S2时时加1;S3按键为调日,当按下S3时日加1;S4为调月,当按下S4时月加1;S5为调年,当按下S5时年加1;当S6按下时,显示时间;S7按下时,显示计算。4.2.2复位电路图4.2复位电路51单片机是高电平复位。所以本设计采用的是上电复位和手动复位相结合的方式。4.2.3LCD1602的显示电路图4.3显示部分本设计采用液晶屏LCD1602来显示输出数据,通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应的数据。4.2.4电源供电电路图4.4电源部分三端稳压集成电路LM7805,是指这种稳压用的集成电路,只有三条引脚输出,分别是输入端、接地端和输出端。如图4.4所示,这是一个输出+5V直流电压的稳压电源电路。采用集成稳压器LM7805,二极管DS1起保护作用,C4为输出端滤波电容,当输出电流较大时,LM7805应配上散热板,本设计中功率小不用。78/79系列集成稳压IC中的78或79后面的数字代表该三端集成稳压电路的输出电压,如7805表示输出电压为+5V。4.2.5键盘的设计图4.5矩阵键盘计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4*4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。4.3软件设计本电路软件设计采用C语言编写程序(具体程序在附件中给出)。程序设计主要包括简易计算的编程,按键编程,时间控制编程,液晶屏LCD1602的显示编程。4.4软件仿真在硬件设计完成后,利用软件对其进行仿真,这样,就会减少在做硬件时的错误,做到更准确。本次我采用Proteus软件仿真。如图4.1所示,简易计算器的时间显示。如图4.2所示,简易计算器的计算显示。经过此次的软件仿真,仿真结果正常,可以顺利的进行硬件制作。图4.6时间显示图4.7计算显示4.5硬件调试前期工作都是为了最后一步,就是自己动手焊接,制作出完整的实物。在确保焊接无误后,接着将之前编好的程序烧进单片机,做最后的硬件调试。结束语在用单片机实现简易计算的设计中使用到了AT89S52、LCD1602及其4*4键盘的使用。在设计过程中我通过在网上和图书馆查阅资料,收集了关于单片机和液晶屏LCD1602显示方面的资料,通过对这些资料的学习,我了解了单片机的基本结构和单片机在生活和生产中所发挥的作用以及液晶屏LCD1602的原理和使用。本次设计完成的主要工作和任务如下:对设计方案的理论研究,单片机的合理选型,硬件电路的设计,电路板的制作,元器件的焊接,软件的编写和调试以及此次论文的编写。通过设计简易计算器的过程中,我掌握了单片机的基本原理及其基本的应用,对它的各种硬件接口与软件设计方法有一定的认识。通过对电路原理图、PCB图的绘制,又加深对ProtelDXP的使用,电路仿真、电路板的制作掌握了对Proteus仿真软件的使用。本次论文设计是对以前学过的理论知识进行了巩固,加深了理解,提高了应用的能力,提高了自己的发现、分析、解决问题的能力。经历了从最初的选题、硬件设计、软件设计到最后仿真结果的出现,从一定程度上提高了对专业的认识及兴趣,就我而言,对以后就业有及其重大的影响。致谢在此也很感谢学校和老师给我们提供了这样的平台,能使我们的动手能力增强;感谢老师对我们提供的帮助,感谢他们带给我知识,使我完成本次的毕业设计。同时也感谢我的同学们,对我的支持!参考文献[1]田立.田清.代方震.51单片机C语言程序设计.北京.人民邮电出版社.2008:132-148.[2]张仪和.例说51单片机(C语言版)(第三版).北京.人民邮电出版社.2010:374-392.[3]谭浩强.C程序设计(第三版).北京.清华大学出版社.2003:140-150.[4]温子祺.刘志峰.冼安胜.林秩谦.李益鸿.51单片机C语言创新教程.北京.北京航空航天大学出版社.2011:154-163.[5]俞锡存.曹国华.单片机原理及接口技术.西安.西安电子科技大学出版社.2000:80-95..附录1.硬件电路原理图2.软件编程程序#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitrs=P0^0;sbitrw=P0^1;sbite=P0^2;sbitk0=P1^0;sbitk1=P1^1;sbitk2=P1^2;sbitk3=P1^3;sbitk4=P1^4;sbitk5=P1^5;sbitk6=P1^6;sbitk7=P1^7;unsignedcharcodedigit[]={"0123456789"};//定义字符数组显示数字unsignedchars,m,h,day,month,year,count;voidwrite_dat(uchardat);voidwrite_com(ucharcom);voidkeyscan();/***功能说明:显示编码,加上0x30,分别为'1'、'2'、'3'、'+'、'4'、'5'、'6'、'-'等***/ucharcodetable1[]={1,2,3,0x2b-0x30,4,5,6,0x2d-0x30,7,8,9,0x2a-0x30,0,0x3d-0x30,0x01-0x30,0x2f-0x30};uchark=0,flag=0,num,fuhao,i;longa,b,c;voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/***函数功能:指定字符显示的实际地址入口参数:x***/voidWriteAddress(unsignedcharx){write_com(x|0x80);}//显示位置的确定方法规定为"80H+地址码x"/***函数功能:显示小时***/voidDisplayHour(){unsignedchari,j; i=h/10;//取整运算,求得十位数字 j=h%10;//取余运算,求得各位数字WriteAddress(0x45);//写显示地址,将十位数字显示在第2行第0列 write_dat(digit[i]);//将十位数字的字符常量写入LCDwrite_dat(digit[j]);//将个位数字的字符常量写入LCD}/***函数功能:显示分钟***/voidDisplayMinute(){unsignedchari,j;i=m/10;//取整运算,求得十位数字 j=m%10;//取余运算,求得各位数字WriteAddress(0x48);//写显示地址,将十位数字显示在第2行第3列 write_dat(digit[i]);//将十位数字的字符常量写入LCD write_dat(digit[j]);//将个位数字的字符常量写入LCD}/***函数功能:显示秒***/voidDisplaySecond(){unsignedchari,j; i=s/10;//取整运算,求得十位数字 j=s%10;//取余运算,求得各位数字WriteAddress(0x4b);//写显示地址,将十位数字显示在第2行第6列 write_dat(digit[i]);//将十位数字的字符常量写入LCDwrite_dat(digit[j]);//将个位数字的字符常量写入LCD}/***函数功能:显示年***/voidDisplayYear(){unsignedchari,j; i=year/10;//取整运算,求得十位数字 j=year%10;//取余运算,求得各位数字WriteAddress(0x07);//写显示地址,将十位数字显示在第2行第0列 write_dat(digit[i]);//将十位数字的字符常量写入LCDwrite_dat(digit[j]);//将个位数字的字符常量写入LCD}/***函数功能:显示月***/voidDisplayMonth(){unsignedchari,j;i=month/10;//取整运算,求得十位数字 j=month%10;//取余运算,求得各位数字WriteAddress(0x0a);//写显示地址,将十位数字显示在第2行第3列 write_dat(digit[i]);//将十位数字的字符常量写入LCD write_dat(digit[j]);//将个位数字的字符常量写入LCD}/***函数功能:显示日***/voidDisplayDay(){unsignedchari,j; i=day/10;//取整运算,求得十位数字 j=day%10;//取余运算,求得各位数字WriteAddress(0x0d);//写显示地址,将十位数字显示在第2行第6列 write_dat(digit[i]);//将十位数字的字符常量写入LCDwrite_dat(digit[j]);//将个位数字的字符常量写入LCD}voidkeyscan2() {if(k0==0) {delay(5); if(k0==0) {s++; if(s==60) s=0;}} if(k1==0) {delay(5); if(k1==0) {m++; if(m==60) m=0;}} if(k2==0) {delay(5); if(k2==0) {h++; if(h==60) h=0;}} if(k3==0) {delay(5); if(k3==0) {day++; if(day==30) day=0;}} if(k4==0) {delay(5); if(k4==0) {month++; if(month==13) month=0;}} if(k5==0) {delay(5); if(k5==0) {year++; if(year==99) year=0; }}} voidkeyscan(){uchartemp;P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case0xee:num=0;break;case0xde:num=1;break;case0xbe:num=2;break;case0x7e:num=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}/***当按下1,2,3,松手后执行下面这段语句***/if(num==0||num==1||num==2){if(flag==0)a=a*10+table1[num];//如果没有按符号键,符号前的数值为aelseif(flag==1)b=b*10+table1[num];//如果按了符号键,符号后的数值为bif(k==1)//如果之前按了'='号,再按键时清屏,进行下一次计算{k=0;write_com(0x01);}}elseif(num==3)//判断按下'+'{flag=1;fuhao=1;}i=table1[num];//显示按下的键write_dat(0x30+i);}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case0xed:num=4;break;case0xdd:num=5;break;case0xbd:num=6;break;case0x7d:num=7;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}if(num==4||num==5||num==6)//判断是否按下'4','5','6'{if(k==1){k=0;write_com(0x01);}if(flag==0)a=a*10+table1[num];elseif(flag==1)b=b*10+table1[num];}elseif(num==7){flag=1;fuhao=2;}i=table1[num];//显示按下的键write_dat(0x30+i);}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp)//{case0xeb:num=8;break;case0xdb:num=9;break;case0xbb:num=10;break;case0x7b:num=11;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}if(num==8||num==9||num==10)//判断是否按下'7','8','9'{if(k==1){k=0;write_com(0x01);}if(flag==0)a=a*10+table1[num];elseif(flag==1)b=b*10+table1[num];}elseif(num==11)//判断是否按下'*'{flag=1;fuhao=3;}i=table1[num];write_dat(0x30+i);}P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case0xe7:num=12;//0键break;case0xd7:num=13;//'='break;case0xb7:num=14;//清0键break;case0x77:num=15;//'/'break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}switch(num){case12:{if(k==1)k=0;{write_com(0x01);}if(flag==0)a=a*10;elseif(flag==1)b=b*10;write_dat(0x30);}break;case13://按=键{k=1;if(fuhao==1)//如果符号键是+,执行+运算{write_com(0x80+0x4f);write_com(0x04);c=a+b;while(c!=0){write_dat(0x30+c%10);c=c/10;}write_dat(0x3d);fuhao=0;a=0;b=0;flag=0;}if(fuhao==2){write_com(0x80+0x4f);write_com(0x04);if(a>=b){c=a-b;while(c!=0){write_dat(0x30+c%10);c=c/10;}}elseif(a<b){c=b-a;while(c!=0){write_dat(0x30+c%10);c=c/10;}write_dat(0x2d);}write_dat(0x3d);a=0;b=0;flag=0;fuhao=0;}if(fuhao==3)//如果符号键是*{write_com(0x80+0x4f);write_com(0x04);c=a*b;while(c!=0){write_dat(0x30+c%10);c=c/10;}write_dat(0x3d);a=0;b=0;flag=0;fuhao=0;}if(fuhao==4)//如果符号键是/{i=0;write_com(0x80+0x4f);write_com(0x04);c=(long)(((float)a/b)*1000000);//结果保留6位小数while(c!=0){write_dat(0x30+c%10);c=c/10;i++;if(i==6)//显示完六位小数后,显示·write_dat(0x2e);}if(a/b<=0)write_dat(0x30);write_dat(0x3d);a=0;b=0;flag=0;fuhao=0;}}break;case14:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}break;case15:{flag=1;fuhao=4;write_dat(0x30+table1[num]);}break;}}}/***led1602***/voidwrite_com(ucharcom){rs=0;//选择写指令rw=0;P2=com;e=1;delay(5);//无延时不能正常工作e=0;}voidwrite_dat(uchardat){rs=1;//选择写数据rw=0;P2=dat;e=1;delay(5);//无延时不能正常工作e=0;}voidinit()//初始化{delay(15);write_com(0x38);delay(6);write_com(0x38);delay(6);write_com(0x38);write_com(0x38);write_com(0x0c);//开显示,关光标write_com(0x06);//光标移动设置write_com(0x01);/清屏}voidgeshi(){ WriteAddress(0x00);write_dat('D'); WriteAddress(0x01);write_dat('a');WriteAddress(0x02);write_dat('t');WriteAddress(0x03);write_dat('e'); WriteAddress(0x04);write_dat(':'); WriteAddress(0x05);write_dat('2'); WriteAddress(0x06);write_dat('0'); WriteAddress(0x09);write_dat('-'); Writ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国物流中心产业竞争战略规划与投资经营模式研究研究报告
- 2025至2030中国特色小镇规划建设误区与可持续发展对策研究报告
- 2026汽车智能座舱生态构建及商业模式研究报告
- 2026汽车智能停车技术发展分析及无感支付与车位共享研究报告
- 2026汽车动力电池回收利用市场分析及技术发展趋势与管理策略研究报告
- 2026汽车共享出行市场发展格局与商业模式创新报告
- 2026汽车OTA升级技术规范与网络安全保障策略研究报告
- 2026民用无人机应用场景拓展与投资机会评估报告
- 2026柔性显示屏产能爬坡速度与终端产品创新应用分析报告
- 2026智能晾衣架安装服务标准化研究
- 胎儿疾病预后评估方案
- 政治试题-汕头市2025-2026学年度普通高中毕业班教学质量监测(含解析)
- 2026-2030中国一次性餐盒行业深度调研及投资前景预测研究报告
- 派出所各项制度规范
- 2026锦泰财产保险股份有限公司招聘系统工程师等岗位4人笔试备考题库及答案解析
- 知情同意书豁免申请书
- 化疗相关性贫血的护理
- 泉州市2026届选优生选拔引进70人考试题库及答案1套
- 人防工程安全隐患排查工作总结
- 2026年国家电网招聘之电网计算机考试题库500道含完整答案(历年真题)
- 高热患者液体管理策略
评论
0/150
提交评论