单片机的简易计算器毕业设计_第1页
单片机的简易计算器毕业设计_第2页
单片机的简易计算器毕业设计_第3页
单片机的简易计算器毕业设计_第4页
单片机的简易计算器毕业设计_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

第32页目 录摘 要2第一章 绪 论3第二章 方案论证与设计421 设计目标和实现方法422方案论证与设计4第三章 硬件模块介绍63.1 运算模块63.2 单片机(AT89C51)73.2.1 单片机(AT89S51)的引脚功能73.3.2 引脚介绍833 74ls245芯片1274ls245芯片如图3-7所示123.4 输入模块123.4.1 键盘介绍133.5 显示模块143.5 .1 数码153.5.2 数码管的分类15第四章 软件设计174.1 LED显示程序流程图设计174.2 读键输入程序流程图设计174.3 主程序流程图设计18第五章 仿真及调试20总 结21参考文献23附录1 简易计算器源程序24附 录2 仿真电路设计图35摘 要计算器在人们的日常中是比较的常见的电子产品之一。可是它还在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次设计是用单片机来设计的八位计算器。该设计系统是以AT89C51为单片机,用74LS245为显示位控制, P1口作为输入端,外接4X4的键盘,通过键盘扫描来对输入数的控制,并外接驱动电路,系统采用LED数码管作为显示器,软件程序采用均采用C语言编写,便于移植与升级。报告详细介绍了整个系统的硬件组成结构、工作原理和系统的软件程序设计。计算器将完成的功能有整数的加,减,乘,除等功能。关键字 计算器 数码管 74LS245第一章 绪 论随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。电子产品的更新速度快就不足惊奇了, 单片机的应用已经越来越贴近生活,用单片机来实现一些电子设计也变得容易起来。近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。其中系统的抗干扰性能是系统可靠性的重要指标。本设计采用80S51 芯片,实现了利用单片机进行了一个简单计算器设计。允许对输入数据进行加减乘除运算及LED 显示。如果设计对象是更为复杂的计算器系统,其实际原理与方法与本设计基本相同。另外,实例所设计的计算器是用LED 数码管显示的,当然也可以用其他的器件显示,如LED 显示屏,这样就可以显示出更多的字符,在此基础上,还可以编写更加完善的程序来实现更多的计算功能。设计的关键所在,必须非常熟悉单片机的原理与结构,同时还要对整个设计流程有很好的把握,将单片机和其他模块完整的衔接。第二章 方案论证与设计21 设计目标和实现方法为了满足计算器的基本要求,可以基本的运算(加减乘除),数据归零和出错警告提示,我们采用基于单片机设计计算器,并用LED 数码管显示数据,4*4 的矩阵键盘实现数据输入。设计仿真和调试要用到Protues 、Keil等软件。22方案论证与设计 根据功能和指标要求,本系统选用MCS 51 单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计考虑如下:由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高故我们采用可以进行四位数字的运算,选用8 个LED 数码管显示数据和结果。另外键盘包括数字键(09)、符号键(+、-、)、清除键和等号键,故只需要16 个按键即可。系统模块图:图2-1 系统模块图 根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计。这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。程序流程图如图2-2所示:图2-2 程序流程图第三章 硬件模块介绍3.1 运算模块MCS-51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能,如图2-1所示:图3-1 单片机芯片3.2 单片机(AT89C51)单片机是我们电子产品实现自动化、智能化必不可少的电子元器件,它的外观如图3-2所示:图3-2 单片机外观图3.2.1 单片机(AT89S51)的引脚功能51系列单片机8031、8051及89c51/89s51均采用40Pin封装的双列直接DIP结构。上图是它们的引脚配置:40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用,如图3-3所示:图3-3 引脚图3.3.2 引脚介绍 电源引脚Vcc40脚正电源脚,工作电压为5V,另有AT89LV51工作电压则是2.7-6V, 引脚功能一样。GND20脚接地端。 外接晶体引脚 外接晶体引脚如图3-4所示:图3-4 外接晶体管引脚Pin19:时钟XTAL1脚, Pin18:时钟XTAL2脚,XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择。电容取30PF左右。 型号同样为AT89C51的芯片,在其后面还有频率编号,有12,16,20,24MHz可选。大家在购买和选用时要注意了。如AT89C51 24PC就是最高振荡频率为24MHz,40P6封装的普通商用芯片。 复位在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。复位后P0P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位脚由高电平变为低电平时,芯片为ROM的0000H处开始运行程序。常用的复位电路如下图3-5所示。图3-5 复位电路图复位操作不会对内部RAM有所影响。当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。什么叫复位?复位是单片机重新执行程序代码的意思。8051的复位方式可以是自动复位,也可以是手动复位,如图3-6所示。此外,RESET/Vpd还是一复用脚,Vcc掉电期间,此脚可接上备用电源, 以保证单片机内部RAM的数据不丢失。图3-6 复位方式 输入输出(I/O)引脚:P39-P32为P0.0-P0.7输入输出脚,称为P0口,是一个8位漏极开路型双向I/O口。内部不带上拉电阻,当外接上拉电阻时,P0口能以吸收电流的方式驱动八个LSTTL负载电路。通常在使用时外接上拉电阻,用来驱动多个数码管。 在访问外部程序和外部数据存储器时,P0口是分时转换的地址(低8位)/数据总线,不需要外接上拉电阻。P1-P8为P1.0-P1.7输入输出脚,称为P1口,是一个带内部上拉电阻的8位双向I/0口。P1口能驱动4个LSTTL负载。 通常在使用时外不需要外接上拉电阻,就可以直接驱动发光二极管。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。P21-P28为P2.0-P2.7输入输出脚,称为P2口,是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash程序存储器编程时,接收高8位地址和控制信息。在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。 P10-P17为P3.0-P3.7输入输出脚,称为P3口,是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载,这8个引脚还用于专门的第二功能。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。P1P3端口在做输入使用时,因内部有上接电阻,被外部拉低的引脚会输出一定的电流。除此之外P3端口还用于一些专门功能,具体请看下表3-1:P3引脚兼用功能P3.0串行通讯输入(RXD)P3.1串行通讯输出(TXD)P3.2外部中断0( INT0)P3.3外部中断1(INT1)P3.4定时器0输入(T0)P3.5定时器1输入(T1)P3.6外部数据存储器写选通WRP3.7外部数据存储器写选通RD表3-1 P3口功能表 其它的控制或复用引脚(1) ALE/PROG 30 访问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的低位字节。即使不访问外部存储器,ALE端仍以不变的频率输出脉冲信号(此频率是振荡器频率的1/6)。在访问外部数据存储器时,出现一个ALE脉冲。对Flash存储器编程时,这个引脚用于输入编程脉冲PROG(2) PSEN 29 该引是外部程序存储器的选通信号输出端。当AT89C51由外部程序存储器取指令或常数时,每个机器周期输出2个脉冲即两次有效。但访问外部数据存储器时,将不会有脉冲输出。(3) EA/Vpp 31 外部访问允许端。当该引脚访问外部程序存储器时,应输入低电平。要使AT89S51只访问外部程序存储器(地址为0000H-FFFFH),这时该引脚必须保持低电平。对Flash存储器编程时,用于施加Vpp编程电压。33 74ls245芯片74ls245芯片如图3-7所示:图3-7 驱动电路 74ls245是我们常见的芯片,在这里它用来驱动LED,它是8路同相三态双向总线收发器,可以双向传送数据。74ls245还具有双向三态功能,既可以输出,也可以输入数据。当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须介入74L245等 总线驱动器。当片选端/CE低电平有效时,DIR=“0”,信号由 B 向 A 传输;(接收)*DIR=“1”,信号由 A 向 B 传输;(发送)当/CE为高电平时,A、B均为高阻态。3.4 输入模块 计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式。为此,我们引入了矩阵键盘的应用,采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为44个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率,如图3-8所示:图3-8 键盘按键3.4.1 键盘介绍每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。当无按键闭合时,P10P13 与P14P17 之间开路;当有键闭合时,与闭合键相连的两条I/O 口线之间短路。判断有无按键按下的方法是:第一步,置列线P14P17 为输入状态,从行线P10P13 输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P14P17 读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。图3-9 键盘电路3.5 显示模块发光二极管LED 是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。因而作为典型的外围器件,LED 显示单元是反映系统输出和操作输入的有效器件。LED 具备数字接口可以方便的和大年纪系统连接;它的优点是价格低,寿命长,对电压电流的要求低及容易实现多路等,因而在单片机应用系统中获得了广泛的应用,所以在此设计中我首先选用了LED作为显示器件。如图3-10所示: 图3-10 数码显示管3.5 .1 数码数码管是一种半导体发光器件,其基本单元是发光二极管。如图右所示:3.5.2 数码管的分类数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。LED显示器由七段发光二极管组成,排列成8字形状,因此也成为七段LED显示器,器排列形状如下图所示: 图3-11 LED段码为了显示数字或符号,要为LED显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。简易计算器用到的数字09的共阴极字形代码如下表3-1所示:显示字型gfedcBa段码001111113fh1000011006h210110115bh310011114fh4110011066h511011016dh611111017dh7000011107h811111117fh911011116fh表3-1 09七段数码管共阴级字形代码第四章 软件设计4.1 LED显示程序流程图设计 6位LED显示的程序框图如图4-1所示:图4-1 LED显示流程图4.2 读键输入程序流程图设计为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码键码。为了得到被按键的键码,现使用行扫描法识别按键。列扫描信号进行读入行的信号判断该列是否有列的输出是则进行按照行列计算键盘的值,查表取得键码并返回若否则进行再次扫描。其程序框图如下:图4-2 程序框图4.3 主程序流程图设计运算主程序设计 首先初始化参数,送LED低位显示“0”,高位不显示。然后扫描键盘看是否有键输入,若有,读取键码。判断键码是数字键、清零键还是功能键(“+”“-”“*”“/”“=” ),是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。运算主程序框图如3-4所示:图4-4 运算主程序框图第五章 仿真及调试在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。设计的中心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以单独设计、编程和调试,然后组合起来。这种方法便于设计和调试,容易实现多个程序共存,但各个模块之间的连接有一定的难度。根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计。这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。功能和操作:加减乘除运算和显示。上电后,屏幕初始化。计算。按下数字键,屏幕显示要运算的第一个数字,再按下符号键,然后再按下数字键,屏幕显示要运算的第二个数字,最后按下“”号键,屏幕上显示出计算结果。如果要再次计算,可以按下“ON/C”键清零,或者按下单片机的复位键,重新初始化。 总 结经过近两个月的努力,终于顺利完成了毕业设计。刚开始,我们头绪不是很清楚,不知道从哪里入手,但通过老师的耐心指导并和同学认真研究设计课题,跑图书馆查资料、确定基本设计方案、对所用芯片功能进行查找、调试、上机仿真等,经历了一次次的困难,却积累了很多宝贵的经验。在整个设计的过程中遇到的问题主要有以下三点,第一:基础知识掌握的不牢固,主要表现在一些常用的电路的形式和功能不清楚,对书本上的内容理解不够透彻。第二:对一些常用的应用软件缺少应用,体现在画电路图和系统的仿真的时候,对这些软件的操作不熟练,浪费了很多时间。第三:相关知识掌握的不够全面,缺少系统设计的经验。这次设计进一步端了我的学习态度,学会了实事求是,严谨的作风,对自己要严格要求,不能够一知半解,要力求明明白白。急于求成是不好的,我有所感受。如果省略了那些必要的步骤,急于求成,不仅会浪费时间,还会适得其反。我觉得动手之前,头脑里必须清楚该怎么做,这一点是很重要的。就目前来说,我的动手能力虽然差一点,但我想,通过我的不懈努力,在这方面,我总会得到提高。这一点,我坚信。因为别人能做到的,我也一定能做到。在此次的毕业设计中我最大的体会就是进一步认识到了理论联系实践的重要性。一份耕耘,一份收获。通过这段时间的设计,让我明白科学的思维方法和学习方法是多么重要,只有这样才能够有很高的效率,才能够让自己的工作更完美。总而言之,此次毕业设计让我学到了好多平时在课堂上学不到的东西,增加了我的知识运用能力,增强我的实际操作能力。谢谢老师给我们提供这么好的机会,为我们之后走向社会奠定了一个好的基础。本次毕业设计让我学到了很多,也学会到了要怎么样去面对困难,不要对知识一知半截,要有的求实的能力,通过老师的帮助我学到了很多在平时的没有注意到的动东西及知识,更美没有深入的的去理解,通过这次我要更加的明确自己。更要注重自己在各方面的锻炼能力,把握机会。这次的设计非常的感谢老师们。参考文献 1 胡 辉. 单片机原理与应用. 北京:中国水利水电出版社,20072 林志琦. 单片机原理接口及应用(C语言版). 北京:中国水利水电出版社,20073 赵克林. C语言实例教程. 北京:人民邮电出版社,20074 姜承昊. 最新LED驱动电路设计、应用与制造新技术新工艺实用手册.北京:中国科学技术文献出版社,20085 /p-.html6 /p-.html附录1 简易计算器源程序/*:多功能计算器/*:可以进行6位数以内正整数的加减乘除运算,以及计时器和自定义倒计时功能。1、Main.c/*头文件及宏定义#include includes.h#define TIME0H 0xFC#define TIME0L 0x18/定时器0溢出时间:5ms#define TIME1H 0x44#define TIME1L 0x80/定时器1溢出时间:48ms/*全局变量/定时器0定时刷新LED计数unsigned long ul_Number=0;/LED实时显示数字unsigned char uca_ShowCustom6=0x88,0x83,0xC6,0xA1,0x86,0x84;/存放自定义显示字符unsigned char uc_DisCount=1;/E时事刷新计数bit b_ShowMode=0;/显示模式标志位/0-数字模式,将要显示的数字赋给ul_Number便可时事显示数值/默认为数字模式/1-自定义模式,该模式下自定义字符显示/定时器1计数刷新定时(计时模式)unsigned char uc_TimeCount=1;/定时器1定时计数。bit b_ClockStart=0;/定时器1显示计数标志位extern bit b_ClockOppose;/TimeOppose.cextern unsigned long ul_ClockOppose;/防抖动标志bit b_KeyShock=0; /键盘防抖动标志位。/当按键中断产生时,首先判断此位 /0-执行键盘扫描及键码处理程序;1-不执行bit b_KillShock=0;/防抖标志清除位:0-不清除;1-清除unsigned char uc_KillCount=1;/抖动标志清除计数,使用定时器1bit b_LCDClean=0; /通过设置b_LCDClean为1便可启动延时清空LED显示unsigned char uc_CleanCount=1; /延迟时间可在T1中断中设定unsigned char uc_ReportSymbol;bit b_ReportFlash=0;unsigned char uca_FlashBlank=0xFF,0xFF,0xFF,0xFF,0xFF,0xFF;/*主函数void main()P2=0x0F; /初始化键盘接口TMOD=0x11; /定时器0:模式一;定时器0:模式一./定时器0,用于LCD刷新TH0=TIME0H;TL0=TIME0L;TR0=1; /开启定时器0ET0=1; /开定时器0中断/定时器1,用于1s计时TH1=TIME1H;TL1=TIME1L;TR1=1; /开启定时器1ET1=1; /开定时器1中断/外部中断0,用于执行键盘扫描和键处理程序IT0=1; /外部中断0,中断方式:下降沿EX0=1; /开启外部中断0PT0=1; /把定时器0溢出中断设为高优先级EA=1; /开启总中断while(1);/*外部中断0,调用键盘扫描程序 void vINT0(void) interrupt 0EX0=0; /在键扫描处理时,关闭外部中断0,防抖动if(b_KeyShock=0)vKeyProcess(ucKeyScan();/当判断有按键按下时,扫描键盘,并把扫描结果进行处理b_KeyShock=1;/设置防抖动标志。else b_KeyShock=0;/如果有抖动则不执行键扫描,恢复防抖动标志/设置防抖动清除标志位if(b_KeyShock=1)b_KillShock=1;/如果防抖动标志位开启则开启防抖动标志清除位/300ms后清除防抖动标志。/恢复键扫描处理前初始状态P2=0x0F; /恢复P2口EX0=1;/恢复按键中断。/*定时器1中断,用于计时功能和防抖动标志清除以及显示报告void vTimer1(void) interrupt 3/计时模式计数刷新if(b_ClockStart=1)/当计时模式开启式,如计时处于运行状态则执行定时计数增加if(b_ClockOppose=0)/正常计时if(uc_TimeCount%21=0)uc_TimeCount=1;ul_Number+;else uc_TimeCount+;else /倒计时模式if(uc_TimeCount%21=0)uc_TimeCount=1;if(ul_ClockOppose0)ul_ClockOppose-;ul_Number=ul_ClockOppose;elseb_ClockStart=0;uc_ReportSymbol=7;b_LCDClean=1;else uc_TimeCount+;/防抖动标志清除if(b_KillShock=1)if(uc_KillCount%5=0)/当防抖动标志位为1时,计时300ms后清除抖动标志位b_KeyShock=0;b_KillShock=0;uc_KillCount=1;else uc_KillCount+;/LCD显示报告if(b_LCDClean=1) if(uc_CleanCount=1)EX0=0;/关闭键盘中断,此时按键无效vShowReport(uc_ReportSymbol);b_ShowMode=1;if(uc_CleanCount%40=0)/通过设置b_LCDClean为1便可启动延时清空LED显示b_LCDClean=0;/关闭清零标志位,清零结束uc_CleanCount=1;/恢复清零计数为初始值1.b_ShowMode=0;/恢复显示模式为默认的数字模式b_ReportFlash=0;EX0=1;/重新开启键盘中断else /实现闪烁报告功能if(uc_CleanCount%7=0) if(b_ReportFlash=0)vCharCopy(uca_FlashBlank);b_ReportFlash=1;else vShowReport(uc_ReportSymbol);b_ReportFlash=0; uc_CleanCount+;TH1=TIME1H;TL1=TIME1L;/*定时器0,定时刷新LED *void vTimer0(void) interrupt 1if(b_ShowMode=0)/数字模式vShowOneNum(*(pucLedNum(ul_Number)+uc_DisCount),6-uc_DisCount); /在LED上显示1位数字if(uc_DisCount=5)uc_DisCount=0;/定时器0在每次被触发时,改变LED显示else uc_DisCount+;/从第一位到第六位循环显示else/自定义模式vShowCustom(uca_ShowCustomuc_DisCount,uc_DisCount);if(uc_DisCount=5)uc_DisCount=0;/定时器0在每次被触发时,改变LED显示else uc_DisCount+;/从第一位到第六位循环显示/恢复定时器0初始状态TH0=TIME0H;TL0=TIME0L;2、Led6show.c/*:LED动态扫描子函数/*输入一个数字以及所要显示的位置,在LED相应位置上显示相应数字.#include LED6Show.h/*全局变量 unsigned char code uca_LEDCode=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF; /0,1,2,3,4,5,6,7,8,9,空白unsigned char code uca_LEDSelect=0x01,0x02,0x04,0x08,0x10,0x20;/分别点亮第6,5,4,3,2,1号灯unsigned char uca_LedNum6;/存放数字的各个位unsigned char uc_NumberFront=1; /只是数字的首位extern unsigned char uca_ShowCustom; /在自定义模式下,LCD实时显示该字符main.c/ 自定义报告显示字符unsigned char uca_ReportChar1=0xBF,0x86,0xC0,0x88,0xBF,0xF9; /被除数等于0-EOR-1unsigned char uca_ReportChar2=0xBF,0x86,0xC0,0x88,0xBF,0xA4; /被减数小于减数-EOR-2unsigned char uca_ReportChar3=0xC6,0x89,0x88,0xC2,0xBF,0xF9; /表明从计算器模式切换到计时模式CHAG-1unsigned char uca_ReportChar4=0xC6,0x89,0x88,0xC2,0xBF,0xC0; /表明从计时器模式切换到计算器模式CHAG-0unsigned char uca_ReportChar5=0xBF,0x8C,0x88,0xC1,0x92,0x86;/暂停-PAUSE/unsigned char uca_ReportChar6=0xBF,0x92,0x87,0x88,0x88,0x87;/开始-STARTunsigned char uca_ReportChar7=0xBF,0x92,0x87,0xC0,0x8C,0xBF;/停止-StoP-unsigned char uca_ReportChar8=0xC0,0x8C,0x8C,0xC0,0x92,0x86;/切换到倒计时模式OPPPOSEunsigned char uca_ReportChar9=0xBF,0x86,0xC0,0x88,0xBF,0x90; /超出可显示的最大值-EOR-9/* *函数实现 unsigned char * pucLedNum(unsigned long ulNumber) /将一个数的各个位分别存到数组里 /并返回首地址if(ulNumber)ulNumber=;if(ulNumber0)ulNumber=0;uca_LedNum5 = ulNumber/; /最高位存在数组5中uca_LedNum4 = (ulNumber-*(long)uca_LedNum5)/10000;uca_LedNum3=(ulNumber-*(long)uca_LedNum5-10000*(long)uca_LedNum4)/1000;uca_LedNum2 = (ulNumber-*(long)uca_LedNum5-10000*(long)uca_LedNum4-1000*(long)uca_LedNum3)/100;uca_LedNum1 = (ulNumber-*(long)uca_LedNum5-10000*(long)uca_LedNum4-1000*(long)uca_LedNum3-100*(long)uca_LedNum2)/10;uca_LedNum0 = (ulNumber-*(long)uca_LedNum5-10000*(long)uca_LedNum4-1000*(long)uca_LedNum3-100*(long)uca_LedNum2-10*(long)uca_LedNum1);/最低位存在数组0中for(uc_NumberFront=1;uc_NumberFront6;uc_NumberFront+)if(uca_LedNum6-uc_NumberFront!=0) /判断数据的首位不为零数字在第几位break;/例如:8502的uc_NumberFront为3/0的uc_NumberFront为6/的uc_NumberFront为1return uca_LedNum;/*将1个1位数按顺序显示 *void vShowOneNum(unsigned char ucOneNum,unsigned char ucOrder)if(ucOneNum!=0)/如果数字不为0则正常输出LEDSELECT=0;LEDCHAR=uca_LEDCodeucOneNum;/ucOrder:16LEDSELECT=uca_LEDSelectucOrder-1;elseif(ucOrderuc_NumberFront)/如果为0则判断是不是在数字首位之前LEDSELECT=0;/如果在则输出空,不显示数据elseLEDSELECT=0;/如果在首位之后则正常输出LEDCHAR=uca_LEDCodeucOneNum;LEDSELECT=uca_LEDSelectucOrder-1;/*将1个自定义字符按顺序显示 void vShowCustom(unsigned char ucOneCostom,unsigned ucOrder) LEDSELECT=0;LEDCHAR=ucOneCostom;LEDSELECT=uca_LEDSelectucOrder; /ucOrder:05/*将字符数组复制到字符显示数组中 void vCharCopy(unsigned char ucaArray)unsigned char ucCount;for(ucCount=0;ucCount6;ucCount+)uca_ShowCustomucCount=ucaArrayucCount;/*根据报告代号,显示不同的报告字符 void vShowReport(unsigned char ucSymbol)switch(ucSymbol)case 1:vCharCopy(uca_ReportChar1);break;/显示:-EOR-1-被除数等于0case 2:vCharCopy(uca_ReportChar2);break;/显示:-EOR-2-被减数小于减数case 3:vCharCopy(uca_ReportChar3);break;/显示:CHAG-1-表明从计算器模式切换到计时模式case 4:vCharCopy(uca_ReportChar4);break;/显示:CHAG-0-表明从计时器模式切换到计算器模式case 5:vCharCopy(uca_ReportChar5);break;/显示:-PAUSE-暂停/case 6:vCharCopy(uca_ReportChar6);break;/显示:-StART-开始case 7:vCharCopy(uca_ReportChar7);break;/显示:-StoP-停止case 8:vCharCopy(uca_ReportChar8);break;/显示:OPPOSE-切换到倒计时模式case 9:vCharCopy(uca_ReportChar9);break;/显示:-EOR-9-超出可显示的最大值default:break;3、Keyscan.c/*:键盘扫描子程序/*:当有外部中断0时调用此函数,使用列扫描的方式获取键码,键码由2位数字组成,高位为行号 。 /*低位为列号 /*头文件及宏定义/*#include #define SCANPORT P2 /44键盘扫描端口,低4位是行线,高4位是列线 /采用逐列扫描的方法,无按键时,低4位输出1,高4位输出0 /当有按键时,高4位输出扫描电位,低4位输入扫描结果/* *全局变量 unsigned char uca_LineScan4=0xEF,0xDF,0xBF,0x7F;/列线扫描电压,分为第1,2,3,4根列线为低电平,其他为高电平。/* *函数实现 unsigned char ucKeyScan()unsigned char ucTemp=0; /扫描状态暂存unsigned char ucRow=0,ucLine=0; /行号,列号for(ucLine=0;ucLine4;ucLine+)/列扫描SCANPORT=uca_LineScanucLine;/输出扫描电位ucTemp=SCANPORT&0x0F;/输入扫描电位,并屏蔽高4位。if(ucTemp!=0x0F) /判断该列是否有按键按下switch(ucTemp)case 0x0E: ucRow=10;break; /如果有,则判断行号case 0x0D: ucRow=20;break;case 0x0B: ucRow=30;break;case 0x

温馨提示

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

评论

0/150

提交评论