单片机课程设计电子时钟实验可定时调闹钟用LCD显示

合集下载

单片机_电子时钟(LCD显示)课程设计报告

单片机_电子时钟(LCD显示)课程设计报告

课程设计报告课程名称单片机题目电子时钟(LCD显示)学生指导教师年级 2018级专业计算机科学与技术二级学院信息工程学院信息工程学院2020年12 月23 日《单片机》课程设计任务书摘要本设计使用11.0592MHz晶振与单片机AT89C51相连接,以AT89C51芯片为核心,采用LCD1602的并行操作方式显示。

通过使用该单片机,实现将时间显示在LCD1602液晶上,并且按秒实时更新。

AT89C51单片机功耗小,电压可选用4~6V电压供电。

通过板子上的按键可随时调节时钟的时、分,按键设计4个有效按键,分别有开始设置键、设置小时键、设置分钟键、确认设置键盘,通过使用中断定时器进行计时,实现时间显示。

针对LCD液晶显示屏,设置了初始化函数,数据传送函数及指令传送函数,进而实现LCD液晶显示屏显示功能。

在每次的按键按下时,LCD液晶显示屏会随之改变,进而实现功能。

关键词:AT89C51 电子时钟数码管按键目录1 概述 (1)1.1方案设计 (1)1.2设计目的 (1)1.3设计内容 (1)2.硬件设计 (1)2.1 元器件 (1)2.2 硬件 (2)3 软件设计 (3)3.1 主设计流程 (3)3.2 初始化流程图 (3)3.3 时间显示主程序 (5)4 调试结果分析 (6)4.1运行结果 (6)4.2仿真分析 (7)5 总结 (8)参考文献 (9)附录 (10)1 概述1.1方案设计(1)单片机选型选用AT89C51单片机,指令简单,易学易懂,外围电路简单,硬件设计方便,IO 口操作简单,成本低,程序烧写简单,对于设计开发非常实用。

(2)显示方案LCD液晶显示器是一种功耗极低的显示器件,它不仅省电,还能显示文字、曲线、图形等大量的信息,易于彩色化,所以采用LCD显示器来显示时间。

(3)计时方案利用AT89C51内部定时/计数器进行中断定时,配合软件延时实现时分秒的计时。

该方案可以节省硬件成本。

(4)按键设计系统采用独立式按键,共设计了四个按键,分别是“当前时间”、“分钟+”、“小时+”,用来设置校时功能,这样可以使电路更简单。

C51单片机LCD电子时钟课程设计

C51单片机LCD电子时钟课程设计

中南大学《自动化工程训练》设计题目 LCD时钟程序设计指导老师设计者专业班级自动化级班号设计日期2016年9月目录一、设计任务要求分析 (1)1.1设计总体方案及其方案论证 (1)二、组成电路介绍 (1)2.1 复位电路: (1)2.2晶振电路: (1)2.3键盘控制系统设计: (2)2.4闹钟部分: (3)2.5显示电路设计 (3)2.5.1 LCD1602简介 (3)三、软件设计 (4)3.1程序主流程图 (5)3.2初始化流程图 (5)3.3延时中断子程序 (6)3.4时间设置子程序 (7)四、系统测试 (7)4.1 测试方法 (7)4.2 测试结果 (7)4.3 结果分析 (8)五、源程序 (8)一、设计任务要求分析本设计要实现的功能是:实时显示当前的时钟,并且可以设定闹铃,以蜂鸣器鸣响5秒的方式作为闹铃。

1.1设计总体方案及其方案论证按照系统的设计功能所要求的,液晶显示电子时钟原理图如图所示。

液晶显示电子时钟原理图本系统以AT89C51单片机为核心,该单片机可把数据进行处理,从而把数据传输到显示模块LCD1602液晶显示器,实现时间及日期的显示。

以LCD 液晶显示器为显示模块,把单片机传来的数据显示出来,并且显示多样化,还可以对时间和日期进行设置,主要靠按键来实现。

