You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Cpulator ArmV7模式下如何在七段数码管显示数值12?

在Cpulator ArmV7模式下实现七段数码管显示12

你当前代码的问题在于直接把数值12写入数码管地址——七段数码管不认十进制数值,它需要的是对应每个数字的段码(控制哪些段点亮的编码)。下面是修正后的实现方案:

核心原理

Cpulator中七段数码管的控制寄存器地址为0xff200020,是16位寄存器:

  • 低8位控制右侧数码管
  • 高8位控制左侧数码管

共阴极七段管的数字段码(0-9)如下:

  • 0: 0x3F, 1: 0x06, 2: 0x5B, 3: 0x4F, 4: 0x66
  • 5: 0x6D, 6: 0x7D, 7: 0x07, 8: 0x7F, 9: 0x6F

要显示12,就是左侧显示1(段码0x06)、右侧显示2(段码0x5B),组合后的16位控制值为0x065B(左移8位的0x06加上0x5B)。

修正后的汇编代码

方式一:分步组合段码

.text
.equ sevendisplay, 0xff200020
.global _start
_start:
    ldr r0, =sevendisplay    @ 加载七段数码管基地址
    mov r1, #0x5B            @ 右侧数码管:数字2的段码
    mov r2, #0x06            @ 左侧数码管:数字1的段码
    lsl r2, r2, #8           @ 将左侧段码移到高8位
    orr r1, r1, r2           @ 合并左右两段的控制码
    
    str r1, [r0]             @ 写入数码管寄存器,完成显示

stop:
    mov r7, #1
    swi 0
.end

方式二:直接写入组合后的段码

如果熟悉16位立即数的写法,也可以直接赋值:

.text
.equ sevendisplay, 0xff200020
.global _start
_start:
    ldr r0, =sevendisplay    @ 加载七段数码管基地址
    mov r1, #0x065B          @ 直接写入显示12的组合段码(左1右2)
    str r1, [r0]

stop:
    mov r7, #1
    swi 0
.end

额外说明

  • 如果你的七段数码管是共阳极类型,段码会是共阴极的反码(比如1的段码为0xF9,2为0xA4),但Cpulator默认使用共阴极,所以上面的代码直接可用。
  • 原代码中读取当前值再清零的步骤完全多余,因为我们需要直接覆盖两个数码管的显示,直接写入组合段码即可。

内容的提问来源于stack exchange,提问作者Rakibul Hasan Showrov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:50:02