1、使用LCD1602作为显示器。2、使用单片机定时器作为时间基准 3、使用独立按键,切换秒表和计时器功能 4、秒表模式下以0.01秒为单位显示变化,一个按键用于开始和停止。5、计时模式进行倒计时,使用组合按键调整计时时间长度,一秒为单位。计时模式下使用一个按键开始和停止计时,即使时间到蜂鸣器叫,使用该按键关闭提醒,重新回到设定的时间长度显示状态。怎么编写程序

时间: 2024-02-16 17:02:38 浏览: 25
以下是基于Arduino平台的程序示例,使用了LCD1602液晶显示屏和常见的4x4矩阵按键模块,你可以根据自己的硬件配置进行适当的修改: ``` #include <LiquidCrystal.h> #define ROWS 4 #define COLS 4 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // 初始化LCD const int buzzer = 6; // 蜂鸣器引脚 const int start_stop_button = 7; // 开始/停止按键引脚 const int mode_button = 8; // 模式切换按键引脚 const int adjust_button = 9; // 时间调整按键引脚 int mode = 0; // 记录当前模式(0为计时模式,1为秒表模式) int state = 0; // 记录开始/停止状态(0为停止,1为运行) unsigned long start_time = 0; // 记录计时开始时间 unsigned long elapsed_time = 0; // 记录经过的时间 unsigned long set_time = 0; // 记录设定的倒计时时间 unsigned long last_adjust_time = 0; // 上次时间调整的时间 int adjust_mode = 0; // 记录当前时间调整的模式(0为小时,1为分钟,2为秒) void setup() { lcd.begin(16, 2); // 初始化LCD pinMode(buzzer, OUTPUT); // 设置蜂鸣器引脚为输出 pinMode(start_stop_button, INPUT_PULLUP); // 设置开始/停止按键为上拉输入 pinMode(mode_button, INPUT_PULLUP); // 设置模式切换按键为上拉输入 pinMode(adjust_button, INPUT_PULLUP); // 设置时间调整按键为上拉输入 attachInterrupt(digitalPinToInterrupt(start_stop_button), start_stop, FALLING); // 绑定开始/停止按键中断 attachInterrupt(digitalPinToInterrupt(mode_button), switch_mode, FALLING); // 绑定模式切换按键中断 attachInterrupt(digitalPinToInterrupt(adjust_button), adjust_time, FALLING); // 绑定时间调整按键中断 } void loop() { lcd.clear(); if (mode == 0) { // 计时模式 lcd.print("Count Down"); lcd.setCursor(0, 1); if (state == 0) { // 停止状态 lcd.print("Set Time:"); lcd.print(format_time(set_time)); } else { // 运行状态 elapsed_time = millis() - start_time; if (elapsed_time >= set_time * 1000) { // 时间到 state = 0; tone(buzzer, 1000, 500); // 发出提示音 } lcd.print("Remaining:"); lcd.print(format_time((set_time * 1000 - elapsed_time) / 1000)); } } else { // 秒表模式 lcd.print("Stop Watch"); lcd.setCursor(0, 1); if (state == 0) { // 停止状态 lcd.print("00:00:00.00"); } else { // 运行状态 lcd.print(format_time(elapsed_time / 10)); } } delay(100); // 刷新速度 } void start_stop() { if (mode == 0) { // 计时模式 if (state == 0) { // 停止状态 state = 1; // 进入运行状态 start_time = millis(); // 记录开始时间 } else { // 运行状态 state = 0; // 进入停止状态 } } else { // 秒表模式 if (state == 0) { // 停止状态 state = 1; // 进入运行状态 start_time = millis() - elapsed_time; // 恢复上次的计时时间 } else { // 运行状态 state = 0; // 进入停止状态 elapsed_time = millis() - start_time; // 记录经过的时间 } } } void switch_mode() { mode = (mode + 1) % 2; // 切换模式 state = 0; // 进入停止状态 elapsed_time = 0; // 清零计时器 set_time = 0; // 清零倒计时时间 } void adjust_time() { if (millis() - last_adjust_time > 500) { // 防止按键抖动 if (mode == 0) { // 计时模式 if (state == 0) { // 停止状态 adjust_mode = (adjust_mode + 1) % 3; // 切换调整模式 } else { // 运行状态 tone(buzzer, 1000, 100); // 发出错误提示音 } } else { // 秒表模式 if (state == 0) { // 停止状态 elapsed_time = 0; // 清零计时器 } else { // 运行状态 tone(buzzer, 1000, 100); // 发出错误提示音 } } last_adjust_time = millis(); // 记录上次调整时间 } } void adjust_value(int delta) { switch (adjust_mode) { case 0: // 调整小时 set_time += delta * 3600; break; case 1: // 调整分钟 set_time += delta * 60; break; case 2: // 调整秒钟 set_time += delta; break; } if (set_time < 0) { // 防止倒计时时间为负 set_time = 0; } } void format_time(unsigned long time) { unsigned long h = time / 3600; unsigned long m = (time % 3600) / 60; unsigned long s = time % 60; unsigned long ms = (time % 1000) / 10; lcd.print(h < 10 ? "0" : ""); lcd.print(h); lcd.print(":"); lcd.print(m < 10 ? "0" : ""); lcd.print(m); lcd.print(":"); lcd.print(s < 10 ? "0" : ""); lcd.print(s); lcd.print("."); lcd.print(ms < 10 ? "0" : ""); lcd.print(ms); } ``` 这是一个简单的程序示例,你可以根据自己的需求进行适当的修改和完善。