二、组成电路介绍2.1 复位电路:复位电路复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方式。

如图所示:2.2晶振电路:晶振电路如图所示:晶振模块原理图选取原则:电容选取22pF,晶振为12MHz。

1)电源:AT89S51单片机的供电电源是5V的直流电。

2)EA非/Vpp脚:我们没有用外部扩展ROM,因此EA非/Vpp为高电平,即接+5V电源。

2.3键盘控制系统设计:按键需要4个,分别实现为时间调整、时间的加、时间的减、闹钟调整四个功能。

用单片机的4个I/O口接收控制信号,其电路如图所示:按键调时电路通过控制键来控制所要调节的是时、分、还是秒。

单片机课程设计--智能电子钟(LCD显示)

单片机课程设计--智能电子钟(LCD显示)

课程设计课程名称_ 单片机原理与接口技术题目名称多功能数字时钟学生学院_ 材料与能源学院专业班级_ 电子材料及元器件方向学号_ _学生姓名_ ____________ 指导教师_2013 年 1 月16 日广东工业大学课程设计任务书题目名称多功能数字时钟学生学院材料与能源学院专业班级姓名学号一、课程设计的内容用AT89C52单片机制作一个时钟:1.设计并绘制硬件电路图;2.布置元件并焊接好元器件;3.编写程序并将调试好的程序固化到单片机中。

4.增加温度测试功能。

二、课程设计的要求与数据单片机采用STC89C52芯片,时钟芯片采用DALLAS 公司的DS1302,即涓流充电时钟芯片,它内含有一个实时时钟/日历和31 字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM 指示决定采用24 或12 小时格式,DS1302 与单片机之间能简单地采用同步串行的方式进行通信。

同时用选DS18B20 传感器将采集的室内温度显示于LCD上。

按此要求设计硬件和软件以实现这些功能。

三、课程设计应完成的工作1. 完成下载线的制作,为程序下载到单片机芯片中做好准备;2. 完成软件、硬件的设计,并进行硬件的焊接制作,并将调试成功的程序固化到单片机中,最后进行硬件与软件的调试;3.撰写设计说明书。

四、课程设计进程安排摘要随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的液晶显示温度和时钟设计,时间可由键盘调整。

主要用到的芯片有单片机STC89C52.液晶1602LCM模块.时钟芯片DS1302.温度传感器DS18B20等。

关键词:单片机STC89C52,1602LCM模块,DS1302.,DS18B20目录1 系统需求分析 (1)1.1 电子时钟研究的背景和意义 (1)1.2 系统实用功能分析 (1)2 设计要求与方案 (2)2.1 设计要求 (2)2.1.1 基本要求 (2)2.1.2发挥部分 (2)2.2 系统基本方案选择 (2)2.2.1 芯片的选择 (2)2.2.2 显示模块选择方案 (2)2.2.3 时钟信号的选择方案 (3)2.3 电路设计最终方案决定 (3)3 系统的硬件设计与实现 (3)3.1 数字钟电路设计框图 (3)3.2 系统硬件概述 (4)3.3 硬件电路结构的设计 (4)3.3.1 单片机主控制模块的设计 (4)3.3.2 显示模块的设计 (4)3.3.3 LCD原理说明 (5)3.3.4 开关模块说明 (6)4 系统的软件设计 (7)4.1 程序流程框图 (7)4.2 LCD的初始化与及显示程序 (7)5 系统调试 (9)5.1软件调试 (9)5.2硬件调试 (9)参考文献 (10)附录 (11)1 系统需求分析1.1 电子时钟研究的背景和意义20实际末,电子技术获得了飞速的发展。

单片机课程设计电子时钟实验可定时调闹钟用LCD显示

单片机课程设计电子时钟实验可定时调闹钟用LCD显示

单片机实验报告姓名学号时间 2013.1.9实验题目电子数字钟一、实验目的与要求1.电子数字钟必须具有显示年、月、日和显示时、分、秒的功能。

