智能仪器简易计算器设计报告总结_第1页
智能仪器简易计算器设计报告总结_第2页
智能仪器简易计算器设计报告总结_第3页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、智能仪器课程设计报告题目:简易计算器设计院系:机械与电子工程学院专业班级:姓 名:学 号:指导老师2015年1月13日随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研等各个领域, 已经成为一种比较成熟的技术,本文将介绍一种用单片机设计的简单计算器。这个计算器除了会加减乘除的运算功能以外,还具有连续运算的功能。本文首先简单描述了硬件系统的工作原理,且附以硬件系统的设计框图,论述了本次 课程设计所应用的硬件接口技术和各个接口模块的功能及工作过程 ,并具体描述了外接 电路接口的软、硬件调试。其次阐述了程序的流程和实现过程。本次课程设计就是以C51来进行软件设计,软件 的设计采用模块化结

2、构,使程序设计的逻辑关系更加简洁明了。 使硬件在软件的控制下协 调运作。本文撰写的主导思想是软、硬件相结合,以硬件为基础,来进行各功能模块的编写。关键词:计算器,单片机,AT89C51汇编语言,模块化概 要1第一章课程设计选题及设计要求31.1课程设计选题31.2课题设计要求3第二章方案选择42.1单片机芯片的选择方案 42.2显示模块选择方案42.3电路设计最终方案 4第三章硬件电路设计3.1硬件电路设计图53.2主要单元电路介绍3.2.1 单片机最小系统6 63.2.2 键盘控制电路73.2.3 LCD显示电路 错误!未定义书签。第四章软件编程设计 134.1流程图134.2设计思路分析1

3、34.3 源程序15第五章 调试程序5.1调试结果分析275.2存在的问题及解决方法2827设计总结及体会30参考文献31第一章课程设计选题与功能要求1.1 课程设计选题:此次课程设计包含九个课题,存在几个比较难得课题但大部分还是算比较简单的,像简易数字示波器就比较有难度,因为涉及的模块比较多,像AD采集转换、LCD12864而且自己对LCD12864不是很熟悉,在一个礼拜的课程设计的时间里很难熟练地掌握和应用, 故没有选择;课题中相对来说也存在几个简单的课题,像灯光控制器,交通灯,因为自己先前做过类似的实验,所以没有选择。在考虑课题难度及时间的情况下,再综合自己的实践能力,我就选择难度不是很

4、大 的“简易计算器设计”这一个课题。一是因为自己对这个课题感兴趣, 而且经常在学习中 使用;二是自己对这个课题有一定的理论基础和完成这个课题的构思,所以就定下了这课题。1.2课题设计要求1. 能进行多字节的整数的单独运算,结果用十进制的数字显示;2. 尝试编写连加、连减的运算程序并进行演示;3. 尝试编写混合的运算程序并进行演示;4. 尝试编写实数的连加、连减运算程序。第二章 方案选择2.1单片机芯片的选择:采用89C51芯片作为硬件核心,采用 Flash ROM,内部具有4KB ROM存储空间,能于3V 的超低压工作。 AT89C51是一种带 4K字节闪烁可编程可擦除只读存储器(FPERO

5、FalshProgrammable and Erasable Read Only Memory)的低电压,高性能、CMOS 8 位单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,而且与MCS-51系列单片机完全兼容。2.2显示模块的选择:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显万案二:采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个 数偏多,功耗较大,所以也不用此种作为显示。采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,

6、显示多样, 清晰可见,与普通数码管相比功耗较小,硬件连接简单。所以显示部分采用1602液晶。2.3电路设计最终方案:综上各方案所述,对本次设计的方案选定为1.采用AT89C51作为主控制系统;2.4X4矩阵键盘和独立键盘作为输入模块; 3.1602液晶作为显示模块。第三章硬件电路设计3.1总体框图设计1 本设计里用到的单片机芯片是 AT89C51芯片,除此之外还包括:晶振电路和复位 电路构成单片机最小应用系统;2. 4x4矩阵键盘;3. LCD显示电路。总体设计框图3.2 主要单元电路321 TC89C52RC单片机介绍STC89C52RC 单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰

