[信息与通信]基于单片机的闹钟提醒器练达设计.doc
景德镇高等专科学校 毕 业 论 文 选题题目: 单片机的闹钟提醒 指导老师: 邵娟 所属院系: 机电系 专 业: 通信技术 姓 名: 练达 研究方向: 电子技术 选题时间: 2010年11月10 一、设计方案选定1.1 前言:单片计算机即单片微型计算机,(Single-Chip Microcomputer)。是集CPU ,RAM ,ROM,定时,计数和多种接口于一体的微控制器。他体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。而51单片机是各单片机中最为典型和最有代表性的一种。这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。基于单片机的定时和控制装置在许多行业有着广泛的应用。而数字定时闹钟是其中最基本,也是最有代表性的一个实例。数字定时闹钟的设计方法有许多种,例如,可以用中小规模集成电路组成数字定时闹钟,也可以利用专用的时钟芯片配以显示电路及其所需要的外围电路组成数字定时闹钟,还可以利用单片机来实现数字定时闹钟。这些方法都各有其特点,其中,利用单片机来实现数字定时闹钟具有编程灵活、精度高等特点,便于数字定时闹钟功能的扩充,同时还可以用该数字定时闹钟发出各种控制信号1.2 实验目的:1、熟悉集成电路的引脚安排。2、掌握各芯片的逻辑功能及使用方法。3、充分认识单片机设计。4、了解数字钟的组成及工作原理。5、提高同学们的动手能力和编程技巧。1.3总体设计要求1、基本要求:(1) 显示准确的北京时间(时、分、秒),可用24小时制式;(2) 随时可以调校时间。(3)闹铃功能 2、自由发挥部分: (1)秒表功能(2)增加公历日期显示功能(年、月、日),年号只显示最后两位;(3) 随时可以调校年、月、日;(4) 允许通过转换功能键转换显示时间或日期。1.4 方案选定:思路:基于单片机的数字定时闹钟在设计时需要解决三个方面的主要问题:一是LCD显示模块的驱动和编程,二是有关单片机中定时器的使用,三是如何利用单片机的外中断实现时钟功能和运行模式的转化。在基于单片机系统的数字定时闹钟电路中,除了基本的单片机系统和外围电路外,还需要外部的控制和显示装置。在本设计中,输入装置是按键开关,用于控制数字定时闹钟的运行模式,显示装置是LCD液晶显示器。该数字定时闹钟是由AT89C51单片机控制的,可以达到以下效果:1、能够显示“时时-分分-秒秒”。2、能够设定定时时间、修改定时时间。3、定时时间到能够发出一分钟的报警声。AT89C51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。显示部分采用六位一体的共阳极数码管二、硬件电路设计:2.1 AT89C52:AT89C52是51系列单片机的一个型号,它是ATMEL公司生产的。主要功能特性:1、兼容MCS51指令系统。2、8k可反复擦写(>1000次)Flash ROM。 3、32个双向I/O口。 4、256x8bit内部RAM。 5、3个16位可编程定时/计数器中断。 6、时钟频率0-24MHz · 2个串行中断 · 可编程UART串行通道 · 2个外部中断源 · 共6个中断源 · 2个读写中断口线 · 3级加密位 · 低功耗空闲和掉电模式 · 软件设置睡眠和唤醒功能 2.2 复位电路: 为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。一般微机电路正常工作需要供电电源为5V±5%,即4.755.25V。由于微机电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当VCC超过4.75V低于5.25V以及晶体振荡器稳定工作时,复位信号才被撤除,微机电路开始正常工作。 2.3 晶振电路:晶振在数字电路的基本作用是提供一个时序控制的标准时刻。数字电路的工作是根据电路设计,在某个时刻门完成特定的任务,如果没有一个时序控制的标准时刻,整个数字电路就会成为“聋子”,不知道什么时刻该做什么事情了。晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部分保持同步。有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。晶振的工作原理: 主板时钟芯片即分频器的原始工作振荡频率,由石英晶体多谐振荡器的谐振频率来产生,晶振其实是一个频率产生器,他主要把传进去的电压转化为频率信号。提供给分频率一个基准的14.318MHZ的振荡频率,它是一个多谐振荡器的正回馈环电路,也就是说它把输入作为输出,把输出作为输入的回馈频率,象这样一个永无休止的循环自激过程。2.4 时钟显示LCD1602:工业字符型液晶,能够同时显示16x02即32个字符。(16列2行) DS1302:1. 引脚功能及结构 DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc10.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。 下图为DS1302的引脚功能图: DS1302封装图要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F以上)。虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。可以用老式电脑主板上的3.6V充电电池。如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。100 F就可以保证1小时的正常走时。DS1302在第一次加电后,必须进行初始化操作。初始化后就可以按正常方法调整时间。2.5 程序框图:LCD液晶显示电路复位、时钟等电路单片机 闹钟铃声指示电路按钮电路电源系统电子闹钟的主电路指的是图中的框部分,主要设计到单片机电路和按键按钮电路,主机的设计具体地说有:(1)系统时钟电路设计;(2)系统复位电路设计;(3)按键与按钮电路设计;(4)闹铃声指示电路设计。本设计是定时闹钟的设计,由单片机AT89C52芯片和LCD液晶显示器为核心,辅以时钟芯片等必要电路,构成的一个单片机电子定时闹钟。电子钟设计可以采用数字。初始化 程序流程图计时时间显示 比较蜂鸣器响Y闹钟?闹钟标志N读键读键判断定时设定值2.6 MCS-52存储器的结构MCS-52单片机存储器采用的是哈佛结构,即程序存储器空间和数据存储寻空间截然分开,见图3-4。其中程序存储器和数据存储器各有自己的寻址方式、寻址空间和控制系统。这种结构对于单片机“面向控制”的实际应用极为方便、有利。 图2-4 8052/8751单片机的存储器1. 程序存储器MCS-52单片机的程序存储器用于存放应用程序和表格之类的固定常数。可扩充的程序存储器空间最大为64K字节。程序存储器的使用应注意以下两点:(1)整个程序存储器空间可以分为片内和片外两部分,CPU访问片内和片外程序存储器,可由引脚所接的电平来确定。=1,即引脚接高电平时,程序将从片内程序存储器开始执行;当 PC 值超出片内ROM的容量时,会自动转向片外程序存储器空间执行程序。=0,即引脚接低电平时,单片机只执行片外程序存储器中的程序。(2)程序存储器的某些单元被固定用于中断源的中断服务程序的入口地址。MCS-52单片机复位后,程序存储器PC的内容为0000H,故系统从0000H单元开始取指令,执行程序。64K程序存储器中有5个单元具有特殊用途,如下:0003H:外部中断0入口地址。000BH:定时器0中断入口地址。0013H:外部中断1入口地址。001BH:定时器1中断入口地址。0023H:串行口中断入口地址。在系统中断相应之后,将自动转各中断入口地址处执行序,而中断服务程序一般无法存放于几个单元之内,因此在中断入口地址处往往存放一条无条件转移指令进行跳转,以便执行中断服务程序。2.MCS-52内部数据存储器MCS-52单片机的片内数据存储器单元共有128个,字节地址为00H-7FH。 地址为00H-1FH的32个单元是4组通用工作寄存器区,每个区含8个8位寄存器,编号为R7-R0。地址为20H-2FH的16个单元可进行共128位的位寻址。地址为30H -7FH的单元为用户RAM区,只能进行字节寻址。其具体配置见图2-5。图2-5 MCS-52内部数据存储器的配置3. 特殊功能寄存器(SFR)特殊功能寄存器的总数为21个,离散的分布在该区域中,其中有些SFR还可以进行位寻址。表2-3是该寄存器的名称及其地址分布。表 2-3 SFR名称及地址分布特殊功能寄存器符号名称字节地址位地址BB寄存器F0HF7HF0HACC或A累加器AE0HE7HE0HPSW程序状态字PSWD0HD7HD0H中断优先级控制IPB8HBFHB8HP3P3口B0HB7HB0HIE中断允许控制A8HAFHA8HP2P2口A0HA7HA0HSBUF串行数据缓冲器99HSCON串行控制98H9FH98HP1P1口90H97H90HTH1定时器/计数器1(高八位)8DHTH0定时器/计数器0(高八位)8CHTL1定时器/计数器1(低八位)8BHTL0定时器/计数器0(低八位)8AHTMOD定时器/计数器方式控制89HTCON定时器/计数器控制88H8FH88HPCON电源控制87HDPH数据指针高字节83HDPL数据指针低字节82HSP堆栈指针81HP0 P0口80H87H80H4.位地址空间MCS-52单片机指令系统中有丰富的位操作指令,这些指令构成了位处理机的指令集。在RAM和SFR中共有211个位地址,位地址范围在00H-FFH内,其中00H-7FH这128个位处于内部RAM字节地址20H-2FH单元中,如表2-4所示。其余的83个可寻址位分布在特殊功能寄存器SFR中,如表2-5所示。 表2-4 8052内部RAM的可寻址位字节地址位地址D7D6D5D4D3D2D1D02F7FH7EH7DH7CH7BH7AH79H78H2E77H76H75H74H7372H71H70H2D6FH6EH6DH6CH6B6AH69H68H2C67H66H65H64H6362H61H60H2B5FH5EH5DH5CH5B5AH59H58H2A57H56H55H54H5352H51H50H294FH4EH4DH4CH4B4AH49H48H2847H46H45H44H4342H41H40H273FH3EH3DH3CH3B3AH39H38H2637H36H35H34H3332H31H30H252FH2EH2DH2CH2B2AH29H28H2427H26H25H24H2322H21H20H231FH1EH1DH1CH1B1AH19H18H2217H16H15H14H1312H11H10H210FH0EH0DH0CH0B0AH09H08H2007H06H05H04H0302H01H00H表2-5 8052特殊功能寄存器中的位地址SFR符号位地址字节地址D7D6D5D4D3D2D1D0BF7HF6HF5HF4HF3HF2HF1HF0HF0HACCE7HE6HE5HE4HE3HE2HE1HE0HE0HACC.7ACC.6ACC.5ACC.4ACC.3ACC.2ACC.1ACC.0PSWD7HD6HD5HD4HD3HD2HD1HD0HD0HCYACF0RS1RS0OVF1PIP-BDHBCHBBHBAHB9HB8HB8HPT2PSPT1PX1PT0PX0P3B7HB6HB5HB4HB3HB2HB1HB0HB0HP3.7P3.6P3.5P3.4P3.3P3.2P3.1P3.0IEAFH-ACHABHAAHA9HA8HA8HEA-ESET1EX1ET0EX0P2A7HA6HA5HA4HA3HA2HA1HA0HA0HP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0SCON9FH9EH9DH9CH9BH9AH99H98H98HSM0SM1SM2RENTB8RB8T1R1P197H96H95H94H93H92H91H90H90HP1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0TCON8FH8EH8DH8CH8BH8AH89H88H88HTF1TR1TF0TR0IE1IT0IE0IT0P087H86H85H84H83H82H81H80H80HP0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.02.7 MCS-52 的并行I/O口图2-6给出了四个端口中每个典型位锁存器和I/O缓冲器的功能框图。位锁存器作为一个D触发器,根据来自CPU的“写锁存器”信号,记录来自内部总线上的数值。在CPU发出“读锁存器”信号时,将触发器的Q输出值放在内部总线上。在CPU发出“读管脚”信号时,端口管脚本身的电平放到内部总线上。有些“读端口指令”令会激活“读锁存器”信号,而其它指令则激活“读管脚”信号。 并行I/O口的应用要点:(1)P0口通常作为单片机的低字节地址数据复用线,分时使用,即构成A7A0地址线和数据总线(DB)用。(2)P2口一般作为高8位地址线A15A8,使用8031单片机也是这样用的。(3)P1口一般情况下作为通用的I/O口使用。(4)P3口在以下的情况下作为第二功能使用:串行通信使用,外部中断使用;定时器/计数器使用;扩展外部RAM时使用, 控制信号。除上述情况外,则可以当作I/O引脚用。(5)当某一引脚作为输入前,必须使引脚置“1”。复位后,四个口的32个引脚均为高电平(置1)。(6)各个口由于输出结构不同,带负载能力也不同。2.7 MCS-52时钟电路与时序时钟电路用于产生MCS-52单片机工作所必需的时钟信号。在执行指令时,CPU首先要到程序存储器中取出需要执行的指令操作码,然后译码,并由时序电路产生一系列控制信号去完成指令所规定的操作。 1. 时钟电路(1).内部时钟方式 8052单片机内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成一个自激振荡器。图2-7 a)是MCS-52单片机的内部时钟方式的振荡器电路。(2)外部时钟方式外部时钟方式是使用外部振荡脉冲信号,常用于多片MCS-52单片机同时工作,以便于同步。对外部脉冲信号只要求高电平持续时间大于20,一般为低于12MHz的方波。这时,外部振荡器的信号接至XTAL2,即内部时钟发生器的输入端,而内部反相放大器的输入端XTAL1应接地,如图2-7 b)所示。由于XTAL2端的逻辑电平不是TTL的,故建议外接一个上拉电阻。 图2-7 MCS-52的时钟电路 a)片内时钟方式 b)外部时钟方式2 机器周期和指令周期MCS-52的每个机器周期包含6个状态周期,每个状态周期划分为2个节拍,分别对应着2 个节拍时钟有效期间。因此,一个机器周期包含12个振荡器周期,由S1P1(状态1拍1)一直到S6P2(状态6拍2),每个节拍持续一个振荡器周期,每个状态持续2个振荡器周期。若采用12MHz的晶体振荡器,则每个机器周期恰为1S。 通常,每个机器周期ALE两次有效,第1次发生在S1P2和S2P1期间,第2次在S4P2和S5P1期间。 2.8 MCS-52的复位和复位电路复位是单片机的初始化操作,只要RST引脚处至少保持2个机器周期的高电平就可实现复位。复位后,各内部寄存器的状态如表2-6所示。表2-6 8052复位后寄存器的值寄存器内容寄存器内容PC0000HTCON00HACC00HT2CON00HB000HTH000HPSW00HTL000HSP07HTH100HDPTR0000HTL100HP0P30FFHTH200HIP(8051)XXX00000BTL200HIP(8052)XX000000BRLDH00HIE(8051)0XX00000BRLDL00HIE(8052)0X000000BSCON00HTMOD00HSBUF不定PCON(HMOS)0XXXXXXXHPCOM(CHMOS)0XXX0000B2.9 基本电路及工作原理:定时闹钟的设计,由单片机AT89C52芯片和DS1302和LCD液晶显示器为核心,辅以必要的电路,构成一个单片机电子定时闹钟。电子钟设计可以采用数字电路实现,也可以采用单片机来完成。AT89C52的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。AT89C52结合用LCD液晶显示器设计的简易定时闹钟,可以设置限制的时间及显示闹钟设置时间,若时间一到则发车一阵声响,进一步可以扩充控制电器的启停。定时闹钟包括时间显示,按键电路,复位电路,闹铃指示电路等等几部分。三、软件设计:3.1 程序/1602 3*4键盘 蜂鸣器 时钟-闹钟 程序 /功能键 /模式1或模式4时 /12 进入模式2; 11 进入模式3 ;1 退出模式4(当前为模式4),转为模式1/模式2时/12 退出模式2,回到上一模式; 11 光标移位; 1-9 数字键/模式3时/12 光标移位; 11 退出模式3,回到上一模式; 1-9 数字键#include "reg51.h"#include"intrins.h"#define NOP();_nop_(); _nop_(); _nop_(); _nop_(); /* 定义空操作指令 */#define uchar unsigned char#define uint unsigned intuchar ii = 1;uchar mod = 1; /用于标志当前模式 1表示正常工作(没有闹钟),1表示设置时间,2表示设置闹钟,4表示正常工作的同时闹钟还要显示uchar mod_last = 0; /记录上一模式uchar n; /辅助延时 1s 的计数变量,用于定时器0uint n_T1; /用于定时器1uchar hour,min,sec; /时间uchar hour_r,min_r,sec_r; /闹钟时间uchar h_temp,m_temp,s_temp;uchar time=0, 0, 0, 0, 0, 0;uchar time_r=0, 0, 0, 0, 0, 0;sbit bell= P34; /*蜂鸣器*/bit FLAG0=0; / 扫描键盘的标志位uchar ptr = 13; / 哪个键按下了?uchar ptr_last = 0; /上一次扫描键盘值,通过和这次比较,用于检测上升沿uchar count = 0;/设置时间时记住设置到哪位(时2位,分2位,秒2位,共6位,依次为1到6)?bit mm = 0; /闪烁扫描的标志位,0 不显示,1 显示sbit LCD_RS=P10; /RS为液晶的寄存器选择,高电平选择数据寄存器、低电平选择指令寄存器。sbit LCD_EN=P12; /E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。sbit LCD_RW=P11; /RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当/RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。uchar time_h,time_l; /校正定时器的临时变量void delay(uint x) /简单延时 uchar j; while(x->0) /判断完x是否大于0,无论结果,x就- for(j=0;j<125;j+) ; void scan_key(void) /*扫描键盘副程式*/ uchar a1=0xF7,i,m; /*A1=0XF7列扫描初值,I行*/ FLAG0=0; /*设按键回应旗号为0,键盘扫描计数指标为0*/ for(i=1;i<5;i+) /*键盘3个扫描列*/ P0=a1; /*列扫描输出,读入P1存入M,以便侦测行与侦测按键是否放开*/ m=P0; switch(m&0x87) /*取行的高4位元,侦测那一行被按*/ case 0x83: if(i=1)ptr=1; if(i=2)ptr=4; if(i=3)ptr=7; if(i=4)ptr=10; FLAG0=1; /*是则设FLAG0=1表有按键输入*/ break; /*跳出此循环*/ case 0x85: if(i=1)ptr=2; if(i=2)ptr=5; if(i=3)ptr=8; if(i=4)ptr=11; FLAG0=1; /*是则设FLAG0=1表有按键输入*/ break; /*跳出此循环*/ case 0x86: if(i=1)ptr=3; if(i=2)ptr=6; if(i=3)ptr=9; if(i=4)ptr=12; FLAG0=1; /*是则设FLAG0=1表有按键输入*/ break; /*跳出此循环*/ default: break; /*跳出此循环*/ if(FLAG0=1)break; /*不为1,则扫描列右移,扫描下一列*/ a1=(a1<<1)|0x87; /检测到按键就让蜂鸣器响一下 if(FLAG0) bell = 0; delay(160); bell = 1; void LCD_STROBE(void) /*LCD闸门滤波,或者说液晶使能?*/ LCD_EN=1; NOP(); LCD_EN=0;unsigned char lcd_read_cmd_nowait(void) unsigned char readc; LCD_RW=1; /读模式 当RS为低电平RW为高电平时可以读忙信号 LCD_EN=1; /关液晶? NOP(); readc=P0; LCD_EN=0; /* 返回写入液晶的默认模式*/ LCD_RW=0; /低电平时进行写操作 return(readc);void lcd_check_busy(void) /*当液晶不再busy,或者等待时间足够长时,返回*/ unsigned int retry; unsigned char c; for(retry=1000;retry>0;retry-) /如果一直都忙,重试1000次? c=lcd_read_cmd_nowait(); /* Check busy bit. If zero, no longer busy*/ if(0=(c&0x80) /与操作 break; /如果c的最高位为0,退出重试,说明不忙 void lcd_cmd(unsigned char c) /*发一个命令到液晶*/ P2=c; LCD_STROBE(); / LCD闸门滤波 有什么用?液晶使能?void lcd_data(unsigned char c) /*发数据到液晶*/ lcd_check_busy(); /出这个函数时 LCD_RW=0; LCD_RS=1; /作用?为高电平时选择数据寄存器 当RS为高电平RW为低电平时可以写入数据 NOP(); P2=c; /向P0输入数据 LCD_STROBE(); LCD_RS=0; /作用?为低电平时选择指令寄存器 当RS和RW共同为低电平时,可以写入指令或者写入显示的地址 为下一次的lcd_cmd(?) 做准备void lcd_puts(const char *s) /*写一串字符到液晶*/ while(*s) /如果指针所指有内容 lcd_data(*s+); /先输出 *s ,然后 s 进行 + 操作;s是指针,*s是指针的内容void clear_display(void) /*液晶清屏*/ lcd_cmd(0xc0); /第二行 lcd_puts(" "); lcd_cmd(0x80); /第一行 lcd_puts(" ");void lcd_init(void) /*液晶初始化*/ LCD_RS=0; /选指令寄存器 LCD_EN=0; / LCD_RW=0; /RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时,可以写入指令或者写入显示的地址。工作时都为低? delay(5000/125); /为什么要延时?延时5000us = 5 ms 大概 P2=0x3f; / Set Function: 8位接口,两行显示,5*10点阵 0x3f LCD_STROBE(); lcd_cmd(0x38);/8 bits interface,2 lines display.5×点阵7/但是这块东西最多支持5*8所以5*10没意义 lcd_cmd(0x0f);/Display On(整体显示), Cursor(指针、光标) On, Blink(指针:闪烁、眨闪) on lcd_cmd(0x01); /Display Clear 也可以写成 0x1(所有内容消除,把光标定位到第一行第一位) lcd_cmd(0x06); /Entry Mode (set cursor move direction: cursor moves increase,(Specifies shift of display)display is not shifted /指令3:(D2 = 1); (D1):光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移; (D0): S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效 clear_display();void change(void) time0=hour/10; /时间更新 time1=hour%10; time2=min/10; time3=min%10; time4=sec/10; time5=sec%10; time_r0=hour_r/10; /闹时更新,只有在模式3中才会?,在其他时候也不影响 time_r1=hour_r%10; time_r2=min_r/10; time_r3=min_r%10; time_r4=sec_r/10; time_r5=sec_r%10; void display(uchar tmp) switch(tmp) case 0 : lcd_puts("0"); break; case 1 : lcd_puts("1"); break; case 2 : lcd_puts("2"); break; case 3 : lcd_puts("3"); break; case 4 : lcd_puts("4"); break; case 5 : lcd_puts("5"); break; case 6 : lcd_puts("6"); break; case 7 : lcd_puts("7"); break; case 8 : lcd_puts("8"); break; case 9 : lcd_puts("9"); break; default : ; void scan() /正常工作时扫描液晶 lcd_cmd(0xc0); if(mod = 3|mod = 4) lcd_puts("T: "); /共16位 else if(mod = 1|mod = 2) lcd_puts(" "); /共16位 lcd_cmd(0xc4); /时 display(time0); lcd_cmd(0xc5); display(time1); lcd_cmd(0xc6); lcd_puts(":"); lcd_cmd(0xc7); /分 display(time2); lcd_cmd(0xc8); display(time3); lcd_cmd(0xc9); lcd_puts(":"); lcd_cmd(0xca); /秒 display(time4); lcd_cmd(0xcb); display(time5); lcd_cmd(0xcc); lcd_puts(" "); if(mod = 3|mod = 4) /模式3与模式4时,扫描第一行显示 lcd_cmd(0x80); /前面四位 if(mod = 3) lcd_puts("SR: "); /共16位,SR 设置闹钟 else lcd_puts("R: "); /共16位 lcd_cmd(0x84); /闹时 display(time_r0); lcd_cmd(0x85); display(time_r1); lcd_cmd(0x86); lcd_puts(":"); lcd_cmd(0x87); /闹分 display(time_r2); lcd_cmd(0x88); display(time_r3); lcd_cmd(0x89);