(用LCD显示)。

2.具有按键时间校正功能。

3.具备设定闹钟和定时闹钟功能。

二、实验环境(硬件环境、软件环境)1.硬件环境:单片机开发板一个,计算机一台,单片机主机电源线及与计算机的连接线各一条。

2.软件环境:软件Keil C51和软件Flash Magic。

三、实验电路(P2口输入、P1口输出实验原理图)本次实验主要使用了开发板的4个板块,分别是单片机STC89C52(如图2所示)、矩阵键盘(如图2所示)、1206LCD显示器和蜂鸣器(如图3所示)。

其中单片机芯片通过P0口把总线和矩阵键盘连接;通过P2.2和蜂鸣器间接相连,因为蜂鸣器所在的电路已经连芯片ULN2003,因此用一根杜邦线把P2.2和芯片ULN2003的第一个输入口IN1连起来。

而键盘显示这一块,由于内部已经把键盘显示的电路和单片机芯片连接起来了,所以不需要借助杜邦线了。

图1为实物连线图。

图1 实物连线图图2 单片机机座和矩阵键盘图3 蜂鸣器和1602液晶显示器四、程序流程图主要算法:主函数中先定时中断初始化,利用定时器中断实现走时,调用LCD显示程序和按键处理子函数,再调用显示时间函数显示初始时间值。

同时,在主函数中判断当前的小时和分钟值是否等于闹钟设定的时间,若等于则让蜂鸣器响。

主函数算法的框图如图4所示。

按键处理函数算法:通过键盘扫描函数得到确定哪个键盘按下,得到键盘值,如果键0按下则暂停时钟走时;键1按下则在当前的光标所在的时间单元加1;键2按下则开闹钟;键3按下则实现当前的时间单元左移一位的功能;键4按下则在当前的光标所在的时间单元减1。

时间的年月日算法:通过定时器实现时钟的走时,秒满60,分钟加1;分满60,小时加1;小时满24,日加1;至于每个月的天数根据闰年和非闰年的表格确定当月天数。

基于单片机的电子时钟设计报告(LCD显示)

基于单片机的电子时钟设计报告(LCD显示)

单片机原理及应用课程设计任务书题目:电子时钟(LCD显示)1、设计要求以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间:使用字符型LCD显示器显示当前时间。

显示格式为“时时:分分:秒秒”。

用3个功能键操作来设置当前时间。

功能键K1~K4功能下。

K1—设置小时。

K2—设置分钟。

K3—设置秒。

程序执行后工作指示灯LED发光,表示程序开始执行,LCD显示“23:59:00”,然后开始计时。

2、工作原理本课题难点在于键盘的指令输入,由于每个按键都具有相应的一种功能,程序中有较多的循环结构用以判断按键是否按下,以及判断按键是否抬起,以及LCD显示器的初始化。

3、参考电路硬件设计电路图如下图所示:硬件电路原理图单片机原理及应用课程设计任务书题目:电子时钟(LCD显示)1、设计要求以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间:使用字符型LCD显示器显示当前时间。

显示格式为“时时:分分:秒秒”。

用3个功能键操作来设置当前时间。

功能键K1~K4功能下。

K1—设置小时。

K2—设置分钟。

K3—设置秒。

程序执行后工作指示灯LED发光,表示程序开始执行,LCD显示“23:59:00”,然后开始计时。

2、工作原理本课题难点在于键盘的指令输入,由于每个按键都具有相应的一种功能,程序中有较多的循环结构用以判断按键是否按下,以及判断按键是否抬起,以及LCD显示器的初始化。

3、参考电路硬件设计电路图如下图所示:硬件电路原理图基于AT89C51单片机的电子时钟设计报告一、设计要求与目的1)设计要求以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间。

2)、使用字符型LCD显示器显示当前时间。

显示格式为“时时:分分:秒秒”。