7、的单 片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周 期可以任意选择。主要特性如下:1. 增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任 意选择,指令代码 完全兼容传统8051.2. 工作电压:5.5V3.3V ( 5V单片机)/3.8V2.0V (3V单片机)3. 工作频率范围:040MHz相当于普通 8051的080MHz实际工 作频率可达48MHz4. 用户应用程序空间为 8K字节5. 片上集成512 字节RAM6. 通用I/O 口 (32个) 复位后为:,P1/P2/P3/P4 是准双向口 /弱上拉,P0 口是漏极开路输出,作为总线扩展用

8、时,不用加上拉电阻,作为I/O 口用时,需加上拉电阻。7. ISP (在系统可编程)/IAP (在应用可编程),无需专用编程器,无需专用仿真器,可通过串口( RxD/P3.0,TxD/P3.1 )直接下载用户程 序,数秒即可完成一片8. 具有EEPROM功能9. 具有看门狗功能10. 共3个16位定时器/计数器。即定时器 T0、T1、T211. 外部中断4路,下降沿中断或低电平触发电路,Power Down模式可 由外部中断低电平触发中断方式唤醒12. 通用异步串行口( UART ,还可用定时器软件实现多个UART13. 工作温度范围:-40+85C(工业级)/075 C (商业级)14. P

9、DIP封装STC89C52RC单片机的工作模式掉电模式:典型功耗 <0.1卩A,可由外部中断唤醒,中断返回后,继续执行原程序空闲模式:典型功耗 2mA典型功耗正常工作模式:典型功耗 4Ma7mA典型功耗掉电模式可由外部中断唤醒,适用于水表、气表等电池供电系统及便携设备STC89C52RC引脚功能说明VCC (40引脚):电源电压VS S (20引脚):接地P0 端口( P0.0P0.7 P0.7 , 3932引脚):P0 口是一个漏极开路的 8 位双向I/O 口。作为输出端口,每个引脚能驱动8个TTL负载,对端口 P0写入 每个引脚能驱动 写入“1”时,可以作为高阻抗输入。在访问外部程序

10、和数据存储器时在访问外部程序和数据存储器时,P0 口也可以提供低8位 地址和8位数据的复用总线位数据的复用总线。此时, P0 口内部上拉电阻有效。在Flash ROM编 在 程时,P0端口接收指令字节 端口接收指令字节;而在校验程序时,则输出指令字 节 则输出指令字节。验证时,要求外接上拉电阻。P1端口 ( P1.0P1.7 , 18引脚):P1 口是一个带内部上拉电阻的8位双向I/O 口。P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。 P1 口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一

11、个电流()。此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2 )和定时 器/计数器2的触发输入(P1.1/T2EX ),具体参见下表:在对Flash ROM 编程和程序校验时,P1接收低8位地址。表XX P1.0 和P1.1引脚复用功能P2端口(P2.0P2.7, 2128引脚):P2 口是一个带内部上拉电阻的8位双 向I/O 端口。P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。 对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流(I )。在访问

