跳到主要内容

项目 4:模拟电子日历(40 分)

任务描述​

用按键和四位数码管制作电子日历。初始显示"0000",通过按键在显示年份"2026"和显示月日"0131"两种模式间切换,并持续循环。

核心:多位数码管的动态显示与按键触发的状态切换。

所需硬件​

  • Steamania JoyKit V2(主控制器)
  • 4 位数码管显示模块
  • 按键模块

核心任务​

  1. 初始化数码管显示"0000"
  2. 实现按键检测
  3. 在年份显示模式(2026)和月日显示模式(0131)之间切换
  4. 持续循环显示

参考方案​

程序代码​

; 电子日历程序
; 使用 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)
电路连接所有元件正确连接小错误部分连接错误严重接线问题
显示功能显示值始终正确小错误显示工作但有问题显示不工作
按键控制按键可靠切换模式小问题按键控制不稳定按键不工作
代码质量代码整洁、结构良好代码良好有小问题代码能工作但混乱代码不工作
消抖处理消抖有效实现小消抖问题消抖部分工作未实现消抖

扩展挑战​

  1. 添加日期调整:使用多个按键调整年、月、日值
  2. 自动循环模式:每 5 秒自动在年份和月日之间循环
  3. 添加时间显示:扩展到显示小时和分钟
  4. 闰年逻辑:为闰年实现正确的二月天数

相关文档​