3)、用3个功能键操作来设置当前时间。

4)、熟悉掌握proteus编成软件以及keil软件的使用二、本设计原理本设计以AT89C51单片机为核心,通过时钟程序的编写,并在LCD显示器上显示出来。

单片机--电子时钟(LCD显示)

单片机--电子时钟(LCD显示)

单片机--电子时钟(LCD显示)单片机综合实验报告题目:电子时钟(LCD)显示班级: 0310405班学号: 031040514学生姓名:张金龙指导老师:高林2013年 6 月 17 日一、实验内容:以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间:●使用字符型LCD显示器显示当前时间。

●显示格式为“时时:分分:秒秒”。

●用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。

功能键K1~K4功能如下。

●K1—进入设置现在的时间。

●K2—设置小时。

●K3—设置分钟。

●K4—确认完成设置。

程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00:00”,然后开始计时。

二、实验电路及功能说明1)单片机主控制模块以AT89C51单片机为核心进行一系列控制。

2)时钟显示模块用1602为LCD显示模块,把对应的引脚和最小系统上的引脚相连,连接后用初始化程序对其进行简单的功能测试。

测试成功后即可为实验所用,如图:3)时间调整电路用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。

功能键K1~K4功能如下。

K1—进入设置现在的时间。

K2—设置小时。

K3—设置分钟。

K4—确认完成设置。

如图:三、实验程序流程图:主程序:时钟主程序流程子程序:保护设置计1S (40H )0 (40H )+1(41H )+1 (46H )0 ()恢返N N中 断 服 务 流 程 图(41H )0 (43H )0 (43H )+1(44H )+1 (44H )0(46H )+1(47H )(46H )+1NN(46H )0 (47)+1NN四、实验结果分析实验结果及分析:单片机的晶振可以根据要求设定。

6MHZ为和现实时间显示相同。

实验采用12MHZ晶振采用方式1定时,选取50ms采用20次中断达到一秒,采用查表方式控制LCD显示。

当烧入程序后开始运行,根据初始值设定可以观察到显示的时间,这里为了更明显观察显示数据变化把起始值设为23:59:50 运行后显示,K1为进入现在设置时间,当按下K1后显示,和实验要求相比较,实现了按下K1进入现在时间设置,按下K4确认完成时间设置的功能;不同之处: 当进入时间设置时在按下K1设置小时,再次按下K1是设置分钟。

电子时钟(LCD显示)课程设计说明书

电子时钟(LCD显示)课程设计说明书

目录1. 设计要求 (1)2. 时钟总体设计思路 (1)3. 系统硬件设计 (1)3.1单片机控制系统 (3)3.2 键盘控制系统设计 (3)3.3 显示电路 (4)3.4 硬件原理及说明 (4)3.5 主要性能参数 (5)4. 软件设计 (5)4.1 软件功能 (5)4.2软件设计 (6)4.3 汇编源程序 (5)5. Proteus仿真 (11)6. 课程设计总结 (12)参考文献 (13)1. 设计要求以AT89C51单片机为核心的时钟,在LED 显示器上显示当前的时间: 使用字符型LCD 显示器显示当前时间。

显示格式为“时时:分分:秒秒”。

用4个功能键操作来设置当前时间。

功能键K1~K4功能如下。

K1—设置小时。

K2—设置分钟。

K3—设置秒数。

程序执行后工作指示灯LED 闪动,表示程序开始执行,LED 显示“00:00:00”,然后开始计时。

单片机是一种集成电路芯片,采集超大规模集成电路技术把具有数据处理能力(如算数运算、逻辑运算、数据传送、中断处理)的微型处理器,随机存取数据存储器(RAM )、只读程序存储器(ROM )、输入/输出电路(I/O ),可能还包括定时/计数器、串行通信口(SCI )、显示驱动电路(LCD 或LED 驱动电路)、脉宽调制电路(PWM )、模拟多路转化器及A/D 转化器等电路集成到一片芯片上,构成一个最小而又完善的计算机系统。