12、外部程序存储器和 16位地址的外部数据存储器 (如执行“MOVXDPTR指令)时,P2送 出高8位地址。在访问8位地址的外部数据存储器(如 执行“ MOVX R1指令)时,P2 口引脚上 的内容(就是专用寄存器(SFR区中的P2寄存器的内容),在整个访问期间不会改变。在对Flash ROM编程和程序校验期间,P2也接收高位地址和一些控制信号。P3端口( P3.0P3.7,1017引脚):P3是一个带内部上拉电阻的 8位双向I/O 端口。P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端 口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。P3做输入口使用时,因为有内

13、部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流()。在对Flash ROM编程或程序校验时,P3还接收一些控制信号。P3口除作为一般I/O 口外,还有其他一些复用功能,如下表所示:表XX P3 口引脚复用功能复用功能RST (9引脚):复位输入。当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。看门狗计时完成后,RST引脚输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功 能无效。DISRTO默认状态下,复位高电平有效。ALE/ROG ( 30引脚) 地址锁存控制信号 :(ALE)是访问外部程序存储器时,锁存低8位地址的

14、输出脉冲。在 Flash编程时,此引脚(ROG也用作编程输入 脉冲。在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部 定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲 将会跳过。如果需要,通过将地址位 8EH的SFR的第0位置“ 1”, ALE操作将无效。这一位置ALE将被微弱拉 高。这个ALE使能标志位外部执行模式下无效。SEN (29 引脚)SEN在每个机器周 期被激活两次,而访“1 ”, ALE仅在执行MOVX或MOV指令时有效。否则,(地址位8EH的SFR的第0位)的设置对微控制器处于 :外部程序存储器选通信号( SEN)是外部程序存储器选

15、通信号。当AT89C51RC从外部程序存储器执行外部代码时,问外部数据存储器时,SEN将不被激活。A/VPP (31引脚)访问外部程序存储器控制信号。:为 使能从0000H到FFFFH的外部程序存储器读取指令, A必须接GNB注意加密方式1时,A将内 部锁 定位RESET。为了执行内部程序指令, A应该接VCC。在Flash 编程期间,A也 接收12伏VPP电压。XTAL1 (19引脚):振荡器反相放大器和内部时钟发生电路的输入端。XTAL2 (18引脚)振荡器反相放大器的输入端。3.2.2 4X4键盘控制电路矩阵式键盘的结构与工作原理:在键盘中的按键数量较多时,为了减少I/O 口的占用,通常

16、将按键排列成矩阵形式,如图2.5所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,只需而且要单片机的一个端口 (如P1 口)就可以构成4*4=16个按键,比直接将端口线用于键盘多出了一倍,线数越多,区别越明显,比如再多加一条线就可以构成 20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘比较是合理的。由于本系统按键较多,在这里采用矩阵式4*4键盘,这样可以合理应用硬件资源,用一个8位I/O 口控制,如图2.5所示:S3 n,1 hS3jn84 j_S6 卩卩富1SIOrrSITPLf卩|点SJ3PI-

17、? 1尸 1PI.4如PI.3PI2円丄SI4sisSIT1 4送Z图2.5 按键电路矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,图2.5中,列线通过电阻接正电源,并将行线所接的单片机的I/O 口作为输出端,而列线所接的I/O 口则作为输入。这样,当按键没有按 下时,所有的输出端都是高电平,代表无键按下。一旦有键按下,则输入线就会被拉低,行线输出是低 电平。这样,通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程方法如所述。矩阵式键盘的工作方法:为了确定矩阵式键盘上何键被按下,我们采用一种“扫描法”。扫描法:扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法

18、。以图2.5所示键盘电路为例,介绍过程如下:1. 判断键盘中有无键按下将全部行线X0-X3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与 4根行线相交叉的4个按键之中。若所有列 线均为高电平,则键盘中无键按下。2. 判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平, 即在置某根行线为低电平时, 其它行线为高电平。 在确定某根行线为低电平后, 再 逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。如图2.5所示。AT89C51单片机的P1 口用作键盘

19、I/O 口,键盘的列线接到P1 口的高4位,键盘的行线接 到P1 口的低4位。列线P14-P17分别接有4个上拉电阻到正电源 +5V,并把行线P10-P13设置为输出线,列 线P14-P17设置为输入线。4根行线和4根列线形成16个相交点。1. 检测当前是否有键被按下。检测的方法是P10-P13输出全“ 0”,读取P14-P17的状态,若P14-P17为全“ 1”,则无键闭合,否则有键闭合。2. 去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。P10-P13按下述4种组3. 若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。合依次输出:P13 1 1 1 0P

20、12 1 1 0 1P11 1 0 1 1P10 0 1 1 1在每组行输出时读取 P14-P17,若全为“ 1”,则表示为“ 0”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。4. 为了保证键每闭合一次 CPU仅作一次处理,必须消除键释放时的抖动。3.2.3 LCD 显示电路1. 1602介绍字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器

21、实物如图:图-4 1602字符型液晶显示器实物图2. 1602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分为 HD4478Q带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图所示:龍锻MW光13 0 -9 0 =1 5 -性能参数:显示容量:16 X 2个字符芯片工作电压 45 5.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95 X 4.35(W X H)mm引脚功能说明编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择1

22、2D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个 10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可

23、以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:DZ D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。3. 1602LCD的指令说明及时序11 从 CGRAM或 DDRAM读数 11读出的数据内容序号指令RSR/W D7D6D5D4D3 D2D1D01清显示0000000 0012光标返回0000000 01*3置输入模式0000000 1I/D S4显示开/关控制0000001 DCB5光标或字符移位000001S/C R/L *6置功能00001DLN F*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址00

24、1显示数据存贮器地址9读忙标志或地址01BF计数器地址1602液晶模块内部的控制器共有11条控制指令,如表-4所示:10 写数至U CGRAM或 DDRAM 1 0要写的数据内容表-4 :控制命令表1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)指令1:清显示,指令码 01H,光标复位到地址 00H位置。指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置 I/D :光标移动方向,高电平右移,低电平左移屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示

25、,低电平表示关显示C :控制光标的开与关,高电平表示有光标,低电平表示无光标 B :控制光标是否闪烁,高电平闪烁, 低电平不闪烁。指令5:光标或显示移位 S/C :高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令 DL :高电平时为4位总线,低电平时为 8位总线N :低电平时为单行显示,高电平时双行显示 F:低电平时显示5x7的点阵字符,高电平时显示 5x10的点阵字符。指令7:字符发生器 RAM地址设置。指令8: DDRA地址设置。指令9:读忙信号和光标地址 BF :为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。指令11:读数据

26、。4.1流程图第四章 软件编程设计4.2设计思路分析总的来说,我的设计思路主要由以下几个模块来构成的:1. 实时键盘扫描模块(4*4矩阵键盘和多个独立按键):键盘作为输入设备,提供 给使用者使用。因为要做到使用者一按键,系统就能响应,因此此模块需实时进行扫描输 入,故此模块使用了一个定时器(TO)进行间隔10ms的扫描。2. 实时显示模块(LCD1602): 1602液晶显示屏用作按键所对应的键值的显示和数据运算结果的输出。因为要实时显示按键所对应的值,故此模块也需通过定时器(T1)进行实时的显示输出。3. 数据处理模块:此模块又可细分为四个小模块来进行更好的理解;第一个是取值存储模块,第二个

27、是运算处理模块,第三个是符号判断模块,第四个是结 果输出模块。此模块的四个小模块为顺序执行。当一个键盘按下的时候,经过按键程序判断按键所代表的字符,转向显示子程序来显示,并在相应的数组中进行存储,然后等待下一个按键按下,直到所按下的键代表 时,程序转向数据处理模块,经过上述所讲的四个小模块就能得到运算的结果并进行结果 的输出显示。资源分配(包含端口):P1 口用做4*4矩形键盘的输出响应端口;P0 口用作LCD1602液晶显示模块的输入控制端口; P3.2、P3.3端口用作独立键盘的输出响应端口; 定时器T0用作定时(30ms)扫描4*4矩阵键盘; 定时器T1用作定时(10ms)扫描显示输出;

28、端口和变量的定义:因在下述程序中可以看到本程序所有使用的变量,故可参考下述详细程序的变量定义。4.3源程序主程序 #include<reg51.h>#include<lcd.h> #define uchar unsigned char#define uint unsigned intuchar code tab='1',7',8,'9',7','4','5','6','*','1','2',3,'-','

29、0','.','=','+'uchar flag=0,flag1=0,fuhao=0;uint keyvalue,result4,sign=0,p=0; / int i,datagroup15,signgroup15; sbit reset=P3A2;sbit delete=P3A3;void timer0_init();void timer1_init(); void jianpan_scanning();void delay10ms(uint z);void display();void catch_keyvalue(/*uint k

30、eyvaluel*/);/void outputview1(uint resultl); /void outputview2(uint result2); uint judge_fuhao(int result3);void signgroup_prioritycompare();/void sortfunction1( uint flag); /数中void sortfunction2( uint flag);/void datagroupinit();/void signgroupinit();全局变量注:int为2个字节/取数并存于数组函数输出显示函数符号数组优先级比较及数据处理函数数组

