基于状态机的多功能时钟的设计
基于vhdl数字闹钟设计说明书

毕业设计(论文)论文题目:基于VHDL的数字闹钟设计所属系部:指导老师:职称:学生姓名:班级、学号:专业:毕业设计(论文)任务书题目:基于VHDL的数字闹钟设计任务与要求:设计一个带闹钟功能的24小时计时器。
完成功能:1.计时功能:每隔1分钟计时1次,并在显示屏上显示当前时间。
2.闹钟功能:如果当前时间与设置的闹钟时间相同,扬声器发出蜂鸣声。
时间:年月日至年月日共周所属系部:学生姓名:学号:专业:指导单位或教研室:指导教师:职称:毕业设计(论文)进度计划表本表作评定学生平时成绩的依据之一。
基于VHDL的数字闹钟设计【摘要】随着EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。
EDA技术就是依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言VHDL为系统逻辑描述手段完成的设计文件,自动地完成逻辑优化和仿真测试,直至实现既定的电子线路系统功能。
本文介绍了基于VHDL硬件描述语言设计的多功能数字闹钟的思路和技巧。
在Quartus 11开发环境中编译和仿真了所设计的程序,并逐一调试验证程序的运行状况。
仿真和验证的结果表明,该设计方法切实可行,该数字闹钟可以实现调时定时闹钟功能具有一定的实际应用性。
关键词:数字闹钟 FPGA VHDL Quartus IIAbstract: With the EDA technology development and expansion of application fields and in-depth, EDA technology in the electronic information, communication, automatic control and computer applications of growing importance. EDA technology is dependent on a powerful computer, the software platform in the EDA tools for the hardware description language VHDL description for the system logic means completed design documents, automatically complete the test logic optimization and simulation, electronic circuit set up to achieve the system functionality. This article describes the VHDL hardware description language based on multi-function digital alarm clock design ideas and techniques. In the Quartus 11 compiler and development environment designed to simulate the process, and one by one to debug verification process operating conditions. Simulation and verification results show that the design method is feasible, digital alarm clock can adjust the time when the alarm clock to play music with some practical application.Key words: Alarm Clock FPGA VHDL Quartus II目录1 选题背景 (6)1.1选题研究内容 (6)1.2课题研究功能课题研究功能 (6)1.3课题相关技术应用 (6)2 FPGA 简介 (8)2.1FPGA概述 (8)2.2FPGA编程原理 (8)2.3FPGA设计流程 (9)3 总体设计思想 (10)3.1基本原理 (10)3.2设计框图 (10)4 设计步骤和调试过程 (11)4.1总体设计电路 (11)4.2模块设计和相应模块程序 (12)4.3仿真及仿真结果分析 (14)4.4实验调试结果 (15)结束语 (16)文献 (17)1 选题背景1.1 选题研究内容设计一个 24 小时的闹钟,该闹钟由显示屏、数字键、TIME 键、ALARM 键、扬声器组成。
毕业设计(论文)-基于单片机多功能电子时钟的设计与仿真(含程序仿真)[管理资料]
![毕业设计(论文)-基于单片机多功能电子时钟的设计与仿真(含程序仿真)[管理资料]](https://img.taocdn.com/s3/m/9ad55f3e0508763230121257.png)
程序仿真等全套设计,联系153893706第1章绪论二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。
第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。
第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。
第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步……我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。
商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。
本设计为软件,硬件相结合的一组设计。
在软件设计过程中,应对硬件部分有相关了解,这样有助于对设计题目的更深了解,有助于软件设计。
基本的要了解一些主要器件的基本功能和作用。
除了采用集成化的时钟芯片外,还有采用MCU的方案,利用AT89系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。
AT89C52是由ATMEL公司推出的一种小型单片机。
95年出现在中国市场。
其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受。
本文介绍了基于AT89C52单片机设计的电子万年历。
选题背景及研究的目的与意义设计的目的电子钟已成为人们日常生活中必不可少的物品,广泛用于个人家庭以及车站码头、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来了极大的方便。
用Verilog语言编写的多功能数字钟

这次的闹钟电路设计和多功能数字钟有一些相似的地方,不同在于整体构思和细
节上要求的差异。
构思根据要求采用的是状态机设计方法。从一个状态进入另一个状态最适合这个
设计了。细节上和数字钟也有很大的差异。中间的控制逻辑有时候需要反馈。前
后都是有联系的,并不是独立存在的。
本次设计基本上完成的所以的要求,但是由于时间紧急,一些细节并不是很完美,
分频器的作用是对 50Mhz 的系统时钟信号进行分频,得到频率为 1hz 的信号,
作为时钟的输入信号。
2
2.控制器和计数器 控制器的作用是,调整小时和分钟的值,并能实现清零功能。计数器的
作用是实现分钟和秒钟满 60 进 1,小时则由 23 跳到 00。当到达 59 分 55 秒的时 候,LED 灯会闪烁来进行报时。
end 2:
begin state<=2; s=1;
end 3:
begin s=0; if(k1==0) //时调整
7
begin
if(nz_h_l==3)
begin
nz_h_l=0;
if(nz_h_h==2)nz_h_h=0;
else nz_h_h=nz_h_h+1;
end
else nz_h_l=nz_h_l+1;
end
else if(k3==0) finish=1;
//设置完成
else if(k4==0) spker_en=1; //停止声响
end
8
4: begin s=0; if(k4==0) begin on_off<=!on_off;state=0;end end
endcase end end endmodule 3.显示器 显示器的作用是将时:分的值在数码管上依次显示出来。从分频器输出的 1Khz 的信号作为数码管的扫描信号。SEL 表示 6 个数码管选择位,它的取值表示八个 数码管,从左至右依次是 111~000。seg 表示七段数码管,它的取值决定特定位 数上显示的数字。
多功能数字钟电路设计课程设计论文

电子技术课程设计报告——多功能数字钟电路设计目录一、任务及要求.......................................................... - 1 -(一)设计要求...................................................... - 1 - (二)设计指标...................................................... - 1 -二、数字钟的构成........................................................ - 1 -三、单元电路的设计...................................................... - 2 -(一)秒脉冲产生电路................................................ - 2 - (二)计数器电路.................................................... - 5 - (三)译码显示电路.................................................. - 7 - (四)校时、校分电路............................................... - 10 - (五)整点报时电路................................................. - 11 - (六)闹钟电路..................................................... - 11 -四、元器件清单......................................................... - 12 -五、总电路图........................................................... - 13 -六、电路仿真........................................................... - 14 -(一)开始状态..................................................... - 14 - (二)校时、校分功能............................................... - 14 - (三)满六十秒向分钟进位状态....................................... - 15 - (四)满六十分向小时进位........................................... - 15 - 七、个人小结........................................................... - 16 -一、任务及要求(一)设计要求(1)利用中规模数字集成器件设计、实现所需电路。
推荐-多功能计时电路的设计数字钟的实验设计 精品

实验1多功能计时电路的设计——数字钟1.1 实验目的1.通过实验掌握十进制加法计数、译码、显示电路的工作过程。
2.通过实验深入掌握电路的分频原理和数字信号的测量方法。
3.熟悉集成电路构成的计数、译码、显示器件的外部功能及其使用方法。
1.2 实验要求1.秒信号发生电路:为计时器提供秒信号2.计时电路:完成0分00秒~9分59秒的计时功能。
3.清零电路:具有开机自动清零功能;在任何时候,按动清零开关,可进行计时器手动清零。
4.译码显示电路:显示计时电路产生的数字信息。
5.系统级联调试:将以上电路进行级联完成计时器的所有功能。
1.3 实验原理及框图图1.1 三位计时器示意图计时电路示意图如图1.1所示,计时电路完成计时功能,并且将计时结果传送至显示电路,进而实现显示功能。
原理框图如图1.2所示,主要由计时电路,秒信号发生电路,清零电路和译码显示电路组成。
计时电路在秒信号的作用下,产生0:00~9:59的循环计时,清零电路控制计时电路的清零端,实现时钟的清零,最终将计时电路的输出送至译码显示电路,实现时钟的显示。
图1.2 数字钟的原理框图1.4 单元电路设计1.秒信号发生电路图1.3 秒信号发生电路秒信号发生电路为计时电路提供驱动信号,电路原理如图1.3所示。
为提供较为精确的秒信号,本设计中振荡电路采用215Hz 的石英晶体管为主体的晶振电路,并作为电路的秒信号源。
由于振荡电路产生的源信号为215Hz ,而秒的基准信号频率为1Hz ,则需要对215Hz 信号进行分频,得到1Hz 信号。
分频器采用CD4060和74LS74来实现,CD4060为14位二进制串行计数器,各管脚功能如表1.1所示,功能表如表1.2所示。
虽然CD4060内部有14级由T 触发器构成的二分频器,但实际输出端只有10个:Q 4~Q 10、Q 12~Q 14。
Q 1~Q 3以及Q 11并不引出。
CP 1̅̅̅̅、CP 0̅̅̅̅̅、CP 0为晶振电路的引出端,需接外部石英晶体。
多功能数字闹钟电路设计实验报告

多功能数字闹钟电路设计实验报告
实验目的:设计一个多功能数字闹钟电路,能够显示时间、设定并响起闹铃。
实验原理:本实验采用数字集成电路实现数字显示和闹铃功能。
数字显示部分采用BCD到七段数码管解码器74LS47和共阴
七段数码管进行实现,闹铃部分采用555定时器集成电路作为发生器,通过驱动蜂鸣器发出声音。
实验仪器:多功能数字闹钟电路实验箱、数字集成电路
74LS47、七段数码管、555定时器集成电路、蜂鸣器、电源、
示波器等。
实验步骤:
1. 按照电路图连接电路。
将74LS47连接到七段数码管,将
555定时器连接到蜂鸣器和电路中相应的电源和地线。
2. 上电并调节电路供电电压。
3. 设定时间。
通过拨动开关和按钮进行时间的设定。
4. 切换闹钟状态。
通过开关切换闹钟的开启和关闭状态。
5. 监测闹钟时间。
借助示波器调整闹钟时间的精度。
6. 监测闹钟声音。
确认蜂鸣器发出的声音符合要求。
实验结果:实验中,我们成功设计并调试出了一个多功能数字闹钟电路。
通过拨动开关和按钮可以设定时间,并且可以通过切换开关来设置闹钟的开启和关闭状态。
实验中监测到的闹钟时间和声音都符合预期要求。
结论:通过本次实验,我们成功设计了一个多功能数字闹钟电路,实现了时间显示和闹铃功能。
实验结果显示该电路的性能良好,具有实用价值。
在实验中我们也学到了关于数字集成电路和定时器集成电路的使用和调试方法。
使用状态机做时钟产生电路-独特却又最为精准(CPU设计中常用方法)

使用状态机做时钟产生电路-独特却又最为精准(CPU设计中常用方法)使用状态机做时钟产生电路-独特却又最为精准(CPU设计中常用方法)介绍一款时钟发生器--独特却又最为精准(CPU设计中常用方法)时钟发生器clkgen 利用外来时钟信号clk 来生成一系列时钟信号clk1、fetch、alu_clk 送往CPU的其他部件。
其中fetch是外来时钟clk 的八分频信号。
利用fetch的上升沿来触发CPU控制器开始执行一条指令,同时fetch信号还将控制地址多路器输出指令地址和数据地址。
clk1信号用作指令寄存器、累加器、状态控制器的时钟信号。
alu_clk 则用于触发算术逻辑运算单元。
module clk_gen (clk,reset,clk1,clk2,clk4,fetch,alu_clk);input clk,reset;output clk1,clk2,clk4,fetch,alu_clk;wire clk,reset;reg clk2,clk4,fetch,alu_clk;reg[7:0] state;parameter S1 = 8'b00000001,S2 = 8'b00000010,S3 = 8'b00000100,S4 = 8'b00001000,S5 = 8'b00010000,S6 = 8'b00100000,S7 = 8'b01000000,S8 = 8'b10000000,idle = 8'b00000000;assign clk1 = ~clk;always @(negedge clk)if(reset)beginclk2 <= 0;clk4 <= 1;fetch <= 0;alu_clk <= 0;state <= idle;endelsebegincase(state)S1:beginclk2 <= ~clk2;alu_clk <= ~alu_clk;state <= S2;endS2:beginclk2 <= ~clk2;clk4 <= ~clk4;alu_clk <= ~alu_clk;state <= S3;endS3:beginclk2 <= ~clk2;state <= S4;endS4:beginclk2 <= ~clk2;clk4 <= ~clk4;fetch <= ~fetch;state <= S5;endS5:beginclk2 <= ~clk2;state <= S6;endS6:beginclk2 <= ~clk2;clk4 <= ~clk4;state <= S7;endS7:beginclk2 <= ~clk2;state <= S8;endS8:beginclk2 <= ~clk2;clk4 <= ~clk4;fetch <= ~fetch;state <= S1;endidle: state <= S1;default: state <= idle;endcaseendendmodule//--------------------------------------------------------------------------------由于在时钟发生器的设计中采用了同步状态机的设计方法,不但使clk_gen模块的源程序可以被各种综合器综合,也使得由其生成的clk1、clk2、clk4、fetch、alu_clk 在跳变时间同步性能上有明显的提高,为整个系统的性能提高打下了良好的基础。
电子综合设计多功能数字钟报告

电子综合设计多功能数字钟报告报告内容如下:一、设计目的和原理多功能数字钟是一种能够显示时间,并具有闹钟、计时、倒计时等功能的电子设备。
本设计的目的是通过FPGA实现一个多功能数字钟的功能,以实现时间的显示和闹钟的设置功能。
二、设计方案和实现1.硬件设计方案:本设计使用FPGA作为主控芯片,使用七段数码管作为显示器,通过与FPGA的IO口连接来实现时间的显示功能。
同时,使用按键作为输入进行功能的选择和设置。
2.硬件连接:将FPGA的IO口连接到七段数码管的控制端,通过IO口输出相应的数字信号来控制数码管的亮灭。
将按键连接到FPGA的IO口,通过IO口输入按键的信号。
此外,还需要连接一个晶振电路来提供时钟信号。
3.软件设计方案:本设计使用VHDL语言进行程序设计,通过状态机来实现多功能数字钟的功能。
具体实现包括时间的显示、闹钟的设置和启动、计时和倒计时功能的实现。
通过按键的输入来切换不同的状态,实现不同功能的切换和设置。
4.软件实现具体步骤:(1)定义状态机的状态,包括时间显示、闹钟设置、计时和倒计时等状态。
(2)在时间显示状态下,通过FPGA的IO口输出相应的数字信号来控制七段数码管的亮灭,实现时间的显示。
(3)在闹钟设置状态下,通过按键的输入来设置闹钟时间,并将设置好的时间保存在寄存器中。
(4)在计时和倒计时状态下,通过按键的输入来实现计时和倒计时功能,并通过七段数码管的显示来实时显示计时和倒计时的时间。
以下为本设计的完整程序代码:```vhdl--时钟频率--定义状态signal state : state_type;--定义时钟、按键和数码管信号signal clk : std_logic;signal key : std_logic_vector(1 downto 0);signal seg : std_logic_vector(6 downto 0);--闹钟时间寄存器signal alarm_hour_reg : std_logic_vector(5 downto 0);signal alarm_min_reg : std_logic_vector(5 downto 0);--计时和倒计时寄存器signal count_up_reg : std_logic_vector(23 downto 0); signal count_down_reg : std_logic_vector(23 downto 0); signal count_down_flag : std_logic := '0';beginclock : processbeginwhile true loopclk <= '0';wait for 10 ns;clk <= '1';wait for 10 ns;end loop;end process;key_scan : process(clk)beginif rising_edge(clk) thenkey <= key_scan_func; -- 按键扫描函数end if;end process;fsm : process(clk, key)beginif rising_edge(clk) thencase state isif key = "10" then -- 第一个按键按下state <= set_alarm;elsif key = "01" then -- 第二个按键按下state <= count_up;end if;when set_alarm =>seg <= set_alarm_func; -- 闹钟设置函数if key = "00" then -- 两个按键同时按下elsif key = "01" then -- 第一个按键按下state <= count_up;end if;when count_up =>seg <= count_up_func; -- 计时函数if key = "00" then -- 两个按键同时按下elsif key = "10" then -- 第二个按键按下state <= count_down;count_down_flag <= '1';end if;when count_down =>seg <= count_down_func; -- 倒计时函数if key = "00" then -- 两个按键同时按下count_down_flag <= '0';elsif key = "01" then -- 第一个按键按下state <= count_up;count_down_flag <= '0';end if;end case;end if;end process;--数码管信号和显示模块的连接display : entity work.seg_displayport mapclk => clk,seg => segend architecture;```四、总结与展望通过FPGA实现多功能数字钟的设计,在硬件和软件的配合下,实现了时间的显示和闹钟的设置功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于状态机的多功能时钟的设计周文敏121035011 电子与通信工程一、实验目的:1.学习常见LCD 驱动程序设计,按键处理等人机对话。
2.学习状态机在监控程序中的应用。
二、实验器材(平台)1、南京师范大学物科院机电控制实验板及其附件(包括一块STC89C52RC单片机和一块1602LCD液晶显示器等);2、装有Keil uVision4单片机开发软平台和STC烧录软件STC_ISP_V483的计算机一台。
三、实验内容1、根据有限状态机的原理和1602液晶显示器以及4X4矩阵键盘的使用方法,在Keil uVision4单片机开发软平台上用C语言编写和调试程序,使该程序能分别实现时钟和闹钟的时、分的调整以及跑表等功能。
2、连接好硬件,利用STC烧录软件STC_ISP_V483下载生成的HEX文件到实验板,在硬件上实现和调试预设的时钟功能。
四、实验电路五、实验原理1、状态机状态机流程图如下所示:图1-1 流程图本时钟一共用到两个按键,R和F。
各个状态的意义:状态0:时钟正常运行;状态1:设置时钟的时;状态2:设置时钟的分;状态3:设置时钟的秒;状态4:进入闹钟设置状态;状态5:设置闹钟的时;状态6:设置闹钟的分;状态7:设置闹钟的秒;各个状态之间的转换关系如图1-1所示。
2、矩阵键盘的构成本设计所用的矩阵键盘如图2-1所示:图2-1 4*4矩阵键盘使用P3口作为数据输入输出口,采用行列反转法来扫描键盘。
采用行列反转法来读取按键,先对行线全部输出为0,然后读入列线值,如果有按键按下,则读入列线值,并输出该列线值,读取行线值,将列线和行线值组合起来返回给主程序判断按下的是什么键。
3、1602液晶显示模块液晶显示器LCD有着显示直观、耗电小、体积小及重量轻等优点,在仪器仪表、家用电器和各类电子装置中得到广泛的应用。
1602可以显示16*2个字符,其基本指令如下:六、实验结果根据图1-1的状态转换关系进行变成,并在硬件上进行实现,具体实现情况由下面的一系列图片来显示:图4-1上电启动,时钟正常开始计时。
图4-2对时间进行设置,图4-2显示的是正在对时针进行设置。
图4-3对闹钟进行设置,图4-3设置的时间为1:06:00。
图4-4当时间运行到1:06:00之后,代表闹铃的P1.1口的LED灯亮起,如图4-5所示。
图4-5图4-6所使用的开发板。
七、总结通过本次设计,我比较深入地了解了通过状态机来进行程序设计的一般方法,并且强化了51单片机编程的语法语句,通过此次的学习,在单片机的开发上我又有了进一步的提高,对单片机的理解也更加深刻。
附录一实验程序://-------------------------------------变量定义------------------------------------------#include "string.h"#include "stdio.h"#include "reg52.h"unsigned char i;//-----LCD16液晶显示控制引脚定义---------sbit E=0xb6; //老板为E=0xb4;sbit RS=0xb7;sfr lcd_dat_port=0x80; //lcd数据口unsigned char lcd_buf[32];//------按键端口定义---------------------sfr key_port=0xa0; //P2口接键盘unsigned char code key_index[16]={0xdb,0xee,0xde,0xbe, //0,1,2,30x7e,0xed,0xdd,0xbd, //4,5,6,70x7d,0xeb,0xbb,0x7b, //8,9,上,下0xe7,0xd7,0xb7,0x77};//左,右,功能,确认unsigned long time_count=0; //时间计数器unsigned long atime_count=0; //闹钟计数器bit ten_ms_flag=0;bit one_s_flag=0;bit half_s_flag=0;unsigned char mode=0; //工作模式变量//mode=0;实时时钟//mode=1;闹钟//mode=2;码表unsigned int sec=0;unsigned int min=0;unsigned int hour=0;unsigned int asec=0;unsigned int amin=12;unsigned int ahour=12;unsigned char state=0; //状态机变量//state=0: 显示实时时钟//state=1:设置小时,秒数置0//state=2: 设置分钟,秒数置0//-----------------------------变量定义结束------------------------------------------------/*----------------- 约延时100us --------------------*/delay(unsigned int dy){unsigned int ii;while(--dy)for(ii=0;ii<22;ii++) ;}//--------------写一个字节到液晶------------------------void lcd_write(bit slr,unsigned char write_dat){RS=slr;lcd_dat_port=write_dat;E=1;delay(2);E=0;}//--------------液晶初始化-----------------------------void ini_lcd(){delay(50);lcd_write(0,0x38);lcd_write(0,0x0F);lcd_write(0,0x06);lcd_write(0,0x01);delay(50);}//-------------------------液晶显示--------------------------void display(unsigned char *P_LCD) //将指针P_LCD所指内容显示{unsigned char ii;lcd_write(0,0x80); //光标复位for(ii=0;ii<16;ii++){lcd_write(1,*P_LCD);P_LCD++;}lcd_write(0,0xc0);for(ii=0;ii<16;ii++){lcd_write(1,*P_LCD);P_LCD++;}}//------定时器T0计10ms,作为最小计时单位--------void Timer0() interrupt 1{TH0=(65536-18400)/256; //22.1184MHz晶振,18432个机器周期约为10毫秒 TL0=(65536-18400)%256;time_count++;if(time_count % 100==0) one_s_flag=1; //100*10ms=1sif(time_count % 50==0) half_s_flag=1; //50*10ms=0.5s}//----------- T0初始化设置,--------------------------//功能: 设置T0定时10msvoid ini_T0(){TMOD=0x01; //T0:定时方式1,16位定时器TH0=(65536-18400)/256; //22.1184MHz晶振,18400个机器周期约为10毫秒 TL0=(65536-18400)%256;EA=1;ET0=1; //开定时器T0中断TR0=1; //计时开始}//-----------显示时间时,闪烁时分、分秒之间的分割点------void second_point_flash(){if (half_s_flag==1 && one_s_flag==1){half_s_flag=0;one_s_flag=0;lcd_buf[21]=':';}else if (half_s_flag==1 && one_s_flag==0){half_s_flag=0;lcd_buf[21]=' ';}}//-----------整形数转换为两位ASCII码-------------------void Int2Char (unsigned char IntNumber,unsigned char *P){if (IntNumber < 100){*P =IntNumber/10+'0';P++;*P= IntNumber%10 +'0';}}//-----------显示即时时间 -----------------------------void display_real_time(){//lcd_write(0,0x0c); //关光标sec=(time_count/100)%60;min=(time_count/100/60)%60;hour=(time_count/100/3600)%24;Int2Char(hour,lcd_buf+16);//时分秒转换成ASCII码,并存入lcd_buf相关单元内 Int2Char(min,lcd_buf+19);Int2Char(sec,lcd_buf+22);display(lcd_buf);if(sec==0&&min==amin&&hour==ahour){ini_lcd();strcpy(lcd_buf,"time is up ");display(lcd_buf);delay(10000); //10msini_lcd();strcpy(lcd_buf,"Real-time Clock 00-00:00 0");display(lcd_buf);delay(10000); //10ms}}void display_alarm_time(){//lcd_write(0,0x0c); //关光标Int2Char(ahour,lcd_buf+16);//时分秒转换成ASCII码,并存入lcd_buf相关单元内 Int2Char(amin,lcd_buf+19);Int2Char(asec,lcd_buf+22);display(lcd_buf);}//-------------- 线路反转法按键子程序 ----------------------unsigned char get_key(){unsigned char key1,key2,ii;key_port=0xf0;if (key_port!=0xf0){key1=key_port;delay(100); //10ms消抖动if(key1==key_port) //延时10ms后键不变{key_port=0x0f; //高低4位0,1反转key2=key_port;key1=key1|key2;for(ii=0;ii<16;ii++){if(key1==key_index[ii]){key_port=0xf0; //等待释放按键while(key_port!=0xf0);delay(100);while(key_port!=0xf0);return(ii);}}return(0xff);}else return(0xff);}else return(0xff);}//------------------移动当前光标 ----------------------void move_cursor(unsigned char position){if(position<16) lcd_write(0,0x80+position); //第一行光标闪烁else if (position<32) lcd_write(0,0x80+0x40+position-16); //第二行光标闪烁}//------------------状态转换---------------------------void state_convert(unsigned key){if(mode==0){if(state==0){if(key==13){state=1; //右箭头键move_cursor(17);}else if(key==11){mode=1;}}else if(state==1){if(key==13){state=2; //右箭头键move_cursor(20);}else if(key==11){min=(time_count/100/60)%60;hour=(time_count/100/3600)%24;if(hour<23) hour++;else hour=0;time_count=hour*3600L*100L+min*60L*100L;display_real_time();move_cursor(17);}}else if(state==2){if(key==13) state=0; //右箭头键else if(key==11)min=(time_count/100/60)%60;hour=(time_count/100/3600)%24;if(min<59) min++;else min=0;time_count=hour*3600L*100L+min*60L*100L;display_real_time();move_cursor(20);}}}else if(mode==1){if(state==0){if(key==13){state=1; //右箭头键move_cursor(17);}if(key==11){mode=0;}}else if(state==1){if(key==13){state=2; //右箭头键move_cursor(20);}else if(key==11){asec=(atime_count/100)%60;amin=(atime_count/100/60)%60;ahour=(atime_count/100/3600)%24;if(ahour<23) ahour++;else ahour=0;atime_count=ahour*3600L*100L+amin*60L*100L; display_alarm_time();move_cursor(17);}else if(state==2){if(key==13) state=0; //右箭头键else if(key==11){asec=(atime_count/100)%60;amin=(atime_count/100/60)%60;ahour=(atime_count/100/3600)%24;if(amin<59) amin++;else amin=0;atime_count=ahour*3600L*100L+amin*60L*100L;display_alarm_time();move_cursor(20);}}}}//----------------------主程序------------------------------ main(){unsigned char key;unsigned char sec,min,hour;ini_lcd();ini_T0();while(1){strcpy(lcd_buf,"Real-time Clock 00-00:00 0");display(lcd_buf);while(mode==0){key=get_key();if(key!=0xFF){state_convert(key);}if(state==0) //状态0需要不断更新显示{second_point_flash();display_real_time();}ini_lcd();strcpy(lcd_buf,"Alarm Clock 00-00:00 0"); display(lcd_buf);while(mode==1){key=get_key();if(key!=0xFF) state_convert(key);if(state==0){second_point_flash();display_alarm_time();}}ini_lcd();}}。