这些电路能在软件的控制下准确、迅速、高效的完成程序设计者事先规定的任务。

2. 时钟的总体设计思路按照系统的设计功能要求,本时钟系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。

图一 系统总原理图3. 系统硬件设计3.1 单片机控制系统本次设计时钟电路,采用了ATC89C51单片机芯片控制电路,这种单片机芯片比较简单,并且省去了很多复杂的线路,更容易表达和理解,通过按钮来调节电微型控制器 时钟电路数据显示 按键调时子钟的时、分、秒。

单片机课程设计—带有LCD的定时闹钟

单片机课程设计—带有LCD的定时闹钟

单片机的发展历程
1971年,Intel公司推出4004微处理器, 标志着单片机的诞生
1990年代,ARM公司推出ARM架构,成为现 代智能手机、平板电脑等设备的主流处理器
1976年,Intel公司推出8080微处理器, 成为第一个广泛使用的单片机
2000年代,RISC-V架构出现,成为开 源硬件领域的新宠
判断按键类型:根 据按键的状态,判 断按下的是哪个按 键
执行相应操作:根据按 键类型,执行相应的操 作,如设置闹钟时间、 调整闹钟音量等
更新显示内容:根据 按键操作,更新LCD 显示内容,如显示当 前时间、闹钟时间等
定时器和中断服务程序
定时器:用于定时触发中断服务程序 中断服务程序:用于处理定时器中断 定时器初始化:设置定时器参数,如定时器模式、定时器周期等 中断服务程序编写:编写中断服务程序,处理定时器中断,如更新LCD显示、控制闹钟等
通信设备:如手机、路由 器等
计算机外设:如打印机、 扫描仪等
定时闹钟的设计 思路
设计背景和意义
单片机课程设计:作为单片机课程的一部分,设计定时闹钟可以加深对单片机原理和应用的理解。 实际应用:定时闹钟在日常生活中具有广泛的应用,如提醒、定时等。 技术挑战:设计定时闹钟需要掌握单片机编程、电路设计、LCD显示等技术,具有一定挑战性。 创新性:设计带有LCD的定时闹钟,可以提高产品的用户体验,增加产品的市场竞争力。
功能:接收用 户按键输入, 控制闹钟功能
模块组成:按 键、电阻、电 容、单片机IO

工作原理:通过 按键按下,改变 电阻电容的电平, 从而改变单片机 IO口的电平,实
现按键输入
设计要点:按 键的布局、按 键的响应速度、 按键的防抖处
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

姓名学号时间 2013.1.9实验题目电子数字钟一、实验目的与要求1.电子数字钟必须具有显示年、月、日和显示时、分、秒的功能。

(用LCD显示)。

2.具有按键时间校正功能。

3.具备设定闹钟和定时闹钟功能。

二、实验环境(硬件环境、软件环境)1.硬件环境:单片机开发板一个,计算机一台,单片机主机电源线及与计算机的连接线各一条。

2.软件环境:软件Keil C51和软件Flash Magic。

三、实验电路(P2口输入、P1口输出实验原理图)本次实验主要使用了开发板的4个板块,分别是单片机STC89C52(如图2所示)、矩阵键盘(如图2所示)、1206LCD显示器和蜂鸣器(如图3所示)。

其中单片机芯片通过P0口把总线和矩阵键盘连接;通过P2.2和蜂鸣器间接相连,因为蜂鸣器所在的电路已经连芯片ULN2003,因此用一根杜邦线把P2.2和芯片ULN2003的第一个输入口IN1连起来。

而键盘显示这一块,由于内部已经把键盘显示的电路和单片机芯片连接起来了,所以不需要借助杜邦线了。

图1为实物连线图。

图1 实物连线图图2 单片机机座和矩阵键盘图3 蜂鸣器和1602液晶显示器四、程序流程图主要算法:主函数中先定时中断初始化,利用定时器中断实现走时,调用LCD显示程序和按键处理子函数,再调用显示时间函数显示初始时间值。

