项目 4:模拟电子日历(40 分)
任务描述
用按键和四位数码管制作电子日历。初始显示"0000",通过按键在显示年份"2026"和显示月日"0131"两种模式间切换,并持续循环。
核心:多位数码管的动态显示与按键触发的状态切换。
所需硬件
- Steamania JoyKit V2(主控制器)
- 4 位数码管显示模块
- 按键模块
核心任务
- 初始化数码管显示"0000"
- 实现按键检测
- 在年份显示模式(2026)和月日显示模式(0131)之间切换
- 持续循环显示
参考方案
程序代码
; 电子日历程序
; 使用 4 位数码管显示年份和月日
; 初始化 - 第 000-002 行
000 C7 0001 0000 ; 启用数码管显示控制
001 10 0000 0000 ; 初始化显示为"0000"
002 0E 0000 0010 ; 跳转到第 010 行的主循环
; 主循环 - 从第 010 行开始
010 04 0001 0020 ; 如果按键按下(R01 > 0),跳转到模式切换
011 11 0030 0000 ; R00 = R30(当前显示模式)
012 04 0000 0018 ; 如果 R00 == 0(年份模式),跳转到第 018 行
013 10 2026 0000 ; 设置显示年份"2026"
014 02 0064 0000 ; 延时 100 毫秒
015 0E 0000 0010 ; 跳转回第 010 行(循环)
018 10 0131 0000 ; 设置显示月日"0131"
019 02 0064 0000 ; 延时 100 毫秒
01A 0E 0000 0010 ; 跳转回第 010 行(循环)
; 模式切换 - 第 020 行
020 11 0030 0000 ; R00 = R30(读取当前模式)
021 04 0000 0028 ; 如果 R00 == 0,跳转到第 028 行(设置为月日模式)
022 10 0000 0030 ; R30 = 0(设置为年份模式)
023 02 01F4 0000 ; 延时 500 毫秒(消抖)
024 0E 0000 0010 ; 跳转回第 010 行
028 10 0001 0030 ; R30 = 1(设置为月日模式)
029 02 01F4 0000 ; 延时 500 毫秒(消抖)
02A 0E 0000 0010 ; 跳转回第 010 行
详细解释
初始化(第 000-002 行)
第 000 行:C7 0001 0000
- 启用数码管显示控制
- 使用 4 位数码管所必需
第 001 行:10 0000 0000
- 初始化显示为"0000"
- 设置初始状态
第 002 行:0E 0000 0010
- 跳转到第 010 行的主循环
主循环(第 010-01A 行)
第 010 行:04 0001 0020
- 条件跳转:如果按键按下(R01 > 0),跳转到模式切换
- 检查是否有按键按下
第 011 行:11 0030 0000
- 复制 R30(显示模式寄存器)到 R00
- R30 = 0 表示年份模式,R30 = 1 表示月日模式
第 012 行:04 0000 0018
- 条件跳转:如果 R00 == 0(年份模式),跳转到第 018 行
- 显示月日而不是年份
第 013 行:10 2026 0000
- 设置显示年份"2026"
- 值 2026 显示在 4 位数码管上
第 014 行:02 0064 0000
- 延时 100 毫秒
- 保持显示稳定性
第 015 行:0E 0000 0010
- 跳转回第 010 行继续循环
第 018 行:10 0131 0000
- 设置显示月日"0131"
- 值 0131 代表 1 月 31 日
第 019 行:02 0064 0000
- 延时 100 毫秒
- 保持显示稳定性
第 01A 行:0E 0000 0010
- 跳转回第 010 行继续循环
模式切换(第 020-02A 行)
第 020 行:11 0030 0000
- 读取 R30 中的当前显示模式
第 021 行:04 0000 0028
- 条件跳转:如果当前模式是 0(年份模式),跳转到设置月日模式
第 022 行:10 0000 0030
- 设置 R30 = 0(切换到年份模式)
第 023 行:02 01F4 0000
- 延时 500 毫秒用于按键消抖
- 防止单次按下触发多次
第 024 行:0E 0000 0010
- 返回主循环
第 028 行:10 0001 0030
- 设置 R30 = 1(切换到月日模式)
第 029 行:02 01F4 0000
- 延时 500 毫秒用于按键消抖
第 02A 行:0E 0000 0010
- 返回主循环
关键概念
1. 数码管控制
4 位数码管可以显示 0000 到 9999 的值。使用指令 0x10 设置显示值。
2. 按键消抖
按键按下时会抖动,导致多次触发。检测到按键后使用 500 毫秒延时确保可靠操作。
3. 状态管理
使用寄存器(R30)存储当前显示模式:
- R30 = 0:年份模式(显示 2026)
- R30 = 1:月日模式(显示 0131)
评估标准
| 标准 | 优秀 (5) | 良好 (4) | 合格 (3) | 需改进 (2) |
|---|---|---|---|---|
| 电路连接 | 所有元件正确连接 | 小错误 | 部分连接错误 | 严重接线问题 |
| 显示功能 | 显示值始终正确 | 小错误 | 显示工作但有问题 | 显示不工作 |
| 按键控制 | 按键可靠切换模式 | 小问题 | 按键控制不稳定 | 按键不工作 |
| 代码质量 | 代码整洁、结构良好 | 代码良好有小问题 | 代码能工作但混乱 | 代码不工作 |
| 消抖处理 | 消抖有效实现 | 小消抖问题 | 消抖部分工作 | 未实现消抖 |
扩展挑战
- 添加日期调整:使用多个按键调整年、月、日值
- 自动循环模式:每 5 秒自动在年份和月日之间循环
- 添加时间显示:扩展到显示小时和分钟
- 闰年逻辑:为闰年实现正确的二月天数
相关文档
- 指令集总结 - 完整指令集概述