31、变化后重新排序子函数,应用于void signgroup_prioritycompare()函/数据数组清零/符号数组清零'+'函数 '-,函数 '*,函数 '/'函数/void signmatch();/ 符号对比函数 uint add(uint temp1,uint temp2); / uint sub(uint temp1,uint temp2); / uint mul(uint temp1,uint temp2); / uint div(uint temp1,uint temp2); / void reset(); /独立按键复位void

32、 delete();/独立按键回删 void main() timer0_init(); timer1_init();LcdInit();LcdWriteData(0x30);LcdWriteCom(0x80);while(1)/ display();/ datagroupinit(); signgroupinit();catch_keyvalue(); / 取值 signgroup_prioritycompare(); /处理/ datagroup0=-123/3;judge_fuhao(datagroup0); /处理结果判断正负数outputview2(result4); 结果输出显示k

33、eyvalue=0;p=0; sign=0; /i=0; datagroupinit(); signgroupinit();void catch_keyvalue(/*uint keyvalue1*/)/ 取值函数keyvalue仁keyvalue uint a=0,keyvalue1;/* datagroup10,signgroup10,pointer=0,sign=0,*/do/display();if( (keyvalue != 0) && (flag 仁=1)keyvalue1 = tabkeyvalue;if( (keyvalue1 >= '0'

34、) && (keyvalue1 <= 9) /*&& (flag 仁=1)*/ ) a=(keyvalue1-48); /*字符 0-9 转变为数字 0-9*/ datagroupp=datagroupp*10+a; else if(keyvalue1 != '=') && (keyvalue1 != '.')/*&& (flag 仁=1)*/ ) / if(signgroupsign)signgroupsign=keyvalue1;/* temp2=data_grouppointer;*/p