同时,在主函数中判断当前的小时和分钟值是否等于闹钟设定的时间,若等于则让蜂鸣器响。

主函数算法的框图如图4所示。

按键处理函数算法:通过键盘扫描函数得到确定哪个键盘按下,得到键盘值,如果键0按下则暂停时钟走时;键1按下则在当前的光标所在的时间单元加1;键2按下则开闹钟;键3按下则实现当前的时间单元左移一位的功能;键4按下则在当前的光标所在的时间单元减1。

时间的年月日算法:通过定时器实现时钟的走时,秒满60,分钟加1;分满60,小时加1;小时满24,日加1;至于每个月的天数根据闰年和非闰年的表格确定当月天数。

图4 主函数算法框图五、程序测试报告:(调试输入数据、结果数据或状态。

)1.输入:源代码1输出结果:(1)电子数字钟必须具有显示年、月、日和显示时、分、秒的功能。

(用LCD显示)(2)具有按键时间校正功能。

(3)具备设定闹钟和定时闹钟功能。

六、体会:(碰到的问题、如何解决、有何体会。

)1.深入了解如何运用高级语言,此次实验运用C语言进行编程,使单片机开发板实现电子时钟的功能,对汇编语言和高级语言在实现单片机功能的特点也加深了认识。

体会到C语言在编程时的灵活性和不用过多考虑硬件的方便。

2.该实验中主要用到几个板块,单片机控制,键盘运用,LCD显示,蜂鸣器。

掌握了键盘的工作方式和扫描的特点,懂得运用C语言进行编程键盘扫描的程序;掌握LCD显示的几种功能指令,尽管LCD显示的程序较多,但是工作原理弄清楚后就清晰很多;掌握如何把硬件和软件联系起来,特别是控制定时闹钟蜂鸣器的程序,由于该片单片机开发板的蜂鸣器是和步进电机等电路连在一起的,所以需要把控制蜂鸣器的连接端口找到,并用指令“sbit BEEP=P2^2”进行定义;对单片机的应用有了更深入的认识和了解。

3.蒋老师在实验过程中一直强调程序的排版格式,让我从细节上更注意排版,收获了一个美观处理文档的习惯。

在实验过程中遇到了调试失败的各种问题,除了得到老师的指导,自己也主动上网搜索发生错误的各种原因,培养了解决问题的能力。

