(单片机课程设计)电子定时闹钟设计.doc
单片机课程设计报告 LCD电子定时闹钟设计姓 名: 学 号: 专业班级: 指导老师: 所在学院: 摘要本设计是采用单片机技术的电子定时闹钟,近年来集成电路技术的出现和应用,是推动了人类文明的突飞猛进。基于集成电路技术的单片机产品更是方便了人们的生活和工作 ,目前以单片机技术的应用为核心的产品种类非常丰富。应用我们所学过的知识和查阅相关资料,我制作了这个单片机技术为基础的LCD可校时可定时电子闹钟,这是一个简单的实用的单片机电子设计产品。本“LCD定时电子闹钟设计采用AT89C51为主控芯片。在充分理解了设计的要求后,准确的定位了设计的目的,然后构思了总体的方案。在选择和合适的硬件完成了电路的设计后,又进行了软件的设计和调试。本系统的硬件组成以及工作原理都有详细的图文说明,所应用的软件技术和各个模块设计的功能及工作过程也有详细的介绍,最后的部分则详细描述了了软件仿真及调试过程。本电子钟设计是以单片机技术为核心,采用了中小规模集成度的单片机制作的功能较为完善的电子闹钟。硬件设计应用了成熟的数字钟电路的基本设计方法以,并详细介绍了系统的工作原理。硬件电路中使用了除AT89C51外,另外还有LCD、晶振、电阻、电容、发光二极管、开关、喇叭等元件。在硬件电路的基础上,软件设计按照系统设计功能的要求,运用所学的汇编语言,实现的功能包括时时-分分-秒秒显示、设定和修改定时时间的小时和分钟、校正时钟时间的小时、分钟和秒、定时时间到能发出一分钟的报警声。最后应用伟福及Proteus等软件将硬件电路和软件系统链接在一起对各个部分及整体进行仿真并调试构成了整个完整的电子闹钟的设计。最后通过反复的实际仿真和测试表明,该系统能够实现所有要求的功能包括:(1)能显示时时-分分-秒秒。(2)能够设定定时时间、修改定时时间及时钟。(3)定时时间到蜂鸣器能发出铃声,另外还在此基础上实现了其他的附加功能比如万年历。当然这个系统仍然是属于比较简单的单片机应用系统,要设计功能更强的更复杂的系统还需要我进一步的学习。目 录1 概述31.1单片机技术和数字钟简介31.2设计本电子闹钟的目的31.3本LCD电子钟的功能及特点介绍31.3.1设计特点31.3.2本LCD电子闹钟的主要功能32 系统总体方案及硬件设计42.1总体方案设计42.2硬件电路的设计42.2.1电路总体概念图设计52.2.2主控制芯片 AT89C5172.2.3 LCD显示电路72.2.4 喇叭部分的电路103 软件设计103.1软件设计概述103.2主函数的设计113.3 部分设计思想的说明123.3.1程序初始化123.3.2 闹钟的实现133.3.3显示程序134 PROTEUS软件仿真145课程设计体会16附录17附1 源程序代码17附2 系统原理图281 概述1.1单片机技术和数字钟简介单片机是单片微型计算机的简称,它是一种特殊的计算机。它特别适合于控制领域,故又称为微控制器MCU(micro control unit). 采用了嵌入系统,通常由单块集成电路芯片组成,内部包含有计算机的基本功能部件:中央处理器CPU,存储器和I/O接口电路等。单片机集成度高、功能强、通用性好,而且体积小、重量轻、能耗、低价格便宜,只要和适当的软件及硬件设备相结合,便可成为一个独立的单片机控制的功能系统,单片机也成为目前测量控制应用系统的优选机种和新电子产品的关键部件。 目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,和传统控制技术相比有革命性的进步。时钟是将小时、分种、秒种显示于人的肉眼的计时装置。而单片机模块中最常见的正是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。而LCD电子定时闹钟是以单片机为基础的数字电路实现对小时、分钟、秒的数字显示的数字计时装置,它的计时周期为24小时,另外应有校时功能和一些显示日期、闹钟等附加功能。一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”,“星期”计数器、校时电路、报时电路和振荡器组成。目前电子种广泛用于各种私人和公众场合,成为我们生活工作学习中不可缺少的好帮手。由于时钟的实用性和在人们生活中的重要性,所以尝试设计以单片机为核心的数字时钟是很有意义的。钟表原先的报时功能已经原不能满足人们日益增长的要求,现代的电子时钟多带有类似自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、通断动力设备、甚至各种定时电气的自动启用等功能,本设计中LCD电子时钟采用LCD显示时间和日期年月,直观实用,而且可以方便的校调,附带的万年历和定时功能也是很方便和实用的.1.2设计本电子定时闹钟的目的 复习和巩固所学过的知识,利用此课程设计正好可以对所学习过的知识进行系统的回顾和总结拓展知识面,课堂的知识是远远满足不了设计的要求的,这就需要我们去主动找寻更多的资料,了解更多的知识.培养了设计能力和解决实际实际问题的能力,同时增强了 自学能力,通过设计完整的单片机系统也初步掌握了组成系统、编程、调试等能力。通过本LCD电子种的设计初步了解了单片机应用系统开发研制过程,软件和硬件设计的方法.1.3本LCD电子闹钟的功能和特点介绍1.3.1设计特点本LCD电子定时闹钟是一种种基于单片机技术的多功能、多用途的电子产品,有电子时钟、日期显示、定时闹铃等多种功能。本设计产品性能卓越,功能丰富,采用LCD显示更加直观,是一个比较实用的电子产品.1.3.2本电子钟的主要功能(1)可以显示24小时制“时时-分分-秒秒”,LCD显示。(2)可以显示日期 具有万年历功能(3)可以方便的设定定时时间、修改定时时间,闹铃功能,预设定时时间到将发出闹铃声.(4)能够修改时钟时间的时、分、秒,能够修改日期的年月日.2 系统总体方案及硬件设计2.1总体方案设计本LCD电子定时数字闹钟,是以单片机及外围接口电路作为核心硬件,辅以外围硬件电路,用汇编语言设计的程序来设计并实现的。根据C51单片机的外围接口特点扩展成相应的硬件电路,然后根据单片机的指令设计出数字钟相应的软件,再利用软件来执行一定的程序实现数字钟的功能。之所以用单片机来制作电子钟,是因为这样在设计制作简单而且功能多、精确度高,也可方便的扩充其他功能,淡然实现也十分简单。本设计是利用AT89C51单片机为主控芯片,由七段数码管、晶振、电阻、电容、发光二极管、开关、喇叭等元件组成硬件电路,通过编写软件程序来实现和控制的数字定时闹钟。2.2硬件设计2.2. 1电路总体概念图设计总体的硬件系统结构框图如下图所示,由于LED的显示效果比较差因此选用了更先进的LCD:AT89C51震荡电路调时电路喇叭LCD震荡电路片选代码图1:硬件电路概念示意图按键与按钮电路复位等辅助电路LCD闹铃电路电源系统 图2:硬件电路概念图2.2.2主控芯片AT98C51单片机是20世纪70年代中期发展起来的一种大规模集成电路器件。它在一块芯片内集成了计算机的各种功能部件,构成一种单片式的微型计算机。20世纪80年代以来,国际上单片机的发展迅速,其产品之多令人目不暇接,单片机应用不断深入,新技术层出不穷。在我们日常学习和生活中,常见的有51系列、52系列、PIC系列等。其中51系列的单片机的模块化结构比较典型、应用灵活,为许多大公司和个人所采纳。在本LCD电子闹钟设计中就是采用利用我们熟悉的AT89C51单片机为主控芯片。AT89C51单片机由微处理器,存储器,I/O口以及特殊功能寄存器SFR等部分构成。其存储器在物理上设计成程序存储器和数据存储器两个独立的空间,片内程序存储器的容量为4KB,片内数据存储器为128个字节。89C51单片机有4个8位的并行I/O口:P0口,P1口,P2口和P3口。各个接口均由接口锁存器,输出驱动器,和输入缓冲器组成。P1口是唯一的单功能口,仅能用作通用的数据输入/输出口。P3口是双功能口除了具有数据输入/输出功能外,每条接口还具有不同的第二功能,如P3.0是串行输入口线,P3.1口是串行输出口线。在需要外部程序存储器和数据存储器扩展时,P0可作为分时复用的低8位地址/数据总线,P2口可作为高8位的地址总线。P3口也可作为AT89C51的一些特殊功能口,同时为闪烁编程和编程校验接收一些控制信号.各口管脚的备选功能如下所示: P3.0 RXD(串行输入口); P3.1 TXD(串行输出口); P3.2 /INT0(外部中断0); P3.3 /INT1(外部中断1); P3.4 T0(记时器0外部输入); P3.5 T1(记时器1外部输入);P3.6 /WR(外部数据存储器写选通); P3.7 /RD(外部数据存储器读选通)。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH)不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入;XTAL2:来自反向振荡器的输出。AT89C51单片机由微处理器,存储器,I/O口以及特殊功能寄存器SFR等部分构成。其存储器在物理上设计成程序存储器和数据存储器两个独立的空间,片内程序存储器的容量为4KB,片内数据存储器为128个字节。89C51单片机有4个8位的并行I/O口:P0口,P1口,P2口和P3口。各个接口均由接口锁存器,输出驱动器,和输入缓冲器组成。P1口是唯一的单功能口,仅能用作通用的数据输入/输出口。P3口是双功能口除了具有数据输入/输出功能外,每条接口还具有不同的第二功能,如P3.0是串行输入口线,P3.1口是串行输出口线。在需要外部程序存储器和数据存储器扩展时,P0可作为分时复用的低8位地址/数据总线,P2口可作为高8位的地址总线。P3口也可作为AT89C51的一些特殊功能口,同时为闪烁编程和编程校验接收一些控制信号。AT89C51单片机的封装及管脚分布如图一:图3、AT89C51单片机封装及管脚分布图2.2.2 时钟电路部分AT89C51系列的单片机的时钟方式分为内部方式和外部方式。内部方式就是在单片机的XTAL1和XTAL2的两引脚外接晶振,就够成了自激振荡器在单片机内部产生时钟脉冲信号。外部时钟方式是把外部已经有的时钟信号引入到单片机内部。时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间。本LCD电子闹钟设计是采用内部时钟方式,用一个12MHz晶振和两个30Pf瓷片电容组成,为单片机提供标准时钟,其中两个瓷片电容起微调作用.其电路图如下:图4: 时钟电路之所以采用高性能的振荡电路,因为:1. 单片机电子钟的计时脉冲基准是由外部晶振的频率经过12分频后提供,采用内部的定时/计数器来实现计时功能。所以,外接晶振频率精确度直接影响电子钟计时的准确性。 2. 单片机电 子钟利用内部定时/计数器溢出产生中断(12M晶振一般为50ms)再乘以相应的倍率来实现秒、分、时的转换。大家都知道从定时/计数器产生中断请求到响 应中断需要3-8个机器周期,定时中断子程序中的数据入栈和重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的 机器周期。 2.2.3 LCD显示电路部分为了获得更好的效果本设计并没有采用常见的LED,而是采用了型号为LM016L的 LCD。LCD有LED数码显示更好的更的直观效果,也更加经久耐用。液晶显示模块体积小功耗低、显示内容丰富,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件之一了。本LCD是2行16列液晶 可显示2行16列英文字符,有8位数据总线D0-D7,RS,R/W,EN三个控制端口(共14线),工作电压为5V。没背光,和常用的1602B功能和引脚一样(除了调背光的二个线脚). 该模块也可以只用D4-D7作为四位数据分两次传送。这样的话可以节省MCU的I/O口资源。图5: LM016L LCD引脚说明:VDD:电源正极,4.55.5V,通常使用5V电压;VL:LCD对比度调节端,电压调节范围为05V。接正电源时对比度最弱,接地电源时对比度最高,但对比度过高时会产生“鬼影”,因此通常使用一个10K的电位器来调整对比度,或者直接串接一个电阻到地;RS:MCU写入数据或者指令选择端。MCU要写入指令时,使RS为低电平;MCU要写入数据时,使RS为高电平;R/W:读写控制端。R/W为高电平时,读取数据;R/W为低电平时,写入数据;E:LCD模块使能信号控制端。写数据时,需要下降沿触发模块。D0D7:8位数据总线,三态双向。如果MCU的I/O口资源紧张的话,该模块也可以只使用4位数据线D4D7接口传送数据。本充电器就是采用4位数据传送方式;BLA: LED背光正极。需要背光时,BLA串接一个限流电阻接VDD,BLK接地,实测该模块的背光电流为50mA左右;BLK: LED背光地端。2.2.4喇叭部分的电路 扬声器的电路部分比较简单,如图,通过单片机发出的控制信号经过简单的放大和处理后直接控制LS1喇叭。图6: SPEAKER部分电路图其中2N5088的参数为:类型:NPN集电极发射集最小雪崩电压Vceo(V):30集电极最大电流Ic(max)(mA):0.050直流电流增益hFE最小值(dB):350直流电流增益hFE最大值(dB):最小电流增益带宽乘积Ft(MHz):50封装/温度():TO92/-55150 采用2N5088将获得更好更纯净的声音信号LS1是经典常见的喇叭.。3 软件设计3.1软件设计概述这里用汇编的单片机程序构成了本LCD电子闹钟的软件系统。该程序实现时间及定时(时间以0点0分0秒为基准计算,闹铃定时以0时0分为基准计算)的显示,有外中断0和五个开关实现校时,闹钟功能。其中程序的晶振频率为12MHz,最小计时单位为1/20秒。主芯片p0.1-p0.7输出数据到LCD数据总线,p2.0-2.2输出LCD控制信号,P3.7输出声音信号,.P1.4-P1.5输入外部控制信号,整个软件系统也是根据这个关系连接成一个完整的系统。最后经过反复的修改和实验最终确定了主程序见附录1,并附有十分详细的注释.因为注释已经详细的介绍了软件设计的细节过程下面仅就软件系统特定的部分进行详细的说明,其他细节不再一一详述,3.2主函数的设计本LCD电子闹钟的的主程序流程图如图7所示,。程序初始化P1-4=1?显示闹钟定时 NO Yes显示日期时间 判断是否到闹钟定时时间 YesLS1喇叭响图7: 主函数流程图1系统初始化定时器初始化定时器初始化串口初始化显示待机指示符设定闹铃时间判设置闹铃时间否?显示刷新启动走时有关变量初始化刷新显示判断日期是否变化化否?秒指示判断时间是否变化闹铃判是否到闹铃时间?延时YYYY图8: 主函数流程图23.3 部分设计思想的说明3.3.1程序初始化在系统开始上电时,需要对C51主芯片和周边电路进行初始化.首先初始化主芯片:ORG 0000HLJMP STARTORG 000BHLJMP TIMER0ORG 001BHLJMP TIMER1ORG 0100HSTART: MOV SP,#60HMOV R0,#18HMOV A,#00HMEM_INI: MOV R0,AINC R0CJNE R0,#5FH,MEM_INI然后就是对LCD进行初始化,具体程序见附录13.3.2闹钟的实现闹钟功能的实现涉及到两个方面:闹铃时间设定和是否闹铃判别与相应处理。闹铃时间设定模块的设计可参照时间设定模块,这里着重阐述闹铃判别与处理模块的设计问题。闹铃判别与闹铃处理的关键在于判别何时要进行闹铃。当时十位、时个位、分十位、分个位中任一位发生改变(进位)时,就必须进行闹铃判别。程序设计思想如图。时十位、个位,分十位、个位改变了设置闹铃标志是否设置了闹铃清除闹铃标志判当前时间是设定时间中断返回中断返回闹铃判别处理图9:闹铃实现思想流程图3.3.3显示程序显示程序包括时钟显示和定时显示程序。具体程序见附1液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表3是TC1602EL液晶模块的内部显示地址。12345678910111213141516000102030405060708090A0B0C0D0E0F404142434445464748494A4B4C4D4E4F比如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)10000000B(80H)11000000B(C0H),液晶模块内带标准字库,内部的字符发生存储器(CGROM)已经存储了192个5×7点阵字符,32个5×10点阵字符。另外还有字符生成RAM (CGRAM)512字节,供用户自定义字符。如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固 定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。指令RSR/WD7D6D5D4D3D2D10清显示0000000001光标返回000000001*置输入模式00000001I/DS显示开/关控制0000000DCB光标/字符移位置000000S/CR/L*置功能00001DLNF*置字符发生存储器地址0001字符发生存储器地址(ACG)置数据存储器地址001显示数据存储器地址(ADD)读忙标志或地址010计数器地址(AC)写数到CGRAM/DDRAM1要写入的数据从CGRAM/DDRAM读数11读出的数据 液晶模块内部的控制器共有11条控制指令:指令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:读数据时钟显示和定时显示程序都是应用动态显示,即将字形代码送入字形锁存器;再将所要显示的位置代码送入字位锁存器锁存。为防止闪烁,每位显示时间都调用延时程序进行短暂延时,然后显示另一位。4 Proteus软件仿真将完整的单片机程序保存为后缀名为.asm文件。打开伟福E6000软件,,点击伟福E6000主菜单当中的仿真器,在下拉菜单中点击仿真器设置。在弹出对话框中,语言对话框中选Keil C(V5或更高), 英特尔PL/M51,英特尔汇编器,仿真器对话框中G6W-POD-51-8031,晶振频率栏填12000000(Hz ),然后点击好完成仿真器设置。然后点击伟福E6000主菜单,新建项目,导入上述ASM文件,选择无包含文件,保存此项目文件,再双击ASM文件打开 ,然后选择项目编译或按F9,对.asm文件进行编译,编译顺利完成,生成.HEX文件。然后用PROTEUS7.1软件打开设计好的硬件系统原理图DZZ.dsn,双击原理图上的AT89C51单片机加载DZZ.HEX文件。然后点击PROTEUS7.1软件窗口下方的相应仿真运行按纽进行仿真.经过反复的防真和调试,此闹钟可以实现所有的功能,既可以显示日期时间,也可以方便的调整日期和时间,定闹钟的功能也正常.实际的防真效果截图如下图(图10、图11),其中图10是正在调整定闹钟的时间,图11是调整显示时钟的时间。至此整个设计基本成功的完成.图10:仿真效果截图(调整和显示定时)图11:仿真效果截图(调整和显示时钟)5课程设计体会单片机是计算机技术发展的产物,是经济实用开发简便的高科技产品,在当今工业控制、家电等领域占据广泛的市场。通过此次单片机课程设计来设计个简单的数字闹钟,我巩固了自己学习的单片机知识,来初步了解了小型单片机系统的设计和运用,并提高自己实际动手能力。,课程设计过程也使我了解了自己能力的不足,不过通过资料收集和文献查询等方法,找出了设计过程中的一些问题以及解决问题的方法,从而比较顺利的完成了这个设计任务。这次自己所做的设计取得了一些宝贵的经验,提高了自己的动手能力,为将来的学习和工作很有好处。通过这次课程设计我学到了很多全新的在课堂上没法学到的知识,同时也加深了以前所学知识的理解,也增强了理论联系实际的操作能力。但是,在实际的编程以及调试程序过程中,我发现自己应该学的还有太多太多。光靠书本上是远远行不通的! 总之,理论必须和实际结合才有威力,知识必须通过应用才能实现其价值!所学的东西最终是要面向社会,是在以后的工作能够更好的应用,此时的知识积累是为以后的工作做好坚实的基础。这个设计总体上不算完美,但是在这个课程设计的经历的好处是不可估量的。参考文献:1余发山单片机原理及应用技术中国矿业大学出版社2孙涵芳MCS-51系列单片机原理及应用M 北京:北京航空航天大学出版社1996-43王义军.单片机原理及应用习题与实验指导书M.北京:中国电力出版社,20064陈明荧.8051单片机课程设计实训教材M.北京,清华大学出版社,20045唐前辉、丁明亮. 重庆电专PROTEUS中文入门教程6彭小军用单片机实现电子时钟新余高等专科学报,20047黄正谨综合电子设计与实践东南大学出版社2002-38高峰. 单片机应用系统设计及实用技术,北京机械工业出版社,2004附1 源程序代码/*;按K1键,依次进入闹钟功能,闹钟时间,年,月,日和时,分,秒模式,直致退出设置状态 *;按K2键,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字 *;闹钟响时,按K2 即可停止闹钟的声响 *;K2和K1需要配合使用;设置状态,LCD 上排最前面显示"P",下排最前面设置闹钟时显示"alarm:",其他显示"time:" *;闹钟启用时,在LCD 下排中间显示一小喇叭,闹钟禁用时,无此小喇叭 *;年代变化2000-2099,星期自动转换 *;*变量的定义*RS BIT P2.0 ;LCD 数据/命令选择端(H/L)RW BIT P2.1 ;LCD读/写选择端(H/L)EP BIT P2.2 ;LCD 使能控制PRE BIT P1.7 ;调整键(K1)ADJ BIT P1.6 ;调整键(K2)SPK BIT P3.7 ;闹钟声音输出口YEAR DATA 18H ;年,月,日变量MONTH DATA 19HDATE DATA 1AHWEEK DATA 1BHHOUR DATA 1CH ;时,分,秒,百分之一秒变量MIN DATA 1DHSEC DATA 1EHSEC100 DATA 1FHHOUR_ARM DATA 20H ;闹钟时,分,秒,变量MIN_ARM DATA 21HSEC_ARM DATA 22HSTATE DATA 23HALARM BIT STATE.0 ;闹钟是否启用标志1-启用,0-禁止LEAP BIT STATE.1 ;是否闰年标志1-闰年,0-平年KEY_S DATA 24H ;当前扫描键值KEY_V DATA 25H ;上次扫描键值DIS_BUF_U0 DATA 26H ;LCD 上排显示缓冲区DIS_BUF_U1 DATA 27HDIS_BUF_U2 DATA 28HDIS_BUF_U3 DATA 29HDIS_BUF_U4 DATA 2AHDIS_BUF_U5 DATA 2BHDIS_BUF_U6 DATA 2CHDIS_BUF_U7 DATA 2DHDIS_BUF_U8 DATA 2EHDIS_BUF_U9 DATA 2FHDIS_BUF_U10 DATA 30HDIS_BUF_U11 DATA 31HDIS_BUF_U12 DATA 32HDIS_BUF_U13 DATA 33HDIS_BUF_U14 DATA 34HDIS_BUF_U15 DATA 35HDIS_BUF_L0 DATA 36H ;LCD 下排显示缓冲区DIS_BUF_L1 DATA 37HDIS_BUF_L2 DATA 38HDIS_BUF_L3 DATA 39HDIS_BUF_L4 DATA 3AHDIS_BUF_L5 DATA 3BHDIS_BUF_L6 DATA 3CHDIS_BUF_L7 DATA 3DHDIS_BUF_L8 DATA 3EHDIS_BUF_L9 DATA 3FHDIS_BUF_L10 DATA 40HDIS_BUF_L11 DATA 41HDIS_BUF_L12 DATA 42HDIS_BUF_L13 DATA 43HDIS_BUF_L14 DATA 44HDIS_BUF_L15 DATA 45HFLAG DATA 46H ;标识调整状态 0-闹钟功能,1-闹钟时,2-闹钟分,3-闹钟秒;4-年,5-月,6-日,7-时,8-分,9-秒,10-退出调整。DIS_H DATA 47HDIS_M DATA 48HDIS_S DATA 49HDIS_S0 DATA 4AHDIS_S1 DATA 4BHDIS_S2 DATA 4CHDIS_S3 DATA 4DHDIS_S4 DATA 4EHDIS_S5 DATA 4FH;*初始化*ORG 0000HLJMP STARTORG 000BHLJMP TIMER0ORG 001BHLJMP TIMER1ORG 0100HSTART: MOV SP,#60HMOV R0,#18HMOV A,#00HMEM_INI: MOV R0,AINC R0CJNE R0,#5FH,MEM_INILCALL DELAY_5ms ;初始化LCDMOV R0,#38H ;设置LCD 为16X2 显示,5X7 点阵,八位数据接口LCALL LCD_WCMDLCALL DELAY_5msMOV R0,#0CH ;设置LCD 开显示及光标形式(光标不闪烁,不显示"-")LCALL LCD_WCMDLCALL DELAY_5msMOV R0,#06H ;LCD 显示光标移动设置(光标地址指针加1,整屏显示不移动)LCALL LCD_WCMDLCALL DELAY_5msMOV R0,#01H ;清除LCD的显示内容LCALL LCD_WCMDLCALL DELAY_5ms;第一自定义字符:MOV R0,#40HLCALL lcd_wcmd ;"01 000 000"第1 行地址 (D7D6 为地址设定命令形式 D5D4D3 为字符存放位置MOV R0,#1FHLCALL lcd_wdat ;"XXX 11111"第1 行数据(D7D6D5 为XXX,表示为任意数(一般用000),MOV R0,#41HLCALL lcd_wcmd ;"01 000 001"第2 行地址MOV R0,#11HLCALL lcd_wdat ;"XXX 10001"第2 行数据MOV R0,#42HLCALL lcd_wcmd ;"01 000 010"第3 行地址MOV R0,#15HLCALL lcd_wdat ;"XXX 10101"第3 行数据MOV R0,#43HLCALL lcd_wcmd ;"01 000 011"第4 行地址MOV R0,#11HLCALL lcd_wdat ;"XXX 10001"第4 行数据MOV R0,#44HLCALL lcd_wcmd ;"01 000 100"第5 行地址MOV R0,#1FHLCALL lcd_wdat ;"XXX 11111"第5 行数据MOV R0,#45HLCALL lcd_wcmd ;"01 000 101"第6 行地址MOV R0,#0AHLCALL lcd_wdat ;"XXX 01010"第6 行数据MOV R0,#46HLCALL lcd_wcmd ;"01 000 110"第7 行地址MOV R0,#1FHLCALL lcd_wdat ;"XXX 11111"第7 行数据MOV R0,#47HLCALL lcd_wcmd ;"01 000 111"第8 行地址MOV R0,#00HLCALL lcd_wdat ;"XXX 00000"第8 行数据;第二个自定义字符:MOV R0,#48HLCALL lcd_wcmd ;"01 001 000"第1 行地址MOV R0,#01HLCALL lcd_wdat ;"XXX 00001"第1 行数据MOV R0,#49HLCALL lcd_wcmd ;"01 001 001"第2 行地址MOV R0,#1BHLCALL lcd_wdat ;"XXX 11011"第2 行数据MOV R0,#4AHLCALL lcd_wcmd ;"01 001 010"第3 行地址MOV R0,#1DHLCALL lcd_wdat ;"XXX 11101"第3 行数据MOV R0,#4BHLCALL lcd_wcmd ;"01 001 011"第4 行地址MOV R0,#19