在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
相关产品推荐
相关产品推荐