七、源程序代码#include<reg52.h>#include<intrins.h>sbit BEEP=P2^2; //喇叭端口sbit RS = P2^4; //定义端口sbit RW = P2^5;sbit EN = P2^6;bit Al; //闹钟标志位#define DataPort P0#define KeyPort P1#define uint unsigned int#define uchar unsigned charuchar code table[]="0123456789";//转换成液晶显示的字符uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年uint i,j,k;uint n_hour,n_minu; //闹钟时,分uint sec,minu,hour,day,mon; //秒,分,时,日,星期uint count,key;unsigned long int year; //年uchar hs,hg,mis,mig,ss,sg;uchar nhs,nhg,nms,nmg;uchar ms,mg,ds,dg;uchar yq,yb,ys,yg;uchar i_,j_,k_;/*------------------------------------------------mS延时函数,这里使用单片机的晶振为12MHz------------------------------------------------*/void DelayMs(uchar i_){for(j_=i_;j_>0;j_--)for(k_=500;k_>0;k_--)}/*------------------------------------------------判忙函数-----------------------------------------*/bit LCD_Check_Busy(void){DataPort= 0xFF;RS=0;RW=1;EN=0;_nop_();EN=1;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ void LCD_Write_Com(uchar com){RS=0;RW=0;DataPort=com;DelayMs(5);EN=1;DelayMs(5);EN=0;}/*------------------------------------------------写入数据函数------------------------------------------------*/ void LCD_Write_Data(uchar Data){//while(LCD_Check_Busy()); //忙则等待DelayMs(5);RS=1;RW=0;EN=1;DataPort= Data;DelayMs(5);EN=0;}/*------------------------------------------------清屏函数------------------------------------------------*/ void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/ void LCD_Write_String(uchar x,uchar y,uchar *s){if (y == 0){ LCD_Write_Com(0x80 + x); }else{ LCD_Write_Com(0xC0 + x); }while (*s){ LCD_Write_Data( *s); s ++; }}/*------------------------------------------------写入字符函数------------------------------------------------*/void LCD_Write_Char(uchar x,uchar y,uchar Data){if (y == 0){ LCD_Write_Com(0x80 + x); }else{ LCD_Write_Com(0xC0 + x); }LCD_Write_Data( Data);}/*------------------------------------------------初始化函数------------------------------------------------*/void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/*------------------------------------------------按键扫描函数,返回扫描键值------------------------------------------------*/ unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法{unsigned char cord_h,cord_l;//行列值中间变量KeyPort=0x0f; //行线输出全为0cord_h=KeyPort&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{DelayMs(10); //去抖if((KeyPort&0x0f)!=0x0f){cord_h=KeyPort&0x0f; //读入列线值KeyPort=cord_h|0xf0; //输出当前列线值cord_l=KeyPort&0xf0; //读入行线值while((KeyPort&0xf0)!=0xf0);//等待松开并输出return(cord_h+cord_l);//键盘最后组合码值}}return(0xff); //返回该值}/*------------------------------------------------ 按键值处理函数,返回扫键值------------------------------------------------*/ unsigned char KeyPro(void){switch(KeyScan()){case 0x7e:return 0;break;//0 暂停键case 0x7d:return 1;break;//1 加case 0x7b:return 2;break;//2 闹钟case 0x77:return 3;break;//3 左移case 0xbe:return 4;break;//4 减case 0xbd:return 5;break;//5case 0xbb:return 6;break;//6case 0xb7:return 7;break;//7case 0xde:return 8;break;//8case 0xdd:return 9;break;//9case 0xdb:return 10;break;//acase 0xd7:return 11;break;//bcase 0xee:return 12;break;//ccase 0xed:return 13;break;//dcase 0xeb:return 14;break;//ecase 0xe7:return 15;break;//fdefault:return 0xff;break;}}/*------------------------------------------------键盘控制时间函数(0键-暂停键,1键-加1键,2键-开闹钟,3键-左移键,4键-减1键)------------------------------------------------*/void jianpan(){key=KeyPro();if(key!=0xff){if(key==0) //关中断,暂停时钟{EA=~EA;}if((EA==0)&&(Al==0)) //若闹钟关且时间暂停,则可以改动时间{if(key==3) // 左移,i为改动标志位,按顺序改动秒分时日月年{if(i<6){i++;}else{i=0;}}else if((key==1)) //加1,根据i增加对应的数值{switch(i){case 0:if(sec<59){sec++;}else{sec=0;};break;case 1:if(minu<59){minu++;}else{minu=0;};break;case 2:if(hour<23){hour++;}else{hour=0;};break;case 3:if(day<31){day++;}else{day=0;};break;case 4:if(mon<12){mon++;}else{mon=0;};break;case 5:year++;break;}}else if((key==4)) //减1,根据i减少对应的数值{switch(i){case 0:if(sec>0){sec--;}else{sec=60;};break;case 1:if(minu>0){minu--;}else{minu=60;};break;case 2:if(hour>0){hour--;}else{hour=23;};break;case 3:if(day>1){day--;}else{day=31;};break;case 4:if(mon>1){mon--;}else{mon=12;};break;case 5:if(year>0)year--;break;}}}if(key==2) //闹钟开关{Al=~Al;}if(Al==1) //闹钟开,显示闹钟,允许设定闹钟if(key==3) //左移,设定标志位{if(j<1){j++;}else{j=0;}}else if(key==1) //加1,根据l增减设定{switch(j){case 0:if(n_hour<24)n_hour++;break;case 1:if(n_minu<60)n_minu++;break;}} else if(key==4)//减1{switch(j){case 0:if(n_hour>0)n_hour--;break;case 1:if(n_minu>0)n_minu--;break;}}}else if(Al==0){LCD_Write_Char(15,0,' ');LCD_Write_String(10,1," ");}}/*------------------------------------------------时间的年月日算法(考虑闰年和非闰年)------------------------------------------------*/ void time() //计时函数{if(sec==60){sec=0;minu++;if(minu==60){minu=0;hour++;if(hour==24){ hour=0;day++;if(year%4==0&&year%100!=0||year%400==0) //闰年{if(day==table1[mon]+1){day=0;mon++;if(mon==13){mon=0;year++;}}}else //非闰年{if(day==table2[mon]+1){day=0;mon++;if(mon==13){mon=0;year++;}}}}}}}/*------------------------------------------------ 定时器中断控制时钟走动------------------------------------------------*/ void time0_to()interrupt 1{TH0=(65536-49872)/256;TL0=(65536-49872)%256;count++;if(count==20) //中断20次为一秒{count=0;sec++;time();}}/*------------------------------------------------时间显示函数------------------------------------------------*/void DISPLAY(){uchar KeyPro();yq=year/1000;yb=(year/100)%10;ys=(year/10)%10;yg=year%10;hs=hour/10; //时分秒HH.MM.SShg=hour%10;mis=minu/10;mig=minu%10;ss=sec/10;sg=sec%10;ms=mon/10; //月日-星期MM.DD.-W mg=mon%10;ds=day/10;dg=day%10;nhs=n_hour/10; //闹钟定时HH.MM.SS nhg=n_hour%10;nms=n_minu/10;nmg=n_minu%10;//年显示LCD_Write_Char(0,0,table[yq]); LCD_Write_Char(1,0,table[yb]); LCD_Write_Char(2,0,table[ys]);LCD_Write_Char(3,0,table[yg]); LCD_Write_Char(4,0,'-');//月显示LCD_Write_Char(5,0,table[ms]); LCD_Write_Char(6,0,table[mg]); LCD_Write_Char(7,0,'-');//日显示LCD_Write_Char(8,0,table[ds]);LCD_Write_Char(9,0,table[dg]);//时显示LCD_Write_Char(1,1,table[hs]);LCD_Write_Char(2,1,table[hg]);LCD_Write_Char(3,1,':');//分显示LCD_Write_Char(4,1,table[mis]);LCD_Write_Char(5,1,table[mig]);LCD_Write_Char(6,1,':');//秒显示LCD_Write_Char(7,1,table[ss]);LCD_Write_Char(8,1,table[sg]);if(Al==1) //闹钟开,显示闹钟,允许设定闹钟{LCD_Write_Char(15,0,'*');LCD_Write_Char(10,1,table[nhs]);LCD_Write_Char(11,1,table[nhg]);LCD_Write_Char(12,1,':');LCD_Write_Char(13,1,table[nms]);LCD_Write_Char(14,1,table[nmg]);}}/*------------------------------------------------主函数------------------------------------------------*/ void main(void){EA=1; //开中断ET0=1;TR0=1;TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256; //定时器赋初值hour=23;minu=59;sec=49; //赋初值:11点59分49秒n_hour=18;n_minu=10; //闹钟赋初值18点10分year=2014;mon=1;day=1; //年月日赋初值LCD_Init();LCD_Write_Com(0x0F); //光标开,光标闪烁开DelayMs(750); //延时0.75秒LCD_Clear();while(1){jianpan(); //扫描键盘DISPLAY(); //显示时间if((Al==1)&&(n_hour==hour)&&(n_minu==minu)){DelayMs(1);BEEP=!BEEP;}//闹钟响}}。

相关文档
最新文档