如何将对应的*值显示为四位 7 段 LED 显示屏最右侧两位数的 2 位十六进制数?

问题描述

如何读取开关组 (p2) 的状态,并在四位 7 段 LED 显示屏的最右边两位数字上以 2 位十六进制数显示相应的 (*) 值?我知道当我显示一个数字时,我需要等待大约 200 条指令,然后显示第二个数字并等待大约 200 条指令。闭合开关在 P2 上产生 0 位,但我想将闭合开关解释为 1。

这是我目前所拥有的:

; Count in binary on the bank of 8 LEDs
MOV A,#0

again:
INC A
CPL A
MOV P1,A
CPL A
JMP again

; Count from 0 to 9 repeatedly and
; display on first digit of the
; quad 7-seg display

MOV R4,#0
MOV DPTR,#0x0070  ; 16-bit register!

loop:
MOV A,R4
MOVC A,@A+DPTR
MOV P1,A
INC R4
CJNE R4,#10,loop
MOV R4,#0
JMP loop

ORG 0x0070 ; Following data will be placed starting at 0x0070

digit_codes:
; Table of digit codes
; for 7-segment display
DB 11000000b ; 0
DB 11111001b ; 1
DB 10100100b ; 2
DB 10110000b ; 3
DB 10011001b ; 4
DB 10010010b ; 5
DB 10000010b ; 6
DB 11111000b ; 7
DB 10000000b ; 8
DB 10010000b ; 9

解决方法

所以这里有多个问题。首先你说这是一个四 7 段显示器。但这还不够信息,您还没有提供原理图。因此,如果您想使用所有四位数字,这意味着 mcu 和显示器之间有 11 或 12 个信号。如果您只想要显示屏上最右边的两位数字,这意味着 mcu 和显示屏之间有 9 或 10 个信号。

7 段通常有一个句点/小数点,因此实际上通常是 8 段,但您只需要其中的 7 个作为数字。然后你的显示器是共阳极还是阴极?您是用每个数字的公共点驱动 LED 高电平并与其他 7 或 8 个下沉,还是有四个公共接地,然后从其他 7 或 8 个引脚驱动 LED?

DB 11000000b ; 0
DB 10000000b ; 8

这对我来说意味着你是在下沉而不是采购,所以你有一个共同的信号来驱动那个数字,然后这些信号会打开 6 或 7 段,具体取决于它是 0 还是 8,以及 msbit我假设是你想要的小数点。

因此,如果您想在显示器的右侧两位数上放置一些东西,那么您可以将最右边的公共端驱动为高位,将其他三个的公共端驱动为低位或将它们浮动(通常通过使这些引脚输入来完成) .然后用表中的值驱动这 8 个。保持该状态一段时间足够快才能看到。然后删除最右边数字的公共或浮动它,然后从表中为第二个数字断言您想要的值,然后驱动第二个数字的公共,闪烁一段时间。

您必须将它们眨眼的时间足够长才能看到,但总体而言,所有数字的眨眼速度都非常快,以至于我们认为它们是同时亮着的(视觉暂留)。

除非您可以在这些最右边的显示器上放置数字,否则您无法继续使用显示器(必须)。例如,尝试从 0 数到 99(从 0 到 9 数数,然后增加十位,然后重复)并将十位放在最右边的显示器上,十位放在第二个。将每个“数字”重复数千次,使其作为数字保持可见(在显示屏上设置 00 表示一千个循环,在每个循环内闪烁右侧和下一段以显示 200 条指令)。

接下来是您对切换状态感兴趣的单独主题。开关被拉高并且开关闭合指示输入引脚接地的情况并不少见。所以按下是 0,未按下是 1。只需将使用 1 的引脚读取的值取反即可(任何与 1 异或的值都会取反)。

00 0
01 1 <- zero is inverted to a one
10 1 
11 0 <- one is inverted to a zero

或者做一个if-then-else:

if pin == 0 then display 1
else             display 0

您可以使用显示屏上的单个段来执行此操作,驱动一个段的公共端,然后根据您看到的内容使用 0 或 1 的模式,您无需闪烁:

drive common high for one or all digits
loop
read input pin port
isolate pin
if pin==0 write DB 11111001b ; 1 to port
else    write 11000000b ; 0 to port
uncondintional jump/branch to  loop

然后按下并松开开关,看看您驾驶的任何路段上的数字是否发生变化。

然后结合从两个实验中获得的知识。裸机是 99% 的阅读和实验。几乎所有裸机编程的工作都是一次性代码,用于学习你正在尝试编程的东西。并且您应该将代码设计为一次性的,而不是试图使一些大尺寸适合所有事情。做单独的学习经历。然后制作第三个程序,结合前两部分需要学习的知识。

这里的另一种体验是开关弹跳,不要使用中断来完成这项任务,几乎从不,如果不是总是从不,将按钮连接到中断,因为这可能无法正常工作。最多你设置一个定时器来中断,然后在定时器中断中采样按钮,而不是在基于引脚的边沿中断中采样。这里的实验是说有一个循环紧密地轮询开关输入并计算状态变化,在某个数字说 20 个状态变化之后然后显示一些东西或改变显示,你应该发现它需要少于 10 个按钮按下,如果更多超过 1 次就可以根据开关弹跳的严重程度获得 20 次状态更改。

对于显示 00 或 01 的所述愿望,然后轮询输入引脚,如果 pin==0 则确定所需的输出,然后我想显示 01,否则显示 00。然后每个数字闪烁一次。

你说的是十六进制,但你只有一张表来覆盖 0-9 幸运的是十六进制 00 与 01 你总是将第二个数字驱动为 0,而较低的数字是 0 或 1,所以你可以用你所拥有的来做到这一点。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...