河南机电高等专科学校
毕业设计论文
论文题目:基51单片机的电子万年历
系 部 电子通信工程系 专 业 班 级 学生姓名 学 号 指导教师
2012年 3月10日
河南机电高等专科学校毕业设计/论文
摘 要 .............................................................. 2 Abstract ........................................................... 3 一、设计要求与方案论证 ............................................. 4
1.1 设计要求 ..................................................................................................................... 4 1.2 系统基本方案选择和论证 ....................................................................................... 4
1.2.1单片机芯片的选择方案和论证 ................................................................... 4 1.2.2 显示模块选择方案和论证 ........................................................................... 4 1.2.3时钟芯片的选择方案和论证 ....................................................................... 5 1.2.4 键盘模块的选择 ............................................................................................. 5
二.系统的硬件设计与实现 ............................................ 6
2.1 电路设计框图 .............................................................................................................. 6 2.2 系统硬件概述 .............................................................................................................. 6 2.3 主要单元电路的设计 ................................................................................................ 6
2.3.1单片机主控制模块的设计 ............................................................................ 6 2.3.2时钟电路模块的设计 ..................................................................................... 7 2.3.3蜂鸣器模块设计 .............................................................................................. 8 2.4电路原理及说明 ........................................................................................................... 8
2.4.1 时钟芯片DS1302的工作原理 .................................................................... 9 2.4.2 Nokia5110显示模块工作原理 ................................................................. 10 2.4.3键盘模块工作原理 ........................................................................................ 17
三、系统的软件设计 ................................................ 18
3.1主程序流程框图 ......................................................................................................... 18 3.2设置模块流程图 ......................................................................................................... 18 四、系统功能简介 .................................................. 19 五、设计总结 ...................................................... 20 致谢............................................................... 20 参考文献........................................................... 20 附录一 系统原理图................................................. 21 附录2 PCB ........................................................ 21 附录3 源程序代码 ................................................. 22
1
河南机电高等专科学校毕业设计/论文
摘 要
单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。单片机是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而51系列单片机是各单片机中最为典型和最有代表性的一种。这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。 本文通过对一个基于单片机的能实现万年历功能电子时钟的设计,从而达到学习、了解单片机相关指令在各方面的应用。系统由主控制器ATS52、时钟电路DS1302、显示电路、按键电路、和复位电路等部分构成,能实现年月日时分秒及周信息,具有可调整日期和时间功能。
关键词:单片机,时钟芯片DS1302,nokia5110显示屏
2
河南机电高等专科学校毕业设计/论文
Abstract
SCM application technology develop rapidly, looking around us now in all spheres of life, from missiles, navigation equipment, to the various instruments on the aircraft control from a computer network communications and data transmission, industrial automation to real-time process control and data processing, and our lives extensive use of the smart card, electronic pets, which is inseparable from the microcontroller. Monolithic single-chip is the set of CPU, RAM, ROM, the timing, number and variety of interface integrated microcontrollers. Its small size, low cost, high performance, which are widely used in smart industries, and industrial automation. And 51 Series SCM is the most typical and the most representative one. The graduation design Through the study, and thereby achieve the study, design, development hardware and software capabilities.
In this paper, a microcontroller-based design to achieve a perpetual calendar function electronic clock, so as to achieve the learning, understanding the application of SCM-related instruction in all aspects. The system of DS1302 by the master controller ATS52, clock circuits, circuit, circuit button, and reset circuit parts, to achieve the date, hour and weeks, with adjustable date and time functions.
Keywords:SCM ,Clock chip DS1302 ,nokia5110 display
3
河南机电高等专科学校毕业设计/论文
一、设计要求与方案论证
1.1 设计要求
① 具有年、月、日、星期、时、分、秒等显示功能; ② 具备年、月、日、星期、时、分、秒调整功能; ③ 利用单片机自身功能实现闹钟;
1.2 系统基本方案选择和论证
1.2.1单片机芯片的选择方案和论证
方案一:
采用C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。 方案二:
采用ATS52,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
由于此次制作的万年历程序较大,4KB可能会不够,而且ATS52调试更为方便,所以选择采用ATS52作为主控制系统.
1.2.2 显示模块选择方案和论证
方案一:
采用 LCD1602作为显示模块。能显示两行数据,体积精小,成本低,但是不能显示中文。 方案二:
采用 LCD128作为显示模块。能显示多行数据并能显示图片和中文,但体积庞大,成本高。 方案三:
采用LED数码管动态扫描,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。但是不能显示汉字,字母。 方案五:
采用nokia5110液晶屏,其控制与驱动芯片为PCD8544 ,PCD8544 是一块低功耗的 CMOS LCD 控制驱动器 ,设计为驱动48行84列的图形显示. 所有必需的显示功能集成在一块芯片上 ,包括 LCD 电压及偏置电压发生器 ,只需很少外部元件且功耗小. 而且现在拆机的屏幕价格便宜,性价比较高。
本次设计的万年历需要显示年,月,日,时,分,秒,农历„ 所以最终选择了价格便宜,显示效果相对出色的nokia5110液晶显示屏。
4
河南机电高等专科学校毕业设计/论文
1.2.3时钟芯片的选择方案和论证
方案一:
ATS52单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能,,因此可以利用此功能实现计时,但因为只有单一的计时功能要实现“万年历”的功能需要较复杂的程序,而且时间误差较大。 方案二:
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。利用单片机强大的控制功能就可实现实时计时的功能,而且消耗的系统资源少,程序简单。
为了简化程序,避免掉电数据丢失所以采用方案二。
1.2.4 键盘模块的选择
在对日期和时间进行切换,对日期和时间进行调节校准过程中,系统需要产生激励电流,因此需要用按键。
方案一:使用式键盘。式键盘是指直接用I/O口线构成的单个按 方案二:使用矩阵式键盘。矩阵式键盘是由行线和列线组成,按键位于行、键电路。式按键电路配置灵活,软件结构简单。
列的交叉点上,行线、列线分别连接到按键开关的两端。其特点是简单且不增加成本,这种键盘适合按键数量较多的场合。
根据以上的论述,因本系统需要的按键较少而且方案一软件设计相对简单。所以采用方案一式键盘。
5
河南机电高等专科学校毕业设计/论文
二.系统的硬件设计与实现
2.1 电路设计框图
图2-1 电路设计框图
2.2 系统硬件概述
本电路是由ATS52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;显示模块是诺基亚5110手机显示屏,其控制与驱动芯片为PCD8544 ,设计为驱动48行84列的图形显示.可以显示4 行汉字。采用串行接口与主处理器进行通信,接口信号线数量大幅度减少,包括电源和地在内的信号线仅有9 条。支持多种串行通信协议(如AVR 单片机的SPI、MCS51 的串口模式等),传输速率高达4Mbps,可全速写入显示数据,无等待时间。可通过导电胶连接模块与印制版,而不用连接电缆,用模块上的金属钩可将模块固定到印制板上,因而非常便于安装和更换。采用低电压供电,正常显示时的工作电流在200μA 以下,且具有掉电模式。
2.3 主要单元电路的设计
2.3.1单片机主控制模块的设计
ATS52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能地作输
6
河南机电高等专科学校毕业设计/论文
出或输入。
单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端, 31引脚为EA/VPP,当输入高电平时,CPU从片内程序存储器地址0000H单元开始执行程序。当地址超出4KB时,将自动执行片外程序存储器的程序。当EA输入低电平时,CPU仅访问片外程序存储器。40引脚为电源端.如图2-2 所示
图2-2 主控制系统
2.3.2时钟电路模块的设计
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭
的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK为时钟输入端。 下面两个图
7
河南机电高等专科学校毕业设计/论文
分别为DS1302的引脚功能图,DS1302与单片机的接口电路。
图2-3 DS1302功能引脚
图2-4 DS1302与单片机接口电路
2.3.3蜂鸣器模块设计
当前时间等于闹钟所设置时间时蜂鸣器便会发出声音提示,该模块与单片机
连接如图2-5所示。
图2-5 蜂鸣器与单片机连接
2.4电路原理及说明
8
河南机电高等专科学校毕业设计/论文
2.4.1 时钟芯片DS1302的工作原理
(一)DS1302的基本操作
DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着
把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图4所示。图5为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表6为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP” 是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。
(2) DS1302的控制字节
DS1302的控制字如表2-1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出
表2-1 DS1302的控制字格式
RAM RD 1 A4 A3 A2 A1 A0
/ CK /WR
(3) 数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如下图2-6所示
9
河南机电高等专科学校毕业设计/论文
图2-6 DS1302读/写时序图
(4) DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表2-2。
表2-2 DS1302的日历、时间寄存器
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
2.4.2 Nokia5110显示模块工作原理 (一)Nokia5110显示屏原理图与封装图
10
河南机电高等专科学校毕业设计/论文
图2-7 Nokia5110液晶屏原理图
图2-8 Nokia5110液晶屏pcb封装图
(二)各个引脚功能说明
11
河南机电高等专科学校毕业设计/论文
表2-3 各个引脚功能说明
(三) SPI接口时序写数据/命令
Nokia5110(PCD8544)的通信协议是一个没有MISO只有MOSI的SPI协议,如果单片机有富裕的SPI接口,也可以利用硬件SPI,但通常没有必要,只需要软件程序模拟即可。图2-9为串行总线协议传送一个字节时序图。
图2-9 串行总线协议传送一个字节时序图
/*********************************************************** 函数名称:LCD_write_byte
函数功能:模拟SPI接口时序写数据/命令LCD 入口参数:data :写入的数据;
command :写数据/命令选择; 出口参数:无 备 注:
***********************************************************/
12
河南机电高等专科学校毕业设计/论文
void LCD_write_byte(unsigned char dat, unsigned char command) {
unsigned char i;
LCD_CE = 0; if (command == 0) LCD_DC = 0; else LCD_DC = 1; for(i=0;i<8;i++) {
if(dat&0x80)
SDIN = 1;
else
SDIN = 0; SCLK = 0;
dat = dat << 1; SCLK = 1;
//禁止5110
//5110片选有效,允许输入数据 //写命令
//写数据
//传送8bit数据
}
LCD_CE = 1; }
管脚D/C(LCD_DC)用于选择写的是命令(D/C=0)还是数据(D/C=1)。
(四) Nokia5110的初始化
接通电源后,内部寄存器和RAM的内容是不确定的,这需要一个RES低电平脉冲复位一下。当VDD变为高电平,达到VDDmin(或更高)之后,最多100ms,RST输入低电平(电平幅度<0.3VDD)。图2-10为Nokia5110液晶屏复位时序图。
图2-10 5110复位时序
/*********************************************************** 函数名称:LCD_init 函数功能:5110初始化 入口参数:无
13
河南机电高等专科学校毕业设计/论文
出口参数:无
备 注:
***********************************************************/ void LCD_init(void) {
LCD_RST = 0; // 产生一个让LCD复位的低电平脉冲 delay_1us(); LCD_RST = 1;
LCD_CE = 0; // 关闭LCD delay_1us();
LCD_CE = 1; // 使能LCD delay_1us();
LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式 LCD_write_byte(0xc8, 0); // 设置液晶偏置电压 LCD_write_byte(0x06, 0); // 温度校正 LCD_write_byte(0x13, 0); // 1:48
LCD_write_byte(0x20, 0); // 使用基本命令,V=0,水平寻址 LCD_clear(); // 清屏
LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
LCD_CE = 0; // 关闭LCD }
(五)设置Nokia5110液晶的坐标
Nokia5110(PCD8544)的命令集:
14
河南机电高等专科学校毕业设计/论文
表2-4 Nokia5110命令集
命令字符解释:
表2-5 命令字符解释
要注意的是“功能设置”命令的“H”和“V”。
H=0使用基本指令集命令,H=1使用扩展指令集命令。 V=0水平寻址,V=1垂直寻址。
图2-11 格式和寻址
15
河南机电高等专科学校毕业设计/论文
48*84点阵的格式如上图,数据以字节8bit为单位下载到PCD8544的48*84bit显示数据RAM矩阵。列通过地址指针寻址,地址范围为X 0~83(1010011),Y 0~5(101)。地址不允许超过这个范围。
图2-12 用垂直寻址方式(v=1)往RAM写数据的次序
在垂直寻址(V=1),Y地址在每个字节之后递增,经最后的Y地址(Y=5)之后,Y绕回0,X递增到下一列的地址。
图2-13 用水平寻址方式(v=0)往RAM写数据的次序
在水平寻址模式(V=0),X地址在每个字节之后递增,经最后的X地址(X=83)之后,X绕回0,Y递增到下一行的地址。
经每一个最后地址之后(X=83,Y=5),地址指针绕回地址(X=0,Y=0)。
/*********************************************************** 函数名称:LCD_set_XY
函数功能:设置LCD坐标函数 入口参数:X :0-83 Y :0-5 出口参数:无 备 注:
***********************************************************/
16
河南机电高等专科学校毕业设计/论文
void LCD_set_XY(unsigned char X, unsigned char Y) {
LCD_write_byte(0x40 | Y, 0); // column LCD_write_byte(0x80 | X, 0); // row }
2.4.3键盘模块工作原理
(一)按键开关去抖动问题
按键开关在电路中的连接如图所示。按键未按下时,A点电位为高电平5V;按键按下时,A点电位为低电平。A点电位就用于向CPU传递按键的开关状态。但是由于按键的结构为机械弹性开关,在按键按下和断开时,触点在闭合和断开瞬间还会接触不稳定,引起A点电平不稳定,如图2-14 b)所示,键盘的抖动时间一般为5~10ms,抖动现象会引起CPU对一次键操作进行多次处理,从而可能产生错误。因此必须设法消除抖动的不良后果。
图2-14 按键开关电路及按键抖动
消除抖动的不良后果的方法有硬、软件两种。
为了节省硬件,通常在单片机系统中,一般不采用硬件方法消除键的抖动,而是用软件消除抖动的方法。根据抖动特性,在第一次检测到按键按下后,执行一段延时5~10ms让前延抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认真正有键按下。当检测到按键释放后,也要给5~10ms的延时,待后延抖动消失后才转入该键处理程序。
17
河南机电高等专科学校毕业设计/论文
三、系统的软件设计
3.1主程序流程框图
图3-1 主程序流程图
3.2设置模块流程图
18
河南机电高等专科学校毕业设计/论文
开始功能键有效,进入闹钟小时调整扫描按键加键有效小时加一减键有效小时减一加键有效闹钟分加一功能键有效,进入闹钟分钟调整扫描按键减键有效闹钟分减一功能键有效,进入星期调整功能键有效,进入时钟小时调整扫描按键扫描按键加键有效星期加一减键有效星期减一加键有效小时加一减键有效小时减一功能键有效,进入时钟分调整扫描按键加键有效分钟加一减键有效分钟减一功能键有效,进入时钟秒调整扫描按键加键有效秒加一减键有效秒减一功能键有效,进入年调整扫描按键加键有效年加一减键有效年减一功能键有效,进入月调整扫描按键加键有效月加一减键有效月减一功能键有效,进入日调整扫描按键加键有效日加一减键有效日减一功能键有效跳出调整进入主循环
图3-2 设置模块流程图
四、系统功能简介
该万年历采用DS1302作为时钟芯片,NOKIA5110手机屏幕作为显示设备,
19
河南机电高等专科学校毕业设计/论文
ATS52作为主控芯片,而且采用备用电池供电正正实现了掉电时间正常,而且时钟芯片精确度很高,一天只有几秒钟误差,nokia5110显示屏虽然并不大,但是用来显示时分秒、年月日、星期、闹钟时间显示足够了。
本设计一共有四个按键,分别是复位、设置、加、减(在调试好后感觉复位键是多余的)。按下设置键后会进入设置环境,此时时钟会停止,按加、减设置相应的选项,当需要调整其他的选项时只需按下设置键把光标切换到相对应的选项即可。设置完后再次按下设置即可退出设置环境。
五、设计总结
本着简单、实用的原则,本电路并没有加入花俏的功能。只显示时分秒、年月日、星期、闹钟时间。可以设置一组闹钟,默认响铃一分钟,声音比较清脆,原计划采用彩铃,由于电路使用的是蜂鸣器作为发声模块,彩铃会占用比较长的时间,会影响按键检测,最终采用用了平凡而朴实的滴滴声(主要是技术不行)。 在调试时钟模块式也遇到了一些问题,当备用电源和主电源同时接入是芯片会发烫,查看了芯片手册,电路连接并没有问题。后来到网上搜索了一番,很多人也遇到了同样的问题,主要原因是买到了国产芯片(假货),两个电源同时接入是主电源会对备用电源充电导致芯片发烫(国产的芯片对充电控制的不怎么好)。无赖之下切断了主电源,使用备用电源。接通测试,电路工作正常,这才松了一口气。真是“国产芯片”引发的“血案“,看来以后不仅要学好电子技术,还要学会辨认芯片真假。
总的来说这次的制作还是比较顺利的,让我对电路的原理及功能有了更深刻清晰的认识。提高了对电路的分析能力的同时更提高了我们创新设计能力。在软件的编程方面也有所突破。提高与巩固了我们课堂上所学的知识。可谓受益匪浅。
致谢
感谢学院给我们提供了一个展现自己的平台,给了我们一次煅炼机会,提高我们的动手能力和并把知识付诸于实践。
在做作品的日子里得到了指导教师的悉心指导,特此向指导教师致以诚挚的感 谢。也感谢其他提供相关技术帮助的老师和同学,你们支持和鼓励给了我们完成这份作品的信心和动力。在此深表谢意。
参考文献
1 周兴华 编 手把手教你学单片机c程序 北京航空航天大学出版社 2007 2 郭天祥 编 新概念51单片机C语言教程 电子工业出版社 2009 3 杨子文 编 单片机原理及应用 西安电子科技大学出版社 2006 4 诺基5110液晶屏中文PDF资料
20
河南机电高等专科学校毕业设计/论文
附录一 系统原理图
附录2 PCB
21
河南机电高等专科学校毕业设计/论文
附录3 源程序代码
#include sbit sce = P1^0; //片选 sbit res = P1^1; //复位,0复位 sbit dc = P1^2; //1写数据,0写指令 sbit sdin = P1^3; //数据 sbit sclk = P1^4; //时钟 sbit T_CLK = P0^2; /*实时时钟时钟线引脚 */ sbit T_IO = P0^1; /*实时时钟数据线引脚 */ sbit T_RST = P0^0; /*实时时钟复位线引脚 */ sbit jia = P3^6; sbit jian = P3^5; sbit set = P3^4; sbit beep = P2^0; sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; unsigned char code shuzi[]= { /*-- 文字: 0 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, /*-- 文字: 1 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00, 22 /*-- 文字: 2 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00, /*-- 文字: 3 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, /*-- 文字: 4 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x00,0x00,0x03,0x02,0x00, /*-- 文字: 5 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x3C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00, /*-- 文字: 6 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为: 河南机电高等专科学校毕业设计/论文 宽度x高度=6x16 --*/ 0xF8,0x24,0x24,0x2C,0xC0,0x00,0x01,0x02,0x02,0x02,0x01,0x00, /*-- 文字: 7 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x0C,0x04,0xE4,0x1C,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00, /*-- 文字: 8 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, /*-- 文字: 9 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x03,0x02,0x02,0x01,0x00, /*-- 文字: : --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=6x16 --*/ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00, }; 23 unsigned char code hanzi[]= { /*-- 文字: 期 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x82,0xFF,0xAA,0xAA,0xFF,0x82,0x00,0xFF,0x49,0x49,0xFF,0x00,0x04,0x02,0x01,0x00, 0x01,0x02,0x04,0x03,0x00,0x04,0x07,0x00, /*-- 文字: 一 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*-- 文字: 二 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x02,0x02,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00, /*-- 文字: 三 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/ 河南机电高等专科学校毕业设计/论文 /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x00,0x02,0x22,0x22,0x22,0x22,0x22,0x22,0x23,0x02,0x00,0x00,0x04,0x04,0x04,0x04, 0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00, /*-- 文字: 四 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x00,0xFF,0x81,0x41,0x3F,0x01,0x01,0xFF,0x81,0x81,0xFF,0x00,0x00,0x07,0x02,0x02, 0x02,0x02,0x02,0x02,0x02,0x02,0x07,0x00, /*-- 文字: 五 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x00,0x11,0x11,0x91,0x7F,0x11,0x11,0x11,0xF1,0x01,0x00,0x00,0x04,0x04,0x04,0x07, 0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x00, /*-- 文字: 六 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x08,0x08,0x88,0x68,0x09,0x0E,0x28,0x48,0x88,0x08,0x08,0x00,0x04,0x02,0x01,0x00, 24 0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00, /*-- 文字: 日 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,0x07,0x02, 0x02,0x02,0x02,0x02,0x02,0x07,0x00,0x00, /*-- 文字: 年 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x88,0x84,0xF3,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00, /*-- 文字: 月 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,0x04,0x02,0x01, 0x00,0x00,0x04,0x04,0x07,0x00,0x00,0x00, /*-- 文字: 点 --*/ /*-- 宋体9; 此字体下对应的点阵 河南机电高等专科学校毕业设计/论文 为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x00,0x00,0xF0,0x90,0x90,0x9F,0x92,0x92,0xF2,0x02,0x00,0x00,0x04,0x06,0x00,0x00, 0x06,0x00,0x00,0x06,0x00,0x02,0x04,0x00, /*-- 文字: 分 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x20,0x10,0x2C,0x23,0xE0,0x20,0x20,0x23,0xEC,0x10,0x20,0x00,0x04,0x04,0x02,0x01, 0x00,0x04,0x04,0x04,0x03,0x00,0x00,0x00, /*-- 文字: 星 --*/ /*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/ /*-- 高度不是8的倍数,现调整为:宽度x高度=12x16 --*/ 0x00,0x80,0x7F,0x55,0x55,0xF5,0x55,0x55,0x55,0x5F,0x00,0x00,0x05,0x04,0x05,0x05, 0x05,0x07,0x05,0x05,0x05,0x05,0x04,0x00, /*-- 调入了一幅图像:这是您新建的图像 --*/ /*-- 宽度x高度=12x16 --*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x 25 20,0x00, }; unsigned char code alarm[]= { /*-- 调入了一幅图像:这是您新建的图像 --*/ /*-- 宽度x高度=16x16 --*/ 0x00,0x18,0xCC,0x24,0x10,0x08,0x08,0x88,0x88,0x88,0x90,0x24,0xCC,0x18,0x00,0x00, 0x00,0x40,0x63,0x34,0x08,0x10,0x10,0x17,0x10,0x10,0x08,0x34,0x63,0x40,0x00,0x00, }; unsigned char code clock[]= { /*-- 黑块,调整时间数字跳动 --*/ /*-- 宽度x高度=16x16 --*/ 0xE0,0x10,0x08,0x04,0x02,0x02,0xFA,0x82,0x82,0x82,0x04,0x08,0x10,0xE0,0x00,0x00, 0x03,0x04,0x08,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0x10,0x08,0x04,0x03,0x00,0x00, }; void delayms(unsigned ii)//1ms延时函数 { unsigned int i,x; for (x=0;x 河南机电高等专科学校毕业设计/论文 for (i=0;i<120;i++); --------- */ void LCD_init(void) { res=0; delayms(10); res=1; LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令 LCD_write_byte(0xC8,0);//设定液晶偏置电压 LCD_write_byte(0x06,0);//温度校正 LCD_write_byte(0x13,0);;//1:48 LCD_write_byte(0x20,0);//使用基本指令 LCD_write_byte(0x0C,0);//设定显示模式,正常显示 } /*------------------------------------------- LCD_set_XY: 设置LCD坐标函数 输入参数:X:0-83 Y:0-5 编写日期:20080918 ---------------------------------------------*/ void LCD_set_XY(unsigned char X, unsigned char Y) { LCD_write_byte(0x40 | Y, 0);// column LCD_write_byte(0x80 | X, 0);// row } /*------------------------------------------ LCD_clear: LCD清屏函数 26 } } /*-------------------------------------------- LCD_write_byte: 使用SPI接口写数据到LCD 输入参数:dt:写入的数据; command :写数据/命令选择; 编写日期:20080918 ----------------------------------------------*/ void LCD_write_byte(unsigned char dt, unsigned char command) { unsigned char i; sce=0; dc=command; for(i=0;i<8;i++) { if(dt&0x80) sdin=1; else sdin=0; dt=dt<<1; sclk=0; sclk=1; } dc=1; sce=1; sdin=1; } /*--------------------------------------- LCD_init: 5110LCD初始化 编写日期:20080918 -------------------------------- 河南机电高等专科学校毕业设计/论文 编写日期:20080918 --------------------------------------------*/ void LCD_clear(void) { unsigned char t; unsigned char k; LCD_set_XY(0,0); for(t=0;t<6;t++) { for(k=0;k<84;k++) { LCD_write_byte(0x00,1); } } } /*----------------------------------------------------------------------- LCD_draw_map : 位图绘制函数 输入参数:X、Y :位图绘制的起始X、Y坐标; *map :位图点阵数据; Pix_x :位图像素(长) Pix_y :位图像素(宽) 编写日期 :2004-8-13 最后修改日期 :2004-8-13 -----------------------------------------------------------------------*/ void LCD_draw_bmp(unsigned char X,unsigned char Y,unsigned char *map, unsigned char 27 Pix_x,unsigned char Pix_y) { unsigned int i,n; unsigned char row; if (Pix_y%8==0) row=Pix_y/8; //计算位图所占行数 else row=Pix_y/8+1; for (n=0;n LCD_set_XY(X,Y); for(i=0; i } Y++; //换行 } } /*--------------------------------------------- LCD_write_shu: 显示6(宽)*16(高)点阵列数字字母符号等半角类 输入参数:c:显示的字符; 编写日期:20080918 -----------------------------------------------*/ void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符 { unsigned char i; 河南机电高等专科学校毕业设计/论文 LCD_write_byte(hanzi[c*24+i],1); } LCD_set_XY(row*6, page+1);// 列,页 for(i=12; i<24;i++) { LCD_write_byte(hanzi[c*24+i],1); } } unsigned char data Time_data[7]={0x00,0x36,0x14,0x30,0x03,0x05,0x12};/*格式为: 秒 分 时 日 月 星期 年 */ /******************************* 功 能:实时时钟写入一字节 ********************************/ void RTInputByte(unsigned char d) { unsigned char i; ACC = d; for(i=8; i>0; i--) { T_IO = ACC0; T_CLK = 1; T_CLK = 0; ACC = ACC >> 1; } } /******************************** 28 LCD_set_XY(row*6, page);// 列,页 for(i=0; i<6;i++) { LCD_write_byte(shuzi[c*12+i],1); } LCD_set_XY(row*6, page+1);// 列,页 for(i=6; i<12;i++) { LCD_write_byte(shuzi[c*12+i],1); } } /*--------------------------------------------- LCD_write_hanzi: 显示12(宽)*16(高)点阵列汉字等半角类 输入参数:c:显示的字符; 编写日期:20080918 -----------------------------------------------*/ void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符 { unsigned char i; LCD_set_XY(row*6, page);// 列,页 for(i=0; i<12;i++) { 河南机电高等专科学校毕业设计/论文 功 能:实时时钟读取一字节 *********************************/ unsigned char RTOutputByte(void) { unsigned char i; for(i=8; i>0; i--) { ACC = ACC >>1; ACC7 = T_IO; T_CLK = 1; T_CLK = 0; } return(ACC); } /******************************** 功 能:往DS1302写入数据 *********************************/ void W1302(unsigned char ucAddr, unsigned char ucDa) { T_RST = 0; T_CLK = 0; T_RST = 1; RTInputByte(ucAddr); /* 地址,命令 */ RTInputByte(ucDa); /* 写1Byte数据*/ T_CLK = 1; T_RST = 0; } /******************************** 功 能:读取DS1302某地址的数据 ******************************** 29 */ unsigned char R1302(unsigned char ucAddr) { unsigned char ucData; T_RST = 0; T_CLK = 0; T_RST = 1; RTInputByte(ucAddr); /* 地址,命令 */ ucData = RTOutputByte(); /* 读1Byte数据 */ T_CLK = 1; T_RST = 0; return(ucData); } /****************************** 功 能:读取DS1302当前时间 *******************************/ void Get1302(unsigned char ucCurtime[]) { unsigned char i; unsigned char ucAddr = 0x81; for (i=0; i<7; i++) { ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */ ucAddr += 2; } } /*********************************** 功 能:设置时间 河南机电高等专科学校毕业设计/论文 ************************************/ void Set1302(unsigned char *pClock) { unsigned char i; unsigned char ucAddr = 0x80; W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/ for(i =7; i>0; i--) { W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */ pClock++; ucAddr +=2; } W1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/ } /**************设置模块***********/ void hourset(void) //调时 { unsigned char hour; hour=(((Time_data[2]/0x10)*10)+(Time_data[2]%0x10)); if(jia==0) { delayms(15); if(jia==0) { hour++; if(hour>23) hour=0; Time_data[2]=(((hour/10)*0x10 30 )+(hour%10)); while(jia==0); } } if(jian==0) { delayms(15); if(jian==0) { hour--; if(hour==255) hour=23; Time_data[2]=(((hour/10)*0x10)+(hour%10)); while(jian==0); } } } void minuteset(void) //调分 { unsigned char minute; minute=(((Time_data[1]/0x10)*10)+(Time_data[1]%0x10)); if(jia==0) { delayms(15); if(jia==0) { minute++; if(minute>59) minute=0; Time_data[1]=(((minute/10)*0x 河南机电高等专科学校毕业设计/论文 10)+(minute%10)); while(jia==0); } } if(jian==0) { delayms(15); if(jian==0) { minute--; if(minute==255) +(second%10)); while(jia==0); } } if(jian==0) { delayms(15); if(jian==0) { second--; if(second==255) minute=59; Time_data[1]=(((minute/10)*0x10)+(minute%10)); while(jian==0); } } } void secondset(void) //秒调整 { unsigned char second; second=(((Time_data[0]/0x10)*10)+(Time_data[0]%0x10)); if(jia==0) { delayms(15); if(jia==0) { second++; if(second>59) second=0; Time_data[0]=(((second/10)*0x10) 31 second=59; Time_data[0]=(((second/10)*0x10)+(second%10)); while(jian==0); } } } void yearset(void) //调年 { unsigned char year;; year=(((Time_data[6]/0x10)*10)+(Time_data[6]%0x10)); if(jia==0) { delayms(15); if(jia==0) { year++; if(year>99) year=0; Time_data[6]=(((year/10)*0x10)+( 河南机电高等专科学校毕业设计/论文 year%10)); while(jia==0); } } if(jian==0) { delayms(15); if(jian==0) { year--; if(year==255) 0)+(month%10)); while(jia==0); } } if(jian==0) { delayms(15); if(jian==0) { month--; if(month==0) year=99; Time_data[6]=(((year/10)*0x10)+(year%10)); while(jian==0); } } } void monthset(void) //调月 { unsigned char month; month=(((Time_data[4]/0x10)*10)+(Time_data[4]%0x10)); if(jia==0) { delayms(15); if(jia==0) { month++; if(month>12) month=1; Time_data[4]=(((month/10)*0x1 32 month=12; Time_data[4]=(((month/10)*0x10)+(month%10)); while(jian==0); } } } void dayset(void) //调日 { unsigned char day; day=(((Time_data[3]/0x10)*10)+(Time_data[3]%0x10)); if(jia==0) { delayms(15); if(jia==0) { day++; if(day>31) day=1; Time_data[3]=(day/10)*0x10+(day%10); 河南机电高等专科学校毕业设计/论文 while(jia==0); if(jian==0) } } if(jian==0) { delayms(15); if(jian==0) { day--; if(day==0) day=31; { alarm_h--; if(alarm_h==255) alarm_h=23; while(jian==0); } } } void alarmminuteset(void) 钟分钟调整 { if(jia==0) { delayms(15); if(jia==0) { alarm_m++; //闹 Time_data[3]=(day/10)*0x10+(day%10); while(jian==0); } } } unsigned char alarm_h=12; unsigned char alarm_m=0; void alarmhourset(void) //闹钟小时调整 { if(jia==0) { delayms(15); if(jia==0) { alarm_h++; if(alarm_h>23) alarm_h=0; while(jia==0); } } if(jian==0) { delayms(15); 33 if(alarm_m>59) alarm_m=0; while(jia==0) ; } } if(jian==0) { delayms(15); if(jian==0) { alarm_m--; if(alarm_m==255) alarm_m=59; while(jian==0) ; } } 河南机电高等专科学校毕业设计/论文 } /**************星期设置**************/ void weekset(void) { unsigned char num; num=(((Time_data[5]/0x10)*10)+(Time_data[5]%0x10)); if(jia==0) { delayms(15); if(jia==0) { num++; if(num>7) num=1; Time_data[5]=(num/10)*0x10+(num%10); while(jia==0) ; } } if(jian==0) { delayms(15); if(jian==0) { num--; if(num<1) num=7; unsigned char mode=0; void TimeSet(void) //时间调整函数 { if(set==0) { delayms(25); if(set==0) { while(set==0); mode++; } } if(mode==10) { mode=0; Set1302(Time_data); } switch(mode) { case(1):{LCD_write_hanzi(3,0,13);alarmhourset();delayms(40); } break; case(2):{LCD_write_hanzi(6,0,13);alarmminuteset();delayms(40); } break; case(3):{LCD_write_hanzi(12,0,13);weekset(); delayms(40);} break; case(4):{LCD_write_hanzi(3,2,13);hourset(); } break; case(5):{LCD_write_hanzi(7,2,13);minuteset();} break; 34 Time_data[5]=(num/10)*0x10+(num%10); while(jian==0) ; } } } 河南机电高等专科学校毕业设计/论文 case(6):{delayms(40);LCD_writ Set1302(chushi); e_hanzi(11,2,13);secondset();} while(1) break; { if(mode==0) case(7):{delayms(60);LCD_writ Get1302(Time_data); /*读取当e_hanzi(2,4,13);yearset(); } 前时间*/ break; LCD_draw_bmp(0,0,alarm,16,16); case(8):{delayms(60);LCD_writ e_hanzi(6,4,13);monthset();} LCD_write_shu(3,0,alarm_h/10)break; ; LCD_write_shu(4,0,alarm_h%10); case(9):{delayms(60);LCD_writ e_hanzi(10,4,13);dayset(); } LCD_write_shu(5,0,10); break; LCD_write_shu(6,0,alarm_m/10); default: break; } LCD_write_shu(7,0,alarm_m%10)} ; void music() LCD_write_hanzi(8,0,12); { LCD_write_hanzi(10,0,0); beep=0; delayms(20); beep=1; } unsigned char code chushi[7]={0x00,0x05,0x23,0x05,0x04,0x04,0x12};/*格式为: 秒 分 时 日 月 星期 年 */ bit flag=1; /*闹钟标志位*/ main() { LCD_init(); //初始化LCD模块 LCD_clear(); //清屏幕 jia=1; jian=1; set=1; Get1302(Time_data); if(Time_data[0]==0x80) 35 LCD_write_hanzi(12,0,Time_data[5]&0x07); LCD_draw_bmp(0,2,clock,16,16); LCD_write_shu(3,2,Time_data[2]/0x10); LCD_write_shu(4,2,Time_data[2]%0x10); LCD_write_hanzi(5,2,10); LCD_write_shu(7,2,Time_data[1]/0x10); LCD_write_shu(8,2,Time_data[1]%0x10); LCD_write_hanzi(9,2,11); LCD_write_shu(11,2,Time_data[0]/0x10); 河南机电高等专科学校毕业设计/论文 LCD_write_shu(12,2,Time_data[0]%0x10); LCD_write_shu(0,4,2); LCD_write_shu(1,4,0); LCD_write_shu(2,4,Time_data[6]/0x10); LCD_write_shu(3,4,Time_data[6]%0x10); LCD_write_hanzi(4,4,8); LCD_write_shu(6,4,Time_data[4]/0x10); LCD_write_shu(7,4,Time_data[4]%0x10); LCD_write_hanzi(8,4,9); LCD_write_shu(10,4,Time_data[3]/0x10); LCD_write_shu(11,4,Time_data[3]%0x10); LCD_write_hanzi(12,4,7); if((mode==0) && (flag==1)) /*闹钟,避免设置时响铃*/ { if(((Time_data[2]/0x10)*10+(Time_data[2]%0x10))==alarm_h) if((((Time_data[1]/0x10)*10)+(Time_data[1]%0x10))==alarm_m) { if((jia==0) (jian==0)) { delayms(10); if((jia==0) (jian==0)) flag=0; } || music(); } } if(flag==0) { if((((Time_data[2]/0x10)*10)+(Time_data[2]%0x10))==alarm_h) if((((Time_data[1]/0x10)*10)+(Time_data[1]%0x10))==(alarm_m+1)) } flag=1; } TimeSet(); } || 36
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务