相关推荐

最新推荐

recommend-type

STM32单片机驱动LCD1602液晶程序

最近看到网上很多人都在找STM32单片机驱动LCD1602液晶程序,有的人写的比较复杂刚好自己最近也在搞STM32单片机。就花了点时间写出一份仅供参考和学习。单片机IO驱动能力弱这里用的是10K上拉电阻,也可以采用74HC245...
recommend-type

4X4矩阵按键的使用方法

在单片机应用系统中,键盘是人机对话不可缺少的组件之一。在按键比较少时,我们可以一个单片机I/O口接一个按键,但当按键需要很多,I/O资源又比较紧张时,使用矩阵式键盘无疑是最好的选择。
recommend-type

使用STM32的单个普通定时器产生4路不同频率的方波

STM32的普通定时器有四路输出:TIMx_CH1、TIMx_CH2、TIMx_CH3和TIMx_CH4,可以使用输出比较的方法产生不同频率的方波输出,下面介绍简单的方法
recommend-type

用软件延时实现00-59秒单片机计时器

用软件延时实现00-59秒单片机计时器:在AT89S51单片机的P0和P2端口分别接有两个共阴数码管,P0口驱动显示秒时间的十位,而P2口驱动显示秒时间的个位。
recommend-type

基于FPGA的LCD1602动态显示---Verilog实现

FPGA驱动LCD1602,其实就是通过同步状态机模拟单片机驱动LCD1602,由并行模拟单步执行,状态过程就是先初始化LCD1602,然后写地址,最后写入显示数据。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

云原生架构与soa架构区别?

云原生架构和SOA架构是两种不同的架构模式,主要有以下区别: 1. 设计理念不同: 云原生架构的设计理念是“设计为云”,注重应用程序的可移植性、可伸缩性、弹性和高可用性等特点。而SOA架构的设计理念是“面向服务”,注重实现业务逻辑的解耦和复用,提高系统的灵活性和可维护性。 2. 技术实现不同: 云原生架构的实现技术包括Docker、Kubernetes、Service Mesh等,注重容器化、自动化、微服务等技术。而SOA架构的实现技术包括Web Services、消息队列等,注重服务化、异步通信等技术。 3. 应用场景不同: 云原生架构适用于云计算环境下的应用场景,如容器化部署、微服务
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。