35、=p+1;sign=sign+1;/* temp1=data_grouppointer;*/signgroupsign/else signgroupsign=keyvalue1;+pointer; +sign; flag 仁0;while(keyvalue1 !='=');signgroupsign='!'void signgroup_prioritycompare()/ 处理函数,一按='号就运行此函数,/ i,全局变量i,sign,pointer,for(i=0;i<sign;i+)/ 先对*'/ '号进行运算if(signgr

36、oupi='*') | (signgroupi='/')if( sig ngroupi='*')datagroupi+1=mul(datagroupi,datagroupi+1);sortfunctionl(p);sortfunction2(sign);i=i-1;/sortfunction()为数组排序子函数从i开始排else /if( signgroupi='/')datagroupi+1=div(datagroupi,datagroupi+1);sortfunctionl(p);sortfunction2(sign);i=i

37、-1;/ 依次'+','-' 号运算/ for(i=0;i<=sign;i+)doi=0;if(sig ngroup0='+' | sig ngroupi='_')if( (signgroup0='+')datagroup1=add(datagroup0,datagroup1);sortfunctionl(p);sortfunction2(sign);/sortfunction()为数组排序子函数从i开始排else /if( signgroup0='-')datagroup1=sub(data

38、group0,datagroup1);sortfunctionl(p);sortfunction2(sign);datagroup0while( (signgroup0 != '!')/*&& signgroup0 != '='*/ ); /最终运算结果存放在中uint judge_fuhao(int result3) /负号判断if(result3>=0)result4=result3;return (result4);elsefuhao=1;result4=(-result3);return (result4);/*void outpu

39、tview1(uint resultl)/ 输出特殊情况运算结果uint adress;adress=Oxcf;LcdWriteCom(adress);LcdWriteData(result1); */void outputview2(uint result2)/ 输出运算结果result2=result uint adress,result;/ LcdWriteCom(0x01);adress=0xcf;doresult=result2%10;LcdWriteCom(adress);LcdWriteData(result+48);adress=adress-1;result2=(result

40、2-result)/10;while(result2 != 0);if(fuhao=1) fuhao=0;LcdWriteCom(adress);LcdWriteData('-'); adress=adress-1; LcdWriteCom(adress);LcdWriteData('=');/ LcdWriteCom(0x80);void sortfunction1( uint length) /数据数组排序函数uchar j; / j为全局变量for( j=i; jvlength; j+)datagroupj = datagroupj+1;/ return

41、(newgroup);void sortfunction2( uint length) /运算符数组排序函数uchar j; / j为全局变量for( j=i; jvlength; j+)signgroupj = signgroupj+1;/ return (newgroup);uint add(uint temp1,uint temp2)/uint result;result=temp1+temp2; return (result);uint sub(uint temp1,uint temp2)/uint result;result=temp1-temp2; return (result);

42、/输出结果最前加负号uint mul(uint temp1,uint temp2)/uint result;result=temp1*temp2; return (result);uint div(uint temp1,uint temp2)/uint result;/* if(temp2 != 0)*/result=temp1/temp2; return (result);/ 输出“ error ”/else result='!' return(result); void timer1_init()/ 定时器 T1 初始化TMOD=0X10;TH0=(65536-1000)/

43、256;TL0=(65536-1000)%256;EA=1;+'函数'-,函数*,函数TR 仁1;void timer1() interrupt 3/ 定时器 T1 中断函数TH1=(65536-1000)/256;TL1=(65536-1000)%256;display。;/* *定时器T0初始化*/ void timer0_init()TMOD=0X01;TH0=(65536-30000)/256;TL0=(65536-30000)%256;EA=1;ET0=1;TR0=1;/* *定时器T0中断函数*/void timer0() interrupt 1TH0=(65536

44、-30000)/256;TL0=(65536-30000)%256;jianpan_scanning();/*键盘扫描子函数*/void jianpan_scanning()/矩阵键盘的扫描P1=0xf0;if(P1 != 0xf0)delay10ms(1); / 延时消抖 if(P1 != 0xf0)switch(P1)case(0x70): keyvalue=1; break;case(OxbO): keyvalue=5; break;case(OxdO): keyvalue=9; break;case(OxeO): keyvalue=13;P1=OxOf;switch(PI)case(0

45、x07): keyvalue=keyvalue; break;case(OxOb): keyvalue=keyvalue+1; break;case(OxOd): keyvalue=keyvalue+2; break;case(OxOe): keyvalue=keyvalue+3;delay10ms(3);flag=1;flag1=1;/若干个独立键盘的扫描if(reset=O) flag2=0; if(delete=O)flag3=0;* *延时子函数*/*void delay1Oms(uint z)uint i,j;for(i=z;i>0;i_)for(j=2500;j>0;j

46、-);void display()/即时显示函数reset= 1;delete= 1;if(flag=1 && (keyvalue != 15)flag=O;LcdWriteData(tabkeyvalue)/delay10ms(50);/* if(reset=O)LcdWriteCom(OxOI);delay10ms(2);LcdWriteData(0x30);LcdWriteCom(0x80);if(delete=0)LcdWriteCom(0x04);LcdWriteData(0x20);delay10ms(10);LcdWriteCom(0x06); */*void d

47、atagroupinit()/数据数组清零函数uchar m;for( m=0; m<15;m+ )datagroupm=0;void signgroupinit()/符号数组清零函数uchar m;for( m=0; m<15;m+ )signgroupm=0; */void reset()LcdWriteCom(0x01);delay10ms(2);LcdWriteData(0x30);LcdWriteCom(0x80);void delete()LcdWriteCom(0x04);LcdWriteData(0x20);delay10ms(10);LcdWriteCom(0x0

48、6);程序#include"lcd.h"*函数名*函数功能:Lcd1602_Delay1ms:c:延时函数,延时1ms*输入*输出无*说名该函数是在12MH晶振下,12分频单片机的延时。*void Lcd1602_Delay1ms(uint c) /误差 Ousuchar a,b;for (; c>0; c_)for (b=199;b>0;b-)for(a=1;a>0;a_);函数名:LcdWriteCom函数功能:向LCD写入一个字节的命令输入:com输出:无*LCD1602 4PINS / 当没有定义这个 LCD1602 4PINS寸#ifndefvo

49、id LcdWriteCom(uchar com)LCD1602_E = 0;LCD1602_RS = 0;LCD1602_RW = 0;LCD1602_DATAPINS =Lcd1602_Delay1ms(1); LCD1602_E = 1; Lcd1602_Delay1ms(5);LCD1602_E = 0;#elsevoid LcdWriteCom(uchar com) / / 写入命令使能选择发送命令选择写入/ 放入命令/等待数据稳定/ 写入时序/保持时间/com;写入命令LCD1602_E = 0;/使能清零LCD1602_RS = 0;/选择写入命令LCD1602_RW = 0;/选择写入LCD1602_DATAPINS = com;/ /由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1;/ 写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = com << 4; / 发送低四位Lcd1602_Delay1ms(1